「黑马 Redis 原理」四、内存回收

内存回收

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