2020年2月10日 作者 zeroheart

redis 过期策略和内存淘汰机制

过期策略

设置过期时间,定期删除,惰性删除
a.每100ms检查部分数据是否过期,是的话删除,不能全盘检查,系统受不了
b.每次获取数据的时候,检查是否过期,过期了不再返回,同时删除

内存淘汰机制

如果需要存储,但是没有空间了,那就要触发内存淘汰机制了

noeviction 内存不足,报错 (默认)
allkeys-lru 移除最少使用的 (推荐)
allkeys-random 随机移除
volatile-lru 设置了过期时间的key中,移除最少使用的
volatile-random 随机移除设置了过期时间的key
volatile-ttl 优先移除快过期的key

新增
volatile-lfu:从已设置过期时间的数据集(server.db[i].expires)中挑选最不经常使用的数据淘汰
allkeys-lfu:当内存不足以容纳新写入数据时,在键空间中,移除最不经常使用的key

LRU的实现

最简单的lru,一个链表实现,新来的在头部,新访问的移到头部,空间不足时,移除尾部元素。

lru-k,一个访问历史的链表,一个lru的链表,先进入访问历史链表,并带有访问次数的标记,达到k次时,进入lru头部,访问后重新排序,淘汰lru的尾部元素。

lru看作是lru-1

2queues 2Q
两个队列,一个是FIFO队列,一个是lru队列。FIFO队列元素是缓存的一部分,查询缓存会从里面找,这是2Q和lru-2的区别。其余比较类似

继承linkedHashMap,重写removeEldestEntry方法,是最简单的一种方式;
@Override
protected boolean removeEldestEntry(java.util.Map.Entry eldest) {
return size() > maxCapacity;
}