删除策略,是指到了过期时长未删除的💡
惰性删除: 是指不主动删除,只有在访问key时,都会判断key是否过期。如果过期则删除
定期删除: 是指每隔一段时间,随机获取一些key,判断是否过期,过期则删除。
— 为避免随机获取时,执行太长,或者执行循环检查。会限定执行时长,判断删除key占比>25%
内存淘汰(Redis 的运行内存达到了某个阀值,就会触发 内存淘汰机制)💡
redis,需要配置了maxmemory 最大使用内存时。并且超过了这个值,才会进行内存淘汰。
删除了数据是立即释放吗?
删除了数据,并不是立即释放的。
redis-内存管理
内存淘汰-maxmemory
在 64bit 系统下,maxmemory
设置为 0 表示不限制 Redis 内存使用,在 32bit 系统下,maxmemory
隐式不能超过 3GB。 maxmemory_policy,淘汰策略。
// server.c
if (server.arch_bits == 32 && server.maxmemory == 0) {
serverLog(LL_WARNING,"Warning: 32 bit instance detected but no memory limit set. Setting 3 GB maxmemory limit with 'noeviction' policy now.");
server.maxmemory = 3072LL*(1024*1024); /* 3 GB */
server.maxmemory_policy = MAXMEMORY_NO_EVICTION;
}
淘汰策略
- 不进行数据淘汰的策略
- noeviction(Redis3.0之后,默认的内存淘汰策略) :它表示当运行内存超过最大设置内存时,不淘汰任何数据,而是不再提供服务,直接返回错误。
- 进行数据淘汰的策略
- 在设置了过期时间的数据中淘汰
- volatile-random:随机淘汰设置了过期时间的任意键值;
- volatile-ttl:优先淘汰更早过期的键值。
- volatile-lru(Redis3.0 之前,默认的内存淘汰策略):淘汰所有设置了过期时间的键值中,最久未使用的键值;
- volatile-lfu(Redis 4.0 后新增的内存淘汰策略):淘汰所有设置了过期时间的键值中,最少使用的键值;
- 所有数据范围
- allkeys-random:随机淘汰任意键值;
- allkeys-lru:淘汰整个键值中最久未使用的键值
- allkeys-lfu(Redis 4.0 后新增的内存淘汰策略):淘汰整个键值中最少使用的键值。
- 在设置了过期时间的数据中淘汰
LRU和LFU
LRU 全称是 Least Recently Used 翻译为最近最少使用,会选择淘汰最近最少使用的数据
redis-lru,每个对象记录最后访问时间,淘汰时,随机获取数据,淘汰最久没有使用的数据。
redis-lfu, 每个对象记录最后访问时间戳和访问频次。