过期判断与过期时间定义
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。