Redis 缓存淘汰机制
作者:bin关于LRU算法,这里有一个java实现方式使用LinkedHashMap的accessOrder实现LRU算法
redis我们设置key默认是可以不设置缓存时间的,那么如果大量key堆积在内存中,导致内存耗尽,redis就会走内存淘汰机制:
我们可以通过redis.conf中的maxmemory来设置阀值:
#设置内存阀值 maxmemory 1048576B maxmemory 100KB maxmemory 100MB maxmemory 1GB #设置淘汰策略 maxmemory-policy noeviction
或者也可以动态设置内存策略,无需重启redis
config set maxmemory 100000 config set maxmemory-policy noeviction
下面介绍几种内存淘汰的策略:
volatile-lru(过期热点访问)
从已设置过期时间的数据集中挑选最近最少使用的数据淘汰。redis并不是保证取得所有数据集中最近最少使用的键值对,而只是随机挑选的几个键值对中的, 当内存达到限制的时候无法写入非过期时间的数据集。
volatile-ttl(干掉快死的)
从已设置过期时间的数据集中挑选将要过期的数据淘汰。redis 并不是保证取得所有数据集中最近将要过期的键值对,而只是随机挑选的几个键值对中的, 当内存达到限制的时候无法写入非过期时间的数据集。
volatile-random(过期随机抽)
从已设置过期时间的数据集中任意选择数据淘汰。当内存达到限制的时候无法写入非过期时间的数据集。
allkeys-lru(全值热点访问)
从数据集中挑选最近最少使用的数据淘汰。当内存达到限制的时候,对所有数据集挑选最近最少使用的数据淘汰,可写入新的数据集。
allkeys-random(全值随机抽)
从数据集中任意选择数据淘汰,当内存达到限制的时候,对所有数据集挑选随机淘汰,可写入新的数据集。
no-enviction(不删除)
当内存达到限制的时候,不淘汰任何数据,不可写入任何数据集,所有引起申请内存的命令会报错。