it编程 > 数据库 > Redis

Redis内存回收用法及说明

34人参与 2025-12-24 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函数中

fast模式:每次redis单线程调用epoll_wait阻塞前都会先检查并清理部分过期key(2ms左右)

二、淘汰策略

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

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

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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

您想发表意见!!点此发布评论

推荐阅读

Redis的五种基本数据类型解读(String、List、Hash、Set、ZSet)

12-24

Redis中RDB与AOF的区别及说明

12-24

redis GEO数据结构、实现附近商铺功能实践

12-24

Redis网络I/O模型的使用及说明

12-24

redis 中 redisTemplate 的所有操作与函数详解

12-23

Redis 分片集群搭建与故障转移实战指南(推荐)

12-23

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论