「黑马 Redis 原理」四、内存回收
内存回收
Redis之所以性能强,最主要的原因就是基于内存存储,然而单节点的Redis其内存大小不宜过大,会影响持久化或主从同步性能
配置文件中可以设置 redis 最大内存 maxmemory <bytes>
如 maxmemory 1gb
,当内存达到上限就无法继续存储数据
所以引出了内存回收策略
过期策略
expire <key> <expireTime>
可以给 key 设置存活时间 TTL,当过期后再访问得到的就是 nil

image.png|500

image.png|500
redis 如何知道一个 key 是否过期? 利用两个 Dict 分别记录 key-value 以及 key-ttl
是不是 ttl 到期就立即删除? 比如: 惰性删除 周期删除
惰性删除
不是在 TTL 到期时立即删除,而是在访问 KEY 时检查该 KEY 的 存活时间,如果过期则删除

image.png|500
周期删除
周期删除:顾明思议是通过一个定时任务,周期性的抽样部分过期的key,然后执行删除。执行周期有两种:
- Redis 初始化时会设置一个定时任务 serverCron(),按照 server.hz 的频率来执行过期 key 清理,模式为 SLOW
- Redis 的每个事件循环前会调用 beforeSleep() 函数,执行过期 key 清理,模式为 FAST

image.png|500

image.png|500
淘汰策略
内存淘汰:当 Redis 内存使用达到设置的阈值时,主动挑选部分 key 删除以释放更多内存的流程
在处理命令时,如果内存不充足,设置了 maxmemory 并且不是 lua 脚本在执行,就先尝试淘汰内存

image.png|500
淘汰策略

image.png|500
如何知道 LRU 和 LFU 呢

image.png|500
淘汰策略流程图
对于 TTL 来说,存活时间越长越要删;对于 LRU 来说,越远访问越要删;对于 LFU 来说,越不访问越要删

image.png|500