如何实现redis分布式缓存
admin
2023-05-23 18:02:28
0

摘要: 第一:Redis 是什么? Redis是基于内存、可持久化的日志型、Key-Value数据库 高性能存储系统,并提供多种语言的API. 第二:出现背景 数据结构(Data Structure)需求越来越多, 但memcache中没有, 影响开发效率 性能需求, 随着读操作的量的上升需要解决,经历的过程有:  数据库读写分离(M/S)–>数据库使用多个Slave–>增加Cache (memcache)–>转到Redis 解决写的问题:  水平拆分,对表的拆分,将有的用户放在这个表,有的用户放在另外一个表;

第一:Redis 是什么?

Redis是基于内存、可持久化的日志型、Key-Value数据库 高性能存储系统,并提供多种语言的API.

第二:出现背景

  • 数据结构(Data Structure)需求越来越多, 但memcache中没有, 影响开发效率

  • 性能需求, 随着读操作的量的上升需要解决,经历的过程有: 
    数据库读写分离(M/S)–>数据库使用多个Slave–>增加Cache (memcache)–>转到Redis

  • 解决写的问题: 
    水平拆分,对表的拆分,将有的用户放在这个表,有的用户放在另外一个表;

  • 可靠性需求 
    Cache的"雪崩"问题让人纠结 
    Cache面临着快速恢复的挑战

  • 开发成本需求 
    Cache和DB的一致性维护成本越来越高(先清理DB, 再清理缓存, 不行啊, 太慢了!) 
    开发需要跟上不断涌入的产品需求 
    硬件成本最贵的就是数据库层面的机器,基本上比前端的机器要贵几倍,主要是IO密集型,很耗硬件;

  • 维护性复杂 
    一致性维护成本越来越高; 
    BerkeleyDB使用B树,会一直写新的,内部不会有文件重新组织;这样会导致文件越来越大;大的时候需要进行文件归档,归档的操作要定期做; 
    这样,就需要有一定的down time;

基于以上考虑, 选择了Redis

 

第三:Redis 在新浪微博中的应用

Redis简介

1. 支持5种数据结构

支持strings, hashes, lists, sets, sorted sets 
string是很好的存储方式,用来做计数存储。sets用于建立索引库非常棒;

 

2. K-V 存储 vs K-V 缓存

新浪微博目前使用的98%都是持久化的应用,2%的是缓存,用到了600+服务器 
Redis中持久化的应用和非持久化的方式不会差别很大: 
非持久化的为8-9万tps,那么持久化在7-8万tps左右; 
当使用持久化时,需要考虑到持久化和写性能的配比,也就是要考虑redis使用的内存大小和硬盘写的速率的比例计算;

 

3. 社区活跃

Redis目前有3万多行代码, 代码写的精简,有很多巧妙的实现,作者有技术洁癖 
Redis的社区活跃度很高,这是衡量开源软件质量的重要指标,开源软件的初期一般都没有商业技术服务支持,如果没有活跃社区做支撑,一旦发生问题都无处求救;

Redis基本原理

redis持久化(aof) append online file: 
写log(aof), 到一定程度再和内存合并. 追加再追加, 顺序写磁盘, 对性能影响非常小

 

1. 单实例单进程

Redis使用的是单进程,所以在配置时,一个实例只会用到一个CPU; 
在配置时,如果需要让CPU使用率最大化,可以配置Redis实例数对应CPU数, Redis实例数对应端口数(8核Cpu, 8个实例, 8个端口), 以提高并发: 
单机测试时, 单条数据在200字节, 测试的结果为8~9万tps;

2. Replication

过程: 数据写到master–>master存储到slave的rdb中–>slave加载rdb到内存。 
存储点(save point): 当网络中断了, 连上之后, 继续传. 
Master-slave下第一次同步是全传,后面是增量同步;、

 

3. 数据一致性

长期运行后多个结点之间存在不一致的可能性; 
开发两个工具程序: 
1.对于数据量大的数据,会周期性的全量检查; 
2.实时的检查增量数据,是否具有一致性;

对于主库未及时同步从库导致的不一致,称之为延时问题; 
对于一致性要求不是那么严格的场景,我们只需要要保证最终一致性即可; 
对于延时问题,需要根据业务场景特点分析,从应用层面增加策略来解决这个问题; 
例如: 
1.新注册的用户,必须先查询主库; 
2.注册成功之后,需要等待3s之后跳转,后台此时就是在做数据同步。

 

第四:分布式缓存的架构设计

1.架构设计

由于redis是单点,项目中需要使用,必须自己实现分布式。基本架构图如下所示:

 

如何实现redis分布式缓存

 

2.分布式实现

通过key做一致性哈希,实现key对应redis结点的分布。

一致性哈希的实现:

l        hash值计算:通过支持MD5与MurmurHash两种计算方式,默认是采用MurmurHash,高效的hash计算。

l        一致性的实现:通过java的TreeMap来模拟环状结构,实现均匀分布

3.client的选择

对于jedis修改的主要是分区模块的修改,使其支持了跟据BufferKey进行分区,跟据不同的redis结点信息,可以初始化不同的 ShardInfo,同时也修改了JedisPool的底层实现,使其连接pool池支持跟据key,value的构造方法,跟据不同 ShardInfos,创建不同的jedis连接客户端,达到分区的效果,供应用层调用

4.模块的说明

l        脏数据处理模块,处理失败执行的缓存操作。

l        屏蔽监控模块,对于jedis操作的异常监控,当某结点出现异常可控制redis结点的切除等操作。

整个分布式模块通过hornetq,来切除异常redis结点。对于新结点的增加,也可以通过reload方法实现增加。(此模块对于新增结点也可以很方便实现)

对于以上分布式架构的实现满足了项目的需求。另外使用中对于一些比较重要用途的缓存数据可以单独设置一些redis结点,设定特定的优先级。另外对 于缓存接口的设计,也可以跟据需求,实现基本接口与一些特殊逻辑接口。对于cas相关操作,以及一些事物操作可以通过其watch机制来实现。

声明:所有博客服务于分布式框架,作为框架的技术支持及说明,框架面向企业,是大型互联网分布式企业架构,后期会介绍linux上部署高可用集群项目。

愿意了解框架技术或者源码的朋友直接加求求(企鹅):2042849237欢迎大家一起学习研究相关技术
更多详细源码参考来源:
http://×××/technology


相关内容

热门资讯

铠侠与闪迪发布第十代332层Q... IT之家 8 月 4 日消息,铠侠株式会社今天宣布与闪迪公司共同推出下一代四层单元(QLC)3D 闪...
官方通报卫生巾疑现虫卵:对涉事... 8月4日晚,广西桂林市七星区市场监督管理局发布情况通报:4日,网络上关于“购买的卫生巾疑现虫卵”的信...
奖励一颗小行星命名!中国科学家... 中国科学家又有喜讯了。 综合中国气象报社、科技日报消息,当地时间8月3日,在意大利佛罗伦萨举办的第4...
全球最大通信卫星刚上天,休斯为... 卫星互联网商业模式观察 全球最大通信卫星刚上天, 休斯为什么还是被星链逼到破产? 作者 | 老谭 ...
中国版「生物DeepSeek」... 新智元报道 DeepSeek-V4-Flash正式版刚炸翻全球通用大模型圈,中国生命科学版Deep...
汽车回血,AI烧钱,特斯拉迎来... 文|高恒说 特斯拉开始把造车产线让给机器人。 2026年第二季度,特斯拉拆除了弗里蒙特工厂原有的M...
鸿蒙智行承认投诉“竹知了”视频... 针对“竹知了”玩具相关舆情,鸿蒙智行于8月4日晚发布企业声明,介绍了投诉“竹知了”视频相关情况,也表...
抢劫杀人犯死刑改死缓被害人家属... 澎湃新闻记者 熊强云南宣威市乐丰乡1999年“山村小卖部抢劫杀人案”被害人家属申诉迎来新进展:家属徐...
乘客投诉绕路遭出租车司机持铁棍... 8月4日晚,太原市公安局小店分局官方微博通报:7月20日凌晨2时许,我局接到群众报警,小店区体育路许...
中国登山者在巴基斯坦雪崩中遇难... 7月30日,一支10人国际登山队在攀登布洛阿特峰(Broad Peak)时遭遇雪崩失踪。据巴基斯坦高...