redis淘汰策略
因为redis是内存数据库,如果内存数据达到最大限定数据,这时再发送数据到redis,那如何限定这些行为;淘汰策略中有个键过期机制,时间到了我们把kv给删除掉,像expire/pexpire命令;kv中的v有个空转时长,每次操作v,都会记录操作v的时间;
对于淘汰策略,我们有两个字段来配置,maxmemory和maxmemory-policy;maxmemory用于限制redis最多可以使用多少内存,通常会设置成操作系统内存的一半;maxmemory-policy用来指定淘汰策略;
redis持久化方式
redis是内存数据库,我们不可能让redis一直运行下去,偶尔会让它重启,或将它部署到其它机器,所以需要将内存数据持久化到磁盘中,方便下一次启动redis时数据可以恢复到内存中;有四种持久化方式,其中有三种持久化方式需要fork进程;
对应redis中扩容源码
rgb持久化方式,是通过快照持久化到磁盘,快照是将内存中的数据直接持久化磁盘中;通过fork进程,子进程当中根据数据编码直接进行落盘;
aof是拿单个数据进行持久化,而rdb是拿所有数据进行持久化,所以如果主进程宕机了,那么rdb丢数据是丢得最多的,所以我们要在可靠性和效率之间做一个平衡,所以就有一种rdb-aof的持久化方式,部分使用rdb持久化,部分使用aof持久化;redis默认是rdb的持久化方式;
高可用
高可用是分布式中的概念, 比如redis宕机后,有个备用节点顶替;这个过程中要有数据同步和主从切换;高可用的程度是由主从切换时间来决定的;
数据同步问题redis提供了主从复制,这个过程中是从往主中拉数据;主从是采用异步复制的方式;
runid用于区分不同的主从节点,环形缓冲区决定了是全量数据同步,还是增量数据同步;
Redis 哨兵模式
哨兵模式是 Redis 可用性的解决方案;它由一个或多个 sentinel实例构成 sentinel 系统;该系统可以监视任意多个主库以及这些主库所属的从库;当主库处于下线状态,自动将该主库所属的某个从库升级为新的主库;
客户端来连接集群时,会首先连接 sentinel,通过 sentinel 来查询主节点的地址,然后再连接主节点进行数据交互。当主节点发生故障时,客户端会重新向 sentinel 索要主库地址,sentinel会将最新的主库地址告诉客户端。通过这样客户端无须重启即可自动完成节点切换;
部署哨兵模式,要部署奇数个哨兵节点,它不存储任何数据,只是用来检测redis节点的状态和选主;
这里client至少要建立两条连接,一条是需要和哨兵节点建立连接监听主从切换的消息,哨兵节点选取了主redis后,会通知client,一条是和主redis建立的连接;通过这种方式解决高可用的问题,由故障转移时间决定高可用性;
cluster集群
依然由主从关系,但这里由多个主节点,通常取奇数个主节点,这些节点之间构成了一个系统;这里有三个可用的用红框框起来的主节点,client连接上来可以往这三个主节点中写入数据,尽量使三个主节点的数据均衡;通过对kv中的key进行hash得到一个值,用这个值对主节点个数即3取余,这样可以把数据均衡的落到三个节点中;为了实现扩缩容分布式一致性hash不能用主节点个数取余,因为我们可能在现在有三个主节点的基础上在加一个主节点变成四个主节点,这里是对kv中的key通过hah得到的值用2^14取余;这里14我们可以想象成数组中有14个槽,每个槽位可以看成虚拟节点,把每个槽位映射到不同节点中,这样可以起到数据均衡的作用,这里每一个槽会对应节点真实的ip地址和端口;