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

Redis内存淘汰策略和过期键删除策略有哪些?

Redis 提供 8 种内存淘汰策略,以下是详细解析及场景建议:

一、核心策略解析

  1. noeviction (默认策略)

    • 机制:内存满时拒绝新写入操作,返回错误
    • 优势:绝对数据安全
    • 场景:金融交易系统、医疗数据存储
  2. allkeys-lru (推荐通用策略)

    • 机制:全局淘汰最久未使用的键
    • 优势:自动识别冷热数据
    • 场景:电商商品缓存、新闻资讯系统
  3. volatile-lru

    • 机制:仅淘汰带过期时间的LRU键
    • 优势:保护持久化数据
    • 场景:会话缓存 + 持久化数据混合存储
  4. allkeys-random

    • 机制:随机淘汰任意键
    • 优势:简单高效
    • 场景:临时数据缓存、压力测试环境
  5. volatile-random

    • 机制:随机淘汰带过期时间的键
    • 优势:有限范围内的随机淘汰
    • 场景:定时刷新缓存池

二、特殊场景策略

  1. volatile-ttl

    • 机制:优先淘汰最快过期的键
    • 优势:精确控制数据生命周期
    • 场景:限时抢购库存缓存、验证码存储
  2. allkeys-lfu (4.0+)

    • 机制:淘汰使用频率最低的键
    • 优势:长期保留高频数据
    • 场景:用户画像数据、热门推荐数据
  3. volatile-lfu (4.0+)

    • 机制:淘汰带过期时间的低频键
    • 优势:兼顾频率和有效期
    • 场景:周期性热点数据缓存

三、配置示例

# 设置最大内存为4GB
maxmemory 4gb
# 使用LFU策略(生产推荐)
maxmemory-policy allkeys-lfu

四、决策树参考

内存敏感型系统 → 选择LFU策略
时间敏感型数据 → 选择TTL策略
数据重要性分层 → 使用volatile系列
突发流量防护 → 使用allkeys-random

注:LFU策略需Redis 4.0+版本支持,建议生产环境优先使用LFU系列策略,可通过OBJECT FREQ命令实时监控键访问频率。

过期键删除策略

Redis 的过期键删除策略主要有两种,配合内存淘汰机制共同管理键生命周期:

1. 惰性删除(被动删除)

实现原理
当客户端访问某个键时,Redis 会先检查该键是否已过期。如果过期则立即删除,否则返回数据。

优势

  • 节省 CPU 资源(只在访问时检查)
  • 对正常读写无性能影响

适用场景

  • 过期键被频繁访问的场景
  • 对内存占用不敏感的长期运行系统

2. 定期删除(主动删除)

实现原理
Redis 以固定频率(默认每秒 10 次)随机扫描设置了过期时间的键:

  1. 从过期字典中随机抽取 20 个键
  2. 删除其中已过期的键
  3. 如果过期的键比例超过 25%,重复步骤 1

优势

  • 主动释放内存空间
  • 减少内存泄漏风险

适用场景

  • 存在大量长期不访问的过期键
  • 对内存敏感需要主动清理的场景

3. 内存淘汰机制(补充策略)

当内存达到 maxmemory 限制时,Redis 会根据配置执行淘汰策略,常用策略包括:

  • volatile-lru:淘汰最近最少使用的过期键
  • volatile-ttl:淘汰剩余存活时间最短的键
  • allkeys-lru:淘汰整个数据集中的最近最少使用键

策略组合
Redis 默认采用 惰性删除 + 定期删除 组合策略,配合内存淘汰机制形成三级防御:

  1. 定期删除主动清理大部分过期键
  2. 惰性删除处理漏网之鱼
  3. 内存淘汰机制兜底防止内存溢出
http://www.xdnf.cn/news/6233.html

相关文章:

  • Flutter在键盘的上方加一个完成按钮
  • JAVA异常体系
  • Linux proc文件系统 内存影射
  • YOLO11解决方案之热力图探索
  • 二分查找的边界问题
  • KUKA机器人中断编程3—暂停功能的编程
  • Selenium-Java版(环境安装)
  • fio 命令在 Linux 系统中的应用示例
  • Android锁
  • android studio导入项目
  • json-server的用法-基于 RESTful API 的本地 mock 服务
  • jQuery知识框架
  • Spring Cloud Gateway 聚合 Swagger 文档:一站式API管理解决方案
  • 鸿蒙OSUniApp 实现精美的用户登录和注册页面#三方框架 #Uniapp
  • Vue ElementUI原生upload修改字体大小和区域宽度
  • WeakAuras Lua Script ICC (BarneyICC)
  • 【周输入】510周阅读推荐-2
  • TTS-Web-Vue系列:Vue3实现侧边栏与顶部导航的双向联动
  • 23-单调队列-滑动窗口
  • LeetCode 每日一题 3341. 到达最后一个房间的最少时间 I + II
  • NAT网关(网络地址转换网关)的用途与场景
  • Mac的web服务器
  • [滑动窗口]越短越合法(可转化成越长越合法)
  • 【每天一个知识点】模型轻量化(Model Compression and Acceleration)技术
  • 麒麟环境下Selenium的使用
  • 语音识别-2
  • 【Oracle专栏】清理告警日志、监听日志
  • 【进程控制二】进程替换和bash解释器
  • 【数据库复习】SQL语言
  • Java生成可控的Word表格功能开发