• UID19167
  • 登录2017-09-08
  • 粉丝0
  • 关注0
  • 发帖44
  • 主页
  • 金币122枚
newlifepapa 发布于2017-07-15 10:37
1/141

用于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是单点,项目中需要使用,必须自己实现分布式。基本架构图如下所示:



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

0人打赏
  • UID80
  • 登录2017-09-22
  • 粉丝63
  • 关注21
  • 发帖1124
  • 主页
  • 金币6439枚
社区居民
忠实会员
原创写手
潇潇宇 发布于2017-07-16 09:21
沙发F
您需要登录后才可以回帖
发表回复
极贡献
技术问答
专题荟萃
程序人生
视觉设计
Android开发
iOS开发
编程语言
前端开发
后端开发
服务器架构
软件测试
运维方案
创业路上



最热文章墙

  • 75118/371   【精品推荐】200多种Android动画效果的强悍框架,太全了,不看这个,再有动画的问题,不理你了^@^

  • 43154/191   情人节福利,程序员表白的正确姿势:改几行代码就变成自己的表白了

  • 43021/0   Python爬虫:常用浏览器的useragent

  • 39310/259   【精品推荐】Android版产品级的音乐播放器源码,功能太强大了,最好的产品原型有木有?

  • 37363/145   省时省力的Android组件群来了,非常棒的原型参考

  • 28798/2   超全!整理常用的iOS第三方资源

  • 28620/142   2016抢红包软件及源码

  • 28427/71   原创表白APP,以程序员的姿势备战新年后的7夕,持续完善中!

  • 22836/158   Android版类似UC浏览器:非常赞,产品级的源码

  • 22376/30   麻省理工的一帮疯子,真的实现了随意操控万物!(绝对黑科技)

  • 22015/25   Android工程师面试题大全

  • 21935/27   2016程序员跳槽全攻略

  • 21569/9   GitHub上排名前50的iOS项目:总有一款你用得着

  • 20522/20   码魂:程序员的牛B漫画

  • 18635/10   2016年最全的Android面试考题+答案 精编版

  • 18378/3   吐槽那些程序员的搞笑牛逼注释

  • 18242/42   一个绚丽的loading动效分析与实现!

  • 18241/85   Android小而全的博客源码:非常适合全面掌握开发技巧

  • 18200/73   【持续更新中】Android福利贴(二):资料源码大放送

  • 17311/1   iOS 动画总结

  • 17025/45   惊艳的App引导页:背景图片切换加各个页面动画效果

  • 16657/81   仿京东商城客户端Android最新版,不错的原型和学习资料

  • 16598/23   个人收集的Android 各类功能源代码

  • 16438/104   Android带弹幕的视频播放器源码,来自大名鼎鼎的Bilibili弹幕网站

  • 16118/10   女程序员的梦,众网友的神回复

  • 16098/5   新一代Android渠道打包工具:1000个渠道包只需要5秒

  • 15956/21   Android福利第三波【Android电子书】

  • 15846/17   用JavaScript 来开发iOS和Android 原生应用:React Native开源框架中文版来啦

  • 15838/11   年会上现场review代码是怎么样的体验!

  • 15827/53   基于瀑布流的美女图片浏览App,有注释的源代码

  • 15602/80   【精品推荐】类似360安全卫士安Android源码:非常赞的产品原型

  • 15571/23   珍藏多年的素材,灵感搜寻网站

  • 15383/0   iOS中文版资源库,非常全

  • 14828/18   65条最常用正则表达式,你要的都在这里了

  • 14410/15   基于Android支付宝支付设计和开发方案

  • 13874/17   什么是真正的黑客:收获12200+Stars,人气远超微软开源VS

  • 13755/11   有木有这样一张酷图帮你集齐所有git命令超实用

  • 13399/46   在线音乐播放器完整版(商用级的源码):非常赞,可听免费高品质专辑

  • 13327/0   GitHub iOS 库和框架Top100 

  • 13215/7   一张图搞定iOS学习路线,非常全面

  • 13189/7   用程序员的姿势抢过年的火车票

  • 12862/61   【技巧一】搭配Android Studio,如何实现App远程真机debug?

  • 12821/10   成为Java顶尖程序员 ,看这11本书就够了

  • 12725/10   微信支付终于成功了(安卓,iOS),在此分享

  • 12641/18   一张图搞定Android学习路线,非常全面

  • 12361/29   【持续更新中】Android福利贴(一):资料源码

  • 12336/3   基于Node.js的强大爬虫,能直接发布抓取的文章哦

  • 12000/4   46 个非常有用的 PHP 代码片段

  • 11575/3   即时通信第三方库

  • 11089/8   流媒体视频直播方案

  • 11018/18   八个最优秀的Android Studio插件

  • 10930/9   B站建开源工作组:APP想支持炫酷弹幕的看过来

  • 10773/9   烧了5亿美金,这家神秘的公司即将颠覆人类未来!

  • 10637/2   【精品推荐】高质量PHP代码的50个实用技巧:非常值得收藏

  • 10558/10   中国黑客的隐秘江湖:攻守对立,顶尖高手月入千万美元

  • 9930/6   开箱即用!Android四款系统架构工具

  • 9763/10   十大技巧快速提升Android应用开发性能

  • 9701/3   10款GitHub上最火爆的国产开源项目——可以媲美西半球

  • 9585/3   一张图看清Linux 内核运行原理

  • 9548/1   Android性能优化视频,文档以及工具

  • 返回顶部