每日八股day16

每日八股day16

### 本系列帖子为鼠鼠复习八股巩固记忆和个人理解所写,如有错误纯属本人实力不佳,欢迎各位大佬阅读指正 ###

1.Redis 键过期删除三种策?

定时删除:

key设置过期时间时,创建一个定时器,时间一到立即删除。

优点:

内存友好,过期key马上被删,不会浪费内存。

缺点:

cpu不友好,大量key同时过期会产生大量定时器事件,阻塞主线程,影响Redis性能。

惰性删除:

不主动删,等key被访问时,先检查是否过期,过期就删除并返回不存在。

优点:

cpu友好,只有在用到时才处理,不占用额外cpu.

缺点:

内存不友好,大量长期不访问的过期key会一致占内存,浪费内存。

定期删除:

Redis每隔一段时间,随机抽取一部分key检查,删除其中过期的。

优点:

平衡CPU和内存,不会占用太多CPU,也能及时清理过期key。

缺点:

随机抽取+有执行时间限制,不能保证所有过期key都被及时删掉。

2.Redis 内存满后八大淘汰策略分别是什么?

Redis内存使用达到上限之后,一共有八种内存淘汰机制,可分成三类

不淘汰数据:

noeviction,默认策略内存满了之后,直接拒绝写入并返回错误,保证数据不丢失。

设置了过期时间的key:

volatile-lru:淘汰最近最少使用的过期key。

volatile-lfu:淘汰使用频率最低的过期key。

volatile-random:随机淘汰过期key。

volatile-ttl:淘汰剩余存活时间最短、马上要过期的key。

针对所有key:

allkeys-lru:在全部key里淘汰最近最少使用的。

allkeys-lfu:在全部key里淘汰使用频率最低。

allkeys-random:随机淘汰任意key。

3.LRU 底层实现原理、Redis 近似 LRU 怎么做的?

传统LRU是最近最少使用淘汰算法,核心是如果最近被访问过,那么将来被访问的概率也更高,主要实现是哈希表+双向链表。

为什么Redis不用标准LRU:

标准LRU需要额外链表结构,占用内存大,且高并发下频繁移动节点会有性能开销,Redis用的是近似LRU。

近似LRU原理:

每个key自带一个24bit的时间戳,记录最后一次被访问的时间,内存不足淘汰时,随机采用5个key,从中选出lru时间最早的key淘汰,重复执行,直到内存降到阈值一下。

优点:

几乎不额外占用内存。

效率极高,避免链表维护开销。

采样数足够时,效果接近标准LRU。

4.过期键会不会主动占用内存?主从间过期怎么同步?

会,并且在被真正删除前一直占用内存。redis只是给key打上过期标记,并不会立即释放内存,只有当key触发懒性删除、后台定时任务执行定期删除时,才会真正把过期key从内存删除,如果大量过期key长期不被访问,就会持续占用内存。

主从间过期如何同步:

主节点主导删除,从节点不主动删。主库在自身触发惰性删除或定期删除后,会将对应DEL命令同步到从库,从库只负责执行这条命令,从而实现过期键的同步删除。

Redis 3.2之后,从库读取时如果发现key已经过期,会直接返回空,假装key不存在,但不会执行物理删除,避免主从删除时序不一致,保证最终数据一致。