6. Redis过期策略和淘汰机制以及手写LRU实现

Redis 过期策略

定期删除 + 惰性删除

定期删除是指 Redis 会在固定的时间随机选取部分key进行过期判断,如果key过期了,那么就会将 key 删除。不全部删除的原因是因为消耗内存过大,导致 Redis 的运行效率变慢

惰性删除 是因为定期删除并不能彻底解决 Redis key 过期删除问题,这样当使用者调用某一个 key 的时候,会对这个 key 的存活时间进行判断,如果已经过期那么就会删除,如果没有过期就能继续使用

定期删除 + 惰性删除存在的问题:

还是会存在定期删除无法删除并且不在调用的key

解决办法:Redis 淘汰机制

Redis 淘汰机制

在redis.conf文件中有一行配置:

# maxmemory-policy volatile-lru

该配置就是配内存淘汰策略的:

当内存不足以容纳新写入数据时

  • noeviction(ɪˈvɪkʃn):新写入操作会报错
  • allkeys-lru:移除最近最少使用的 Key
  • allkeys-random:随机移除某个 Key
  • volatile-lru:在设置了过期时间的键空间中,移除最近最少使用的 Key
  • volatile-random:在设置了过期时间的键空间中,随机移除某个 Key
  • volatile-ttl:在设置了过期时间的键空间中,有更早过期时间的 Key 优先移除

手写 LRU

public class LRUCache extends LinkedHashMap {
    
    private final int CACHE_SIZE;

    // 这里就是传递进来最多能缓存多少数据
    public LRUCache(int cacheSize) {
        super((int) Math.ceil(cacheSize / 0.75) + 1, 0.75f, true); 
        // 这块就是设置一个 HashMap 的初始大小
        // 同时最后一个true指的是让 LinkedHashMap 按照访问顺序来进行排序
        // 最近访问的放在头,最老访问的就在尾
        CACHE_SIZE = cacheSize;
    }

    @Override
    protected boolean removeEldestEntry(Map.Entry eldest) {
        return size() > CACHE_SIZE;
        // 这个意思就是说当 map 中的数据量大于指定的缓存个数的时候
        // 就自动删除最老的数据
    }
}

你可能感兴趣的:(Redis学习笔记)