Redis缓存过期失效策略

目录

定期删除+惰性删除

内存淘汰机制


定期删除+惰性删除

定期删除是指Redis默认每隔100ms就随机抽取一些设置了过期时间的key,检查其是否过期,如果过期就删除。假设Redis里放了10w个key,都设置了过期时间,每隔几百毫秒,检查一次10w个key,cpu负载会很高的,影响性能,所以随机抽取。定期删除可能会导致很多过期key到了时间并没有被删除掉。就走惰性删除,就是在使用的时候获取某个key时,检查一下设置了过期时间的key是否过期,如果过期就删除,没过期就返回数据。

如果定期删除漏掉了很多过期key,也没走惰性删除,大量过期key堆积在内存里,导致Redis内存耗尽,怎么办,用内存淘汰机制。

内存淘汰机制

Redis内存淘汰机制有以下几个:

noeviction: 当内存不足以容纳新写入数据时,新写入操作会报错。

allkeys-lru:当内存不足以容纳新写入数据时,移除最近最少使用的key,这个比较常用。

allkeys-random:当内存不足以容纳新写入数据时,随机移除某个key。

volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间键空间中,移除最近最少使用的key。

volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。

volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,更早过期时间的key优先移除。

LRU算法

LRU就是Least Recently Used的缩写,最近最少使用。最常读取的,读取次数最多的就是热点数据,利用好LRU算法,能够提高对热点数据的缓存效率和内存使用率。lru算法:

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

    /**
     * 传递进来最多能缓存多少数据
     *
     * @param capacity 缓存大小
     */
    public LRUCache(int capacity) {
        super(capacity, 0.75f, true);
        this.capacity = capacity;
    }

    /**
     * 如果map中的数据量大于设定的最大容量,返回true,再新加入对象时删除最老的数据
     *
     * @param eldest 最老的数据项
     * @return true则移除最老的数据
     */
    @Override
    protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
        // 当 map中的数据量大于指定的缓存个数的时候,自动移除最老的数据
        return size() > capacity;
    }
}

版权声明:本文为xing_jian1原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。