内存回收#
Redis 之所以性能强,最主要的原因就是基于内存存储,然而单节点的 Redis 其内存大小不宜过大,会影响持久化或主从同步性能
配置文件中可以设置 redis 最大内存 maxmemory <bytes>
如 maxmemory 1gb
,当内存达到上限就无法继续存储数据
所以引出了内存回收策略
过期策略#
expire <key> <expireTime>
可以给 key 设置存活时间 TTL,当过期后再访问得到的就是 nil
redis 如何知道一个 key 是否过期?
利用两个 Dict 分别记录 key-value 以及 key-ttl
是不是 ttl 到期就立即删除?
比如:
惰性删除
周期删除
惰性删除#
不是在 TTL 到期时立即删除,而是在访问 KEY 时检查该 KEY 的 存活时间,如果过期则删除
周期删除#
周期删除:顾明思议是通过一个定时任务,周期性的抽样部分过期的 key,然后执行删除。执行周期有两种:
- Redis 初始化时会设置一个定时任务 serverCron (),按照 server.hz 的频率来执行过期 key 清理,模式为 SLOW
- Redis 的每个事件循环前会调用 beforeSleep () 函数,执行过期 key 清理,模式为 FAST
淘汰策略#
内存淘汰:当 Redis 内存使用达到设置的阈值时,主动挑选部分 key 删除以释放更多内存的流程
在处理命令时,如果内存不充足,设置了 maxmemory 并且不是 lua 脚本在执行,就先尝试淘汰内存
淘汰策略
如何知道 LRU 和 LFU 呢
淘汰策略流程图
对于 TTL 来说,存活时间越长越要删;对于 LRU 来说,越远访问越要删;对于 LFU 来说,越不访问越要删
此文由 Mix Space 同步更新至 xLog
原始链接为 https://blog.0xling.cyou/posts/redis/redis-6