当前位置: 首页 > news >正文

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

http://www.jsqmd.com/news/653861/

相关文章:

  • 千问3.5-9B嵌入式Linux开发:交叉编译与环境搭建详解
  • 生成式AI多语言支持不是加个翻译API!资深NLP架构师首曝内部验证的4级合规性校验矩阵
  • 从STM32转战联盛德W806:一个老鸟的快速上手心得(CDK工程、GPIO点灯与烧录工具避坑指南)
  • 前端——别再轮询了!手摸手教你用WebSocket打造实时应用,面试必问
  • Keycloak 主题定制实战:从零构建企业级 OAuth 登录界面
  • 2026年知名的池州有灯光秀的暴区/池州有傩戏的景区/池州古镇用户好评推荐 - 品牌宣传支持者
  • PostgreSQL 命令行利器 psql 高效工作流实战
  • 飞书多维表格实战:用AI工作流重塑内容创作与团队协作
  • FLUX.小红书极致真实V2部署教程:集群化部署支持百并发图像生成
  • 别再只用ReplayBlock回放数据了!CANoe离线回放与Trace回放的保姆级场景选择指南
  • 2026年知名的温州保温袋/温州LDPE保温袋公司选择推荐 - 品牌宣传支持者
  • Python中sys.stdin.read()多行输入终止技巧与常见场景解析
  • 捡垃圾指南:二手FirePro S7150 X2在ESXi 7.0的避坑安装全记录
  • WeKnora智能文档处理:基于OCR技术的图片文字识别集成
  • Bebas Neue:免费开源几何字体终极指南,打造专业级视觉设计
  • 【MQTT】Mosquitto API实战:从零构建一个稳定可靠的IoT客户端
  • 从手机到车机:Android开发者转型车载应用,需要先搞懂这5个核心概念(QNX、Hypervisor、CAN Bus...)
  • 第9章 函数-9.9 函数式编程
  • 类脑智能体:从认知架构到通用智能的实践路径
  • 2026年口碑好的风电工程专用扰流条/海上风电耐腐蚀扰流条/螺旋风电扰流条/江苏叶片扰流条多家厂家对比分析 - 品牌宣传支持者
  • 【JNI内存陷阱揭秘】从EXCEPTION_ACCESS_VIOLATION到系统稳定:一次跨平台库调用的深度排雷
  • 2026年热门的龙港龙港拉链/箱包拉链厂家筛选方法 - 行业平台推荐
  • 新手必看!文墨共鸣保姆级教程:3步搭建中文语义相似度分析系统
  • Android NFC开发实战:从权限申请到数据解码的完整流程(附避坑指南)
  • CefFlashBrowser终极指南:如何让Flash游戏和课件重获新生?
  • 从零封装一个ChatGPT UI:Vue3+TS实现会话历史本地存储的完整方案
  • 5分钟搞定!Meta-Llama-3-8B-Instruct对话应用搭建实录
  • 2026年可拆卸原汁机/家用原汁机/宁波原汁机制造厂家推荐 - 品牌宣传支持者
  • 五大主流地图数据本地化实战:高德、百度、腾讯、必应与ArcGIS下载指南
  • 江南居士林:天辛大师浅谈如何用AI分辨明前茶还是雨前茶