Redis 过期策略
- 定期删除+惰性删除
- 定期删除:指的是 redis 默认是每隔 100ms 就随机抽取一些设置了过期时间的 key,检查其是否过期,如果过期就删除
- 惰性删除:获取 key 的时候,如果此时 key 已经过期,就删除,不会返回任何东西
Redis 内存淘汰机制
- noeviction: 当内存不足以容纳新写入数据时,新写入操作会报错(默认使用的淘汰机制)
- allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 key(最常用的)。
- allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个 key
- volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的 key(这个一般不太合适)。
- volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个 key。
- volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的 key 优先移除。
Redis 内存淘汰机制修改
- 通过配置文件修改,需要重启Redis实例
- 系统运行时修改
LRU(Least Recently Used)算法
- 如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小。也就是说,当限定的空间已存满数据时,应当把最久没有被访问到的数据淘汰
public class LRUDemo<K,V> extends LinkedHashMap<K,V> {
// 容量
private final int size;
public LRUDemo(int size) {
// true true 表示让 linkedHashMap 按照访问顺序来进行排序,就把当前操作的元素放到链表的第一位
super((int) Math.ceil(size / 0.75) + 1, 0.75f, true);
this.size = size;
}
@Override
protected boolean removeEldestEntry(Map.Entry eldest) {
// 当 map中的数据量大于指定的缓存个数的时候,就自动删除最老的数据。
return size() > size;
}
}