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

(Redis)内存淘汰策略

1. 为什么需要内存淘汰策略?

Redis 是一个基于内存的高性能数据库,所有数据都存储在内存中。

  • 优点:读写速度极快。

  • 缺点:内存有限,存满之后如果继续写入,就必须有一套策略来决定“删掉谁,留下谁”。

这就是 内存淘汰策略(Eviction Policy)
配置参数:

maxmemory <bytes>     # 限制 Redis 使用的最大内存
maxmemory-policy <policy>  # 设置淘汰策略

2. Redis 内存淘汰策略分类

Redis 提供了 8 种内存淘汰策略(6 个淘汰策略 + 2 个特殊模式)。

(1)不淘汰

  • noeviction(默认)

    • 当内存不足时,直接返回错误,不再接受写入请求(读请求正常)。

    • 适合当 Redis 作为缓存以外的使用场景,比如严格控制数据不丢失。


(2)针对设置了过期时间(TTL)的 key

  • volatile-lru:在设置了过期时间的 key 中,淘汰最近最少使用的 key。

  • volatile-lfu:在设置了过期时间的 key 中,淘汰使用频率最低的 key。

  • volatile-ttl:在设置了过期时间的 key 中,优先淘汰 TTL(剩余生存时间)最短的 key。

  • volatile-random:在设置了过期时间的 key 中,随机淘汰一个 key。


(3)针对所有 key

  • allkeys-lru:在所有 key 中,淘汰最近最少使用的 key(常见策略)。

  • allkeys-lfu:在所有 key 中,淘汰使用频率最低的 key(更智能)。

  • allkeys-random:在所有 key 中,随机淘汰一个 key。


3. 各策略优缺点

策略说明优点缺点应用场景
noeviction默认,不淘汰,写操作报错数据绝对安全无法继续写入严格控制数据不可丢失
volatile-lru在设置过期时间的 key 中淘汰最近最少使用常用缓存策略只作用于设置 TTL 的 key缓存系统,定期过期数据
allkeys-lru在所有 key 中淘汰最近最少使用最常用,命中率高可能误删重要数据通用缓存
volatile-lfu在设置过期时间的 key 中淘汰使用频率最低更智能的缓存淘汰计算频率有额外开销热点数据缓存
allkeys-lfu在所有 key 中淘汰使用频率最低热点数据保留更久实现复杂,性能略低高频访问的缓存系统
volatile-ttl在设置过期时间的 key 中,优先淘汰 TTL 最短的控制过期优先级使用场景少时间敏感型缓存
volatile-random在设置过期时间的 key 中随机淘汰简单命中率低特殊场景
allkeys-random在所有 key 中随机淘汰简单命中率低低优先级缓存

4. 实际推荐方案

  • allkeys-lru:最常用,适合做缓存,保证热点数据尽量保留。

  • allkeys-lfu:Redis 4.0+ 引入,更智能,适合热点数据集变化较快的场景。

  • volatile-ttl:适合有明显过期优先级的业务,例如“临期数据优先清理”。


5. 总结

  • Redis 内存满时需要根据策略来淘汰数据。

  • LRU(Least Recently Used) → 淘汰最近最少用的数据。

  • LFU(Least Frequently Used) → 淘汰使用次数最少的数据。

  • TTL → 优先淘汰即将过期的数据。

  • 推荐 allkeys-lruallkeys-lfu,适合大多数缓存场景。

http://www.dtcms.com/a/347993.html

相关文章:

  • Elastic APM vs Apache SkyWalking vs Pinpoint:APM性能监控方案对比分析与最佳实践
  • 深度学习之第二课PyTorch与CUDA的安装
  • 华为云Stack环境中计算资源,存储资源,网络资源发放前的准备工作(上篇)
  • 【软考架构】云计算相关概念
  • 嵌入式系统bringup通用流程
  • SpringBoot的学生学习笔记共享系统设计与实现
  • 鸿蒙中应用闪屏解决方案
  • 从Android到鸿蒙:一场本应无缝的转型-优雅草卓伊凡
  • Flink 实时加购数据“维表补全”实战:从 Kafka 到 HBase 再到 Redis 的完整链路
  • 设计模式:工厂模式
  • 3.4 磁盘存储器 (答案见原书 P194)
  • STM32H723Zx OCTO-SPI(OSPI) 读写 W25Q64
  • fastmcp 客服端远程MCP服务调用;多工具 MCP服务情景案例;集成fastapi服务
  • Vue.js 核心机制深度学习笔记
  • 阿里云 OSS 前端直传实战:表单上传 + Policy 模式详解
  • 基于魔搭社区与阿里云百炼的云端 RAG 私有知识问答系统实现
  • GHOST 小巧方便的 WinXP !
  • 华为网路设备学习-30(BGP协议 五)Community、
  • 【重学MySQL】八十八、8.0版本核心新特性全解析
  • 质量管理与项目管理学习-初识1
  • ThinkPHP8学习篇(四):请求和响应
  • 基于FPGA的情绪感知系统设计方案:心理健康监测应用(一)
  • centos搭建gitlab服务器
  • 【R语言】R语言中 rbind() 与 merge() 的区别详解
  • 【企业标准开发框架 01】全局异常处理+自定义异常类
  • JAVA限流方法
  • System.IO.Pipelines 与“零拷贝”:在 .NET 打造高吞吐二进制 RPC
  • 【SpringBoot集成篇】SpringBoot 深度集成 Elasticsearch 搜索引擎指南
  • rust语言 (1.88) egui (0.32.1) 学习笔记(逐行注释)(十五)网格布局
  • rust语言 (1.88) egui (0.32.1) 学习笔记(逐行注释)(十三)菜单、右键菜单