Redis删除策略及内存淘汰机制

问题场景:某些key设置了过期时间为什么到时间了内存占用没有少

原因:redis的删除策略是 定期删除 + 惰性删除

定期删除:redis默认每隔100ms就随机抽取一部分设置了过期时间的key进行检查,如果过期就删除。并不是遍历所有的key,只是取一部分,否则会造成性能问题。

惰性删除:在获取某个key的时候进行检查,如果过期就删除。

两种手段结合

问题场景,如果定期删除错过了一些key,同时又没有主动获取某些key,内存会耗尽,怎么解决?

通过redis的内存淘汰制

1)noeviction:当内存不足以容纳新写入数据时,新写入操作会报错
2)allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key(这个是最常用的),Least Recently Used
3)allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key,这个一般没人用吧,为啥要随机,肯定是把最近最少使用的key给干掉啊
4)volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key(这个一般不太合适)
5)volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key
6)volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除

手写LRU算法:

public class LRUCache<K, V> extends LinkedHashMap<K, V> {
    
private final int CACHE_SIZE;

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

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

}
发布了343 篇原创文章 · 获赞 24 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/lbh199466/article/details/104732487