Redis(4.x+)过期键删除策略和缓存淘汰策略

过期判断与过期时间定义

redis根据UNIX 时间戳是否大于key的过期时间来判断是否过期。

过期键删除策略

1、被动删除:每次从键空获取key时,都检查取得的键是否过期,如果过期的话,就删除该键。

缺点是会造成的问题就是有些key永远没有访问的情况下,永远不会删除,占用了内存空间
2、主动删除(定时删除):默认策略,每100ms执行一次检查(reids.conf频率配置:hz:10),执行过程如下:

1)随机抽取 20个key,进行相关的过期检测;

2)删除所有已过期的key;

3)如果有多余25%的key过期,重复步骤1,否则遍历下一个db;。

Redis缓存淘汰策略算法

注意redis缓存淘汰与删除是两码事,删除是针对过期的key的删除策略,回收淘汰是针对内存空间不足的情况下,如何自主放弃一些数据。

Redis已用内存超过maxmemory限定时,触发主动清理策略

maxmemory设置方式

maxmemory 1024mb;
maxmemory-policy allkeys-lru

有以下策略可用:

1、noeviction:当到达内存限制时返回错误。当客户端尝试执行命令时会导致更多内存占用(大多数写命令,除了DEL和一些例外)。

2、allkeys-lru:回收最近最少使用(LRU)的键,按使用时间排序,回收最早的键

3、volatile-lru:回收最少使用(LRU)的键,但是只回收有设置过期的键,为新数据腾出空间。

4、allkeys-random:回收随机的键,为新数据腾出空间。

5、volatile-random:回收随机的键,但是只回收有设置过期的键,为新数据腾出空间。

6、volatile-ttl:回收有设置过期的键,尝试先回收离TTL最短时间的键,为新数据腾出空间。

4.x之后支持LFU算法,LFU一共有两种策略:

7、volatile-lfu:在设置了过期时间的key中淘汰使用频率最小的key。

8、allkeys-lfu:在所有的key中淘汰使用频率最小的key。

另外,Redis的LRU与标准的LRU实现并不完全相同,LRU会准确的淘汰列队队头部的元素,但是Redis中没有队列,只是随机选择一部分key值做lru规则判断,性能更佳。

淘汰策略选择的一些原则和经验:

1、如果数据呈现幂律分布,也就是一部分数据访问次数多,一部分数据访问次数少,则使用allkeys-lru。

2、如果数据被访问概率均匀分布,则使用allkeys-random。

3、volatile-ttl,如果设置有ttl值。

4、如果key没有设置过期时间,设置volatile策略没有意义,应该设置allkeys。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值