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

3 天前
1
AI 生成的摘要

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

内存回收

Redis之所以性能强,最主要的原因就是基于内存存储,然而单节点的Redis其内存大小不宜过大,会影响持久化或主从同步性能

配置文件中可以设置 redis 最大内存 maxmemory <bytes>maxmemory 1gb,当内存达到上限就无法继续存储数据

所以引出了内存回收策略

过期策略

expire <key> <expireTime> 可以给 key 设置存活时间 TTL,当过期后再访问得到的就是 nil

image.png|500

image.png|500
image.png|500

image.png|500

redis 如何知道一个 key 是否过期? 利用两个 Dict 分别记录 key-value 以及 key-ttl

是不是 ttl 到期就立即删除? 比如: 惰性删除 周期删除

惰性删除

不是在 TTL 到期时立即删除,而是在访问 KEY 时检查该 KEY 的 存活时间,如果过期则删除

image.png|500

image.png|500

周期删除

周期删除:顾明思议是通过一个定时任务,周期性的抽样部分过期的key,然后执行删除。执行周期有两种:

  • Redis 初始化时会设置一个定时任务 serverCron(),按照 server.hz 的频率来执行过期 key 清理,模式为 SLOW
  • Redis 的每个事件循环前会调用 beforeSleep() 函数,执行过期 key 清理,模式为 FAST
image.png|500

image.png|500
image.png|500

image.png|500

淘汰策略

内存淘汰:当 Redis 内存使用达到设置的阈值时,主动挑选部分 key 删除以释放更多内存的流程

在处理命令时,如果内存不充足,设置了 maxmemory 并且不是 lua 脚本在执行,就先尝试淘汰内存

image.png|500

image.png|500

淘汰策略

image.png|500

image.png|500

如何知道 LRU 和 LFU 呢

image.png|500

image.png|500

淘汰策略流程图

对于 TTL 来说,存活时间越长越要删;对于 LRU 来说,越远访问越要删;对于 LFU 来说,越不访问越要删

image.png|500

image.png|500

使用社交账号登录

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...