Redis源码阅读
1.掌握Redis内部架构,数据结构由小到大的依赖关系。
2.了解不止5种数据结构(string、hash、list、set、sortSet)还有bitmap、hyperLogLog、stream这三种数据结构。
3.Redis序列化有redisDB和AOF两种方式。可以一起使用,在短时间内重启可以不需要全量同步。
4.Redis包含多个DB,使用select切换。
1.redis网络模块
网络模块的工作内容:接收TCP连接,然后将请求转换成读或者写的命令,执行命令,返回结果。
技术点:
a.接收Tcp链接,使用socket库操作简便。




b.多个请求,使用单线程,多路复用模式(evport、poll、epoll、select)避免阻塞。
c.将请求生成文件事件,结果生成结果事件,处理过程也是独立事件。使用aeEventLoop来循环处理。

有[文件事件、时间事件、处理事件],还有setafterSleepProc等回调函数。其实事件也是回调函数。
2.cluster模块:
cluster模块内容:单机性能瓶颈,容灾性差等原因,急需将单机版redis设计成支持集群部署模式的应用。cluster目前支持三种模式:
主从模式:
优点:
1、解决数据备份问题
2、做到读写分离,提高服务器性能
缺点:
1、每个客户端连接redis实例的时候都是指定了ip和端口号的,如果所连接的redis实例因为故障下线了,而主从模式也没有提供一定的手段通知客户端另外可连接的客户端地址,因而需要手动更改客户端配置重新连接
2、主从模式下,如果主节点由于故障下线了,那么从节点因为没有主节点而同步中断,因而需要人工进行故障转移工作
3、无法实现动态扩容
哨兵模式:antirez从2.8版本添加了哨兵模式,哨兵模式支持多个节点,然后内部使用gossip协议,曾经也用过raft协议。
优点
1、Master 状态监测
2、如果Master 异常,则会进行Master-slave 转换,将其中一个Slave作为Master,将之前的Master作为Slave
3、Master-Slave切换后,master_redis.conf、slave_redis.conf和sentinel.conf的内容都会发生改变,即master_redis.conf中会多一行slaveof的配置,sentinel.conf的监控目标会随之调换
缺点:
1、如果是从节点下线了,sentinel是不会对其进行故障转移的,连接从节点的客户端也无法获取到新的可用从节点
2、无法实现动态扩容
集群模式:redis 3.0版本添加了集群模式,直接使用gossip协议。
优点:
1、有效的解决了redis在分布式方面的需求
2、遇到单机内存,并发和流量瓶颈等问题时,可采用Cluster方案达到负载均衡的目的
3、可实现动态扩容
4、P2P模式,无中心化
5、通过Gossip协议同步节点信息
6、自动故障转移、Slot迁移中数据可用
缺点:
1、架构比较新,最佳实践较少
2、为了性能提升,客户端需要缓存路由表信息
3、节点发现、reshard操作不够自动化
cluster总结:
主从复制和哨兵模式这两个集群模式由于不能横向动态扩容 ,而且主节点之间(有多个主节点的情况)数据完全一样,导致了主节点的容量成了整个集群的瓶颈,如果想扩展集群容量,必须扩展主节点的容量。由于以上的问题,redis在3.0开始Cluster集群模式,这个模式在主节点之间数据是不一样的,数据也可以根据需求自动转向其他节点。这样就可以实现横向动态扩容,新增加的主从节点,用于存储新的数据则可,对以前的节点的数据不会有任何影响。再者说,配置也很简单,这才是我们所需要的集群模式。
redis源码阅读
redis集群
redis集群扩容
redis gossip源码
gossip协议
Redis Cluster 的通信流程