目录
定期删除+惰性删除
定期删除是指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版权协议,转载请附上原文出处链接和本声明。