Redis内存回收

目录

Redis可以通过修改配置文件maxmemory为Redis设置最大内存空间占用,当内存存储达到上限时,就无法存储更多数据了。

Redis提供了过期策略和淘汰策略来避免内存存储达到上限

一、过期策略

过期策略就是通过expire命令给key设置TTL,key过期时,key对应的内存会被释放。

redisDB维护两个Dict:dict、expires,dict记录所有redisObject-内存首址 键值对、expires记录设置了过期时间的redisObject-过期时间键值对。

1.惰性删除:

惰性删除在访问(CRUD)key时执行:首先根据key从dict中找到对应的redisObject,然后检查key记录在expires中的TTL,如果过期那么释放key的内存空间。

存在的问题:如果key过期了但是永远不会被访问,那么惰性删除策略下该key的内存空间永远不会被释放。

2.周期删除:

为所有key设置同一个定时任务,周期性的抽样部分key,检查是否过期,如果过期执行删除操作:

  • SLOW模式:redis单线程初始化时(初始化epoll阶段 )设置server.hz频率(默认100ms)定期检查并清理过期key,不在主线程main函数中
    • 执行周期为100ms,执行清理耗时不能超过25%即25ms
    • 首先逐个遍历 db,每次取20个key检查并清理过期key
    • 如果时间未达到25ms且刚才检查的过期key比例超过10%,再取20个key检查并清理。
    • (感觉这个任务每100ms执行一次的话,如果不是异步的,应该要抢占主单线程的CPU
  • FAST模式:每次redis单线程调用epoll_wait阻塞前 都会先检查并清理部分过期key(2ms左右)
    • 因为位于主线程的main代码中 ,所以执行周期为两次调用epoll_wait的间隔,但如果间隔低于2ms那么不会执行FAST清理直到两次FAST间隔大于2ms。 ,每次清理耗时不能超过1ms
    • 首先逐个遍历 db,每次取20个key检查并清理过期key
    • 如果时间未达到25ms且刚才检查的过期key比例超过10%,再取20个key检查并清理。

二、淘汰策略

淘汰策略就是Redis内存使用达到阈值时,主动挑选部分key删除以释放内存。

淘汰策略在主线程解析命令后处理命令前 执行,配置maxmemory-policy

  • noeviction:不淘汰任何key,内存满时不允许写入新数据,默认策略
  • volatile-ttl:对设置了TTL的key淘汰,TTL越小越先被淘汰
  • allkeys-random:对全体key(dict哈希表),随机淘汰。
  • volatile-random:对设置了TTL的key(expires哈希表),随机淘汰。
  • allkeys-lru:对全体key(dict哈希表),使用LRU算法进行淘汰。
  • volatile-lru:对设置了TTL的key(expires哈希表),使用LRU算法进行淘汰。
  • allkeys-lfu:对全体key(dict哈希表),使用LFU算法进行淘汰。
  • volatile-lfu:对设置了TTL的key(expires哈希表),使用LFU算法进行淘汰。

LRU:当前时间减最近一次访问时间 ,值越大优先淘汰。

LFU:访问次数越少优先淘汰。

key的访问次数和访问时间都会封装在redisObject对象 中:ptr指向key-value具体值

逻辑访问次数:由于8bit只能记录实际访问次数0~255,对于热key来说远远不够,所以使用逻辑访问次数

  1. key被访问时,生成一个0~1之间的随机数R
  2. 计算P=1/(旧访问次数*10+1)
  3. 如果R<P,计数器+1,最大不超过255
  4. 为了防止key长时间不访问但访问次数一直不变,访问次数随时间衰减,距离上一次访问间隔每隔1分钟计数器-1

也就是说逻辑访问次数越大 ,P越小,R<P的概率越小,计数器越难+1

相关推荐
KaMeidebaby1 分钟前
卡梅德生物技术快报|蛋白 N 端测序在重组贻贝融合蛋白表征中的应用,解决原核表达序列偏移工艺难题
前端·人工智能·物联网·算法·百度
梦想的颜色11 分钟前
硬核实践:使用 Docker 部署生产级 Redis(持久化 + 安全配置 + 高可用)
redis·docker·redis持久化·docker compose·redis哨兵·rdb aof
风中芦苇啊33 分钟前
从直接生成到受控配置:新一代图表Agent的SQL安全生成范式
数据库·sql·安全
吴声子夜歌40 分钟前
SQL进阶——窗口函数
数据库·sql
周杰伦的稻香43 分钟前
MySQL8.0+中引入的SET_USER_ID权限迭代SUPER权限指定 DEFINER
数据库·mysql
动恰客流统计1 小时前
客流统计如何结合AI分析?从传统计数到智能决策的技术升级路径
数据库·人工智能·边缘计算
kyriewen1 小时前
我筛了 1400 个 Claude Code Skills,留下 5 个天天在用的
前端·ai编程·claude
JNX_SEMI1 小时前
AT2401C 2.4GHz 全集成射频前端单芯片技术解析
前端·单片机·嵌入式硬件·物联网·硬件工程
宠友信息2 小时前
多端数据互通场景下Spring Boot仿小红书源码结构设计
数据库·spring boot·redis·缓存·架构
风曦Kisaki2 小时前
#Linux数据库管理Day06:主从同步与MaxScale读写分离
linux·运维·数据库