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

【每日八股】Redis篇(四):持久化(下)

目录

  • Redis 过期机制?
    • 过期键删除策略
    • 持久化与过期键
    • 主从复制与过期键
  • Redis 的内存淘汰策略?
    • 不淘汰策略(默认策略)
    • 淘汰有过期时间的数据
    • 淘汰所有数据
  • Redis 持久化时对过期键会如何处理?
    • RDB
    • AOF
    • 主从模式特殊处理
  • Redis 主从模式中,对过期键会如何处理?

Redis 过期机制?

Redis 的过期机制通过惰性删除 + 定期删除组合策略实现,同时结合持久化、主从复制等机制处理数据一致性。

过期键删除策略

定时删除

  • 触发条件:在设置 key 的过期时间时,创建一个定时事件,当时间到达时,由事件处理器执行 key 的删除操作。
  • 优点:内存可以被尽快释放,因此定时删除对内存最友好。
  • 缺点:定时删除对 CPU 不友好,删除过期 key 会占用相当一部分 CPU 时间,CPU 紧张时如果将 CPU 用于删除和当前无关的过期键,会对服务器的响应时间和吞吐量产生影响。

惰性删除

  • 触发条件:访问键时触发检查。
  • 行为:如果键过期,直接删除并返回空值。
  • 优点:CPU 友好,仅实际访问时消耗资源。
  • 缺点:可能导致内存泄露(过期但长期不被访问的键无法释放)。

定期删除

  • 触发条件:Redis 定期扫描过期字典。
  • 行为:随机选取N个过期的键。删除其中已过期的键,若过期键比例超过25%,则重复该过程。
  • 优点:平衡内存和 CPU 资源。

Redis 采用惰性删除 + 定期删除两种策略配合使用:平衡 CPU 的合理使用并避免内存浪费。具体来说,Redis 在访问或修改 key 之前,会调用 expireIfNeeded 函数检查 key 是否过期:

  • 如果 key 过期,删除 key,返回 null 给客户端;
  • 如果没有过期,不做任何处理,返回正常的 value。

此外,Redis 在定期删除时,从过期字典中随机抽取N(比如 20 )个key,检查这些 key 是否过期,并删除其中已经过期的 key。如果已经过期的 key 在这 N 个 key 中的数量大于 25%,则重复上述步骤直到比重小于 25%。

持久化与过期键

RDB 持久化

  • 生成 RDB:过期键不会被保存到 RDB 文件中。
  • 加载 RDB:主服务器会忽略过期键,从服务器保留过期键(依赖主从同步删除)。

AOF 持久化

  • 写入 AOF:键过期后执行 DEL 命令时,AOF 文件追加DEL记录。
  • AOF 重写:重写时检查键是否过期,过期键不写入新的 AOF。

主从复制与过期键

从服务器不主动删除过期键:而是依赖主服务器同步DEL命令。

主服务器删除逻辑:主服务器删除过期键后,向从服务器发送DEL命令。从服务器读到过期键,返回空值(但不会主动删除)。

Redis 的内存淘汰策略?

不淘汰策略(默认策略)

当运行内存超过最大内存设置时,不进行数据淘汰,此时拒绝写入操作,但是可以进行查询和删除操作。

淘汰有过期时间的数据

在设置了过期时间的数据当中进行淘汰:

  • volatile-random:随机淘汰设置了过期时间的任意键值;
  • volatile-ttl:优先淘汰更早过期的键值;
  • volatile-lru:淘汰所有设置了过期时间的键值中,最久未使用的键值;
  • volatile-lfu:淘汰所有设置了过期时间的键值中,最少使用的键值;

淘汰所有数据

  • allkeys-random:随机淘汰任意键值;
  • allkeys-lru:淘汰整个键值中最久未使用的键值;
  • allkeys-lfu:淘汰整个键值中最少使用的键值;

Redis 持久化时对过期键会如何处理?

RDB

生成 RDB 文件时

  • 已过期的键不会写入 RDB 文件;
  • 仍在有效期内的键会保留过期时间信息;

加载 RDB 文件时

  • 主节点:加载时会检查键的过期时间,自动过滤已过期的键
  • 从节点:会完整加载所有的键(包含已过期的),依赖主节点同步 DEL 命令来删除。

AOF

AOF 写入时

  • 当键过期被删除时,会追加一条 DEL 命令到 AOF 文件
  • 通过redis.confappendfsync配置控制同步策略;

AOF 重写时

  • 重写过程会检查键的过期时间,已过期的键不会写入新的 AOF;

主从模式特殊处理

  • 从节点不会主动删除过期键,依赖主节点的 DEL 命令同步;
  • 读取从节点时可能返回逻辑上已经过期的数据。

关键注意事项

  1. 内存中已过期但未被删除的键会被持久化保留;
  2. 持久化文件中的过期时间使用绝对时间戳存储;
  3. 混合持久化模式同时遵循上述 RDB 和 AOF 的处理规则。

Redis 主从模式中,对过期键会如何处理?

从库不会进行过期扫描,即使从库中的 key 过期了,如果有客户端访问从库时,依然可以得到 key 对应的值。从库的过期键处理依靠主服务器控制,主库在 key 到期时,会在 AOF 文件里增加一条 del 指令,同步到所有的从库,从库通过执行这条 del 指令来删除过期的 key。


http://www.kler.cn/a/581899.html

相关文章:

  • 机器学习中的梯度下降是什么意思?
  • 图像识别技术与应用课后总结(16)
  • Spring MVC 详细分层和微服务
  • Redis线上问题排查指南:常见错误与解决思路
  • 统计登录系统10秒内连续登录失败超过3次的用户
  • 计算机三级网络技术备考(5)
  • 每天一道算法题【蓝桥杯】【x的平方根】
  • Kylin麒麟操作系统服务部署 | Ansible基础
  • Axure RP 9 安装与汉化指南(附安装包)包含下载、安装、汉化、授权,Axure9 汉化教程、Axure9 汉化步骤
  • 不用 Tomcat?SpringBoot 项目用啥代替?
  • 智能体开发:推理-行动(ReAct)思维链提示
  • 【2025最新】DeepSeek-R1+Open-WebUI双系统部署全攻略:从Linux到Windows保姆级教程,手把手搭建可视化AI对话平台
  • 从零开始学机器学习——准备和可视化数据
  • springboot 文件下载
  • 带有LBS_OWNERDRAWFIXED 样式的列表框,系统在什么时候向窗口发送WM_DRAWITEM 和WM_MEASUREITEM消息de呢?
  • 使用DeepSeek+蓝耘快速设计网页简易版《我的世界》小游戏
  • 如何在Spring Boot中配置和使用MyBatis-Plus
  • NO.36十六届蓝桥杯备战|位运算和操作符属性|进制转换|原码反码补码|左移|右移|按位与|按位或|按位异或|按位取反(C++)
  • 帕金森病如何 “偷走” 患者的正常生活?
  • HttpMediaTypeNotAcceptableException报错解决,状态码显示为406