开源软件之Redis架构分析_第1页
开源软件之Redis架构分析_第2页
开源软件之Redis架构分析_第3页
开源软件之Redis架构分析_第4页
开源软件之Redis架构分析_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Redis架构分析Redis架构分析of412Redis架构Redis架构分析of413Redis架构Redis架构分析of4141、Redis数据结构1、数据结构总览Redis架构分析of4151、Redis数据结构1.1、全局Hash表Redis架构分析of4161、Redis数据结构1.2、简单动态字符串用于表示key,value是字符串的场景Redis架构分析of4171、Redis数据结构1.3、数组redis整数数组比较简单,就是等长的数组。如果数组元素是8字节,而有10个元素,但每个元素实际存储内容为1字节。那此时空间整体会浪费70字节。数组有个优势是内存比较紧贴,能够利用好局部性原理,从而使用cpu缓存行加速访问速度。但如果数组是随机访问,则无法利用cpu缓存行了,会有一定的影响。Redis架构分析of4181、Redis数据结构1.4、Hash表hash表结构也比较简单。和java的hash是差不多的,都会有一个entry数组,每个entry会有key,value。查询&put&删除操作时都先将keyhash到具体的数组元素位置,然后如果存在冲突再遍历链表进行查询。hash表当元素个数没有超过:hash-max-entries及单个元素大小没有超过hash-max-value时会采用压缩链表。Redis架构分析of4191、Redis数据结构1.5、压缩链表压缩链表就是为了避免不定长的元素造成的空间浪费。整体从原理上就是有一个链表总长度,尾地址偏移量,元素个数,以及链表结束位zlen。netty解法粘包问题时,也有这种元素长度的解决方案。从结构上看,要查找尾结点时是O(1)的查询耗时。如果要查找数组中第4个元素,假设总共10个元素。那么需要从头0开始找,O(5)查询次数。hash表当元素较小时会以zipList存储,可以用:hash-max-ziplist-entries来控制,小于hash-max-ziplist-entries则以zipList存储。zipList当在元素前插入新的元素,会导致插入位置后面的n个元素内存的重分配。这个是因为每个元素保存了前一个元素的大小。所以当元素较多时,插入操作性能就会变得很差,而由于redis是单线程执行命令模型所以查询也会阻塞。Redis架构分析of41101、Redis数据结构1.5、压缩链表ZipList数据结构Redis架构分析of41111、Redis数据结构1.6、跳跃表利用多级索引加速元素查找,跳跃表简单。跳表的插入使用随机性决定是否需要在上n层加入该元素Redis架构分析of41122、Redis

IO模型redis网络IO及处理命令是单线程的,但后台会有相应的清理过期key线程,主从同步相关线程。Redis架构分析of41132、Redis

IO模型处理流程Redis架构分析of41143、Redis存储AppendOnlyFileredis存储持久化会采用aof来进行。aof文件就是记录的当前执行的命令(对应mysql复制的语句级别)。整体执行的顺序是先执行内存的更新,再执行aof日志写入。这样做原因一方面是因为redis日志写入是不做命令检查,如果日志写入在前可能就会写入了一个错误的指令然后后面执行的时候挂了。另外一方面先写内存再写日志能将整体redis的架构流程保持一致,因为持久化会有不同的策略:同步写磁盘,每秒写磁盘,以操作系统为准。内存在前整体策略流程上能保持一致。3.1、aofRedis架构分析of41153、Redis存储当然先写内存无论哪种策略极端情况也会出现数据丢失,当然redis本身定位大多客户是不用于存储。而是性能优先。aof过大会会由后台线程进行重写,重写的大致流程:1.fork子线程,此时redis实例的内存数据与子线程共享。这个过程会阻塞redis服务客户操作采用的是写时复制,在fork的时候拷贝了主线程的页表到子线程。数据还是共享的。2.启动重写线程3.1、aofRedis架构分析of41163、Redis存储3.期间新的命令双写:以前的aof日志,重写日志。此时主线程会为要操作的key申请内存空间,所以这里也是阻塞的。这里需要注意的是操作系统如果开启了:HugePage,那么这个阻塞的风险会更大。4.重写线程完成重写任务后,替换原先的aof日志。这步会阻塞主线程。3.1、aofRedis架构分析of41173、Redis存储aof刷盘3种机制3.1、aofRedis架构分析of41183、Redis存储RedisDataBaserdb主要是解决aof恢复慢,aof记录的是语句。rdb相当于归档了。缺点:rdb整个流程中也涉及fork子进程,所以也会有阻塞。并且相应的rdb的快照不能太频繁(会导致频繁fork子进程及写磁盘文件从而引起阻塞)。redis4.0采用混合的方式:rdb用于归档,aof用于记录变更日志。这个混合思路可以用到其它场景。3.2、rdbRedis架构分析of41193、Redis存储3.2、rdbRedis架构分析of41204、Redis集群如果涉及到多个从结点,那么就需要主->从->从,这种集群结构。主从同步会在主建一个replicationbuffer。主从间全量的同步命令指令都是通过这个会buffer走。replicationbuffer是每个从结点都会有一个,独享。下面的repl-backlog-buffer是只有一个,用于增量同步。当主从断开后,此时主会将后续的命令写到这个repl-backlog-buffer。repl-backlog-buffer是一个循环队列,分别有主的写指针,从的读指针。当从再次连接上来时会带上master实例id+当前relica-back-buffer的读指针,主会判断当前数据是否被覆盖(可以用从读指针>主写指针或主写和从读指针相等但不是指向空)。4.1、主从复制Redis架构分析of41214、Redis集群主从同步的relicabuffer如果超过out-buffer-size这个值,redis主会将这个从的连接断掉,然后后面从再启启来也会再次内存飙升再次断开。4.1、主从复制Redis架构分析of41224、Redis集群哨兵模式4.2、集群模式Redis架构分析of41234、Redis集群Cluster切片模式切片模式是将原本的数据水平切片分配到多个实例上,3.0之前有基于proxy代理的,如twemProxy。基于代理proxy

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论