Redis面试复习笔记(二)

一、内存淘汰策略

当内存空间不足的时候,redis会通过删除一些特定的key进行对内存的释放。

1、random,随机删除key

2、TTL,按照过期时间,从最早过期的key开始删除

3、LRU,把最少使用的key进行删除

4、LFU,把使用频率最少的key进行删除

二、AOF文件重写过程

由于使用一段时间之后,AOF可能会存储了大量的指令,这个时候的AOF文件占用的磁盘空间可能会比较大,这个时候redis会对AOF文件进行重写。

过程:

首先,构建一个新的AOF文件,然后通过一个子进程,把redis里面的所有数据写入到新的AOF文件里面,这个时候如果主进程发生了指令操作,会把指令放到缓冲区里面,最后把缓冲区里面的指令也写入到新的AOF文件中,并用新的AOF文件覆盖掉旧的AOF文件。

三、分布式锁

分布式锁在本质上,其实跟线程锁是一样的,都需要满足四个重要的特性:

1、排他性,同一个资源在同一时间只能被获取一次

2、重入性,可以重新获取锁

3、锁的获取和释放

4、锁的失效机制,避免死锁

mysql可以利用唯一索引来实现分布式锁,redis使用setnx指令实现排他性,并且通过expire来实现锁的失效机制,防止死锁,但是在极短情况下可能会出现锁的失效,比如主从切换的时候由于数据不一致,导致锁的key不存在,不过概率很低。

四、redis主从复制原理

有两种复制方式,一种是全量复制,一种是增量复制。

1、全量复制

一般会出现在slave节点初始化的时候,这个时候,slave服务器会向master服务器发送一个sync的命令,master收到命令之后,回执行一次bgsave生成快照,并缓存生成快照时期的数据变更命令,然后发送快照文件到slave服务器,slave服务器丢弃自身的数据,载入快照数据,完成之后,master会把生成快照期间数据变更的指令同步到slave当中,salve收到之后会依次执行。

由于是全部数据的复制,并且redis没有采用数据强一致性的方法,所以会有数据不一致和复制延迟的问题。

2、增量复制

一般出现在master节点发生数据变更的时候,这时master节点会把变更的指令发送到slave节点,slave节点收到指令后会依次执行。master和slave通过维护一个复制偏移量(offset)来实现增量复制。

五、为什么cluster集群中的哈希槽最大值是16384?

cluster集群中,redis会将key通过crc16算法,计算一个整数值之后再用该值和16384求余,最终根据得到的值路由到指定范围的slot节点。那么为什么是16384呢?为什么不是其他值?

一般在系统中,这些特定的阈值都是通过计算和测试得出的合适的值,至于为什么是16384而不是其他值的原因主要有:

1、对于网络通信开销的平衡

redis集群中的每一个节点都会发送心跳消息,而心跳包中会携带节点的完整配置信息,它会以幂等的方式来对配置进行更新,因此每个节点需要维护的配置信息,每个槽的信息占用的位数为1,因此每个节点维护配置信息所占用的空间大小为16384/节点数/8kb

假设有3个节点,每个节点维护的配置信息占用的空间就是2KB。

crc16算法算出来的值是16位的,2的16次方是65536,就是说理论上最大的槽数可以是65536,但是根据上述公式,如果同样节点是3的话,每个节点需要维护的配置信息就是8KB,比使用16384个槽位整整大了4倍,因为心跳包需要每一段时间发送一次的,会对网络带宽造成浪费,但是又没有带来很好的效果。

2、redis cluster集群规模的限制

cluster最多支持扩展1000个节点,因为太多的节点可能会引起一些其他的问题,比如网络拥堵,所以16384个槽位就足够了,这个数量能保证每个master节点都有足够的插槽,不会太多也不会太少,从而保证了redis cluster的稳定性和高性能。

全部评论

相关推荐

点赞 1 评论
分享
牛客网
牛客企业服务