Redis 内存淘汰策略深度解析(最新推荐)

2025-03-10 17:50

本文主要是介绍Redis 内存淘汰策略深度解析(最新推荐),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Redis内存淘汰策略深度解析(最新推荐)》本文详细探讨了Redis的内存淘汰策略、实现原理、适用场景及最佳实践,介绍了八种内存淘汰策略,包括noeviction、LRU、LFU、TTL、Rand...

Redis 作为高性能的内存数据库,其内存资源的高效管理直接关系到系统的稳定性yorckf和性能。当 Redis 的内存使用达到配置的最大值(maxmemory)时,新的写入操作将触发内存淘汰机制(Eviction Policy),以释放空间存储新数据。本文将深入探讨 Redis 的内存淘汰策略、实现原理、适用场景及最佳实践。

一、 内存淘汰策略概述

Redis 的内存淘汰策略决定了在内存不足时,如何选择需要删除的键来释放空间。这些策略可以分为两大类:

  • 基于过期时间的淘汰​(volatile-*):仅针对设置了过期时间的键。
  • 全局淘汰​(allkeys-*):针对所有键,无论是否设置过期时间。

Redis 支持以下 8 种内存淘汰策略

noeviction:默认策略,禁止写入新数据,直接返回错误。
volatile-lru:淘汰最近最少使用(LRU)的设置了过期时间的键。
volatile-lfu:淘汰最不经常使用(LFU)的设置了过期时间的键。
volatile-random:随机淘汰设置了过期时间的键。
volatile-ttl:优先淘汰剩余生存时间(TTL)最短的键。
allkeys-lru:淘汰所有键中最近最少使用的键。
allkeys-lfu:淘汰所有键中最不经常使用的键。
allkeys-random:随机淘汰任意键。

二、内存淘汰策略详解

2.1 ​noeviction(不淘汰)​

​行为:当内存不足时,拒绝所有写入命令(如 SET、LPUSH),但允许读取操作。
​适用场景:适用于数据不可丢失的场景(如持久化存储),需确保内存足够或配合持久化机制。
缺点:若内存不足且无持久化,可能导致服务不可用。

2.2 ​LRU(Least Recently Used)​

​原理:淘汰最近最久未被访问的键。
​Redis 实现:Redis 使用近似 LRU 算法,通过随机采样(默认取 5 个键)选择最久未使用的键,而非遍历所有键,以减少计算开销。
​适用场景:适用于缓存场景,优先保留热点数据。
​命令示例

CONFIG SET maxmemory-policy volatile-lru  # 针对带过期时间的键
CONFIG SET maxmemory-policy allkeys-lru   # 针对所有键

2.3 ​LFU(Least Frequently Used)​

​原理:淘汰访php问频率最低的键(Redis 4.0 引入)。
​Redis 实现:通过计数器统计键的访问频率,并随时间衰减历史计数,避免长期累积导致无法淘汰旧键。
​适用场景:适合长期缓存,如高频访问的静态数据。
​命令示例

CONFIG SET maxmemory-policy volatile-lfu  # 针对带过期时间的键
CONFIG SET maxmemory-policy allkeys-lfu   # 针对所有键

2.4 ​TTL(Time To Live)​

​原理:优先淘汰剩余生存时间(TTL)最短的键。
​适用场景:适用于明确知道键生命周期的场景(如临时会话数据)。
限制:仅对设置了过期时间的键生效。
​命令示例

CONFIG SET maxmemory-policy volatile-ttl

2.5 ​Random(随机淘汰)​

​原理:随机选择键进行淘汰。
​适用场景:内存压力大且数据重要性均等时,快速释放内存。
​命令示例

CONFIG SET maxmemory-policy volatile-random  # 针对带过期时间的键
CONFIG SET maxmemory-policy allkeys-random   # 针对所有键

三、 内存淘汰的底层实现

3.1 ​LRU/LFU 的近似算法

  • Redis 通过 ​evictionPoolEntry​结构维护候选淘汰键池。每次淘汰时,随机采样一组键,更新其访问时间或频率信息,选择最不活跃的键删除。
  • ​LRU 时钟:Redis 使用全局 24 位时钟(精度为秒)记录键的最近访问时间。内存中每个对象存储与全局时钟的差值(lru字段),而非精确时间戳。
  • ​LFU 计数器:每个键的 lru 字段被拆分为两部分:
    • 高 16 位:最近访问时间的分钟级精度。
    • 低 8 位:访问频率计数器(0~255),通过概率递增,随时间衰减。

3.2 ​淘汰流程

  • 客户端执行写入命令触发内存检查。
  • Redis 检查 maxmemory 是否已超出。
  • 根据配置的策略选择待淘汰键。
  • 删除键并触发相javascript关事件(如 evicted 通知)。

四、 如何选择合适的内存淘汰策略?

4.1 ​缓存场景

http://www.chinasem.cn推荐策略:allkeys-lru 或 allkeys-lfu
​理由:优先保留热点数据,最大化缓存命中率。

4.2 ​持久化存储

​推荐策略:noeviction(需确保内存足够或启用持久化)。
​替代方案:若允许部分数据丢失,可使用 volatile-lru 结合过期时间。

4.3 ​临时数据场景

​推荐策略:volatile-ttl
​理由:自动清理生命周期明确的数据(如验证码、会话信息)。

4.4 ​混合型数据

​推荐策略:allkeys-lru + 部分键设置过期时间。
​示例:电商系统中,商品详情用 allkeys-lru 缓存,购物车数据设置 TTL。

五、最佳实践与注意事项

5.1 ​配置建议

​设置合理的 maxmemory:通常为物理内存的 80%~90%,避免 OOM。
​监控内存使用:

INFO memory  # 查看内存指标(used_memory、maxmemory)
INFO stats    # 查看 evicted_keys(淘汰键数量)

5.2 ​避免大规模淘汰

​分片设计:通过集群分散数据,减少单个节点的内存压力。
​预热缓存:重启后预加载高频数据,避免冷启动时集中淘汰。

5.3 ​常见误区

volatile-ttl 不依赖惰性删除:该策略仅在内存不足时触发,仍需依赖定期/惰性删除清理过期键。
​LFU 计数器并非精确值:访问频率通过概率递增,适用于相对比较而非绝对计数。

六、总结

Redis 的内存淘汰策略是平衡内存使用与性能的关键机制。理解不同策略的原理和适用场景,结合业务需求合理配置,可显著提升系统的稳定性和效率。在高并发场景下,建议通过监控工具(如 RedisInsight、Prometheus)实时跟踪内存和淘汰指标,动态调整策略和资源配置。

通过本文的深度解析,希望您能掌握 Redis 内存淘汰的核心机制,并在实践中灵活运用,构建高效可靠的 Redis 服务。

参考资料

Redis 官方文档:https://redis.io/docs/reference/eviction/
《Redis 设计与实现》——黄健宏
Redis 源码解析(evict.c、object.c)

到此这篇关于Redis 内存淘汰策略深度解析的文章就介绍到这了,更多相关Redis 内存淘汰策略内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!

这篇关于Redis 内存淘汰策略深度解析(最新推荐)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1153681

相关文章

全面解析HTML5中Checkbox标签

《全面解析HTML5中Checkbox标签》Checkbox是HTML5中非常重要的表单元素之一,通过合理使用其属性和样式自定义方法,可以为用户提供丰富多样的交互体验,这篇文章给大家介绍HTML5中C... 在html5中,Checkbox(复选框)是一种常用的表单元素,允许用户在一组选项中选择多个项目。本

Redis Cluster模式配置

《RedisCluster模式配置》:本文主要介绍RedisCluster模式配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录分片 一、分片的本质与核心价值二、分片实现方案对比 ‌三、分片算法详解1. ‌范围分片(顺序分片)‌2. ‌哈希分片3. ‌虚

Python包管理工具核心指令uvx举例详细解析

《Python包管理工具核心指令uvx举例详细解析》:本文主要介绍Python包管理工具核心指令uvx的相关资料,uvx是uv工具链中用于临时运行Python命令行工具的高效执行器,依托Rust实... 目录一、uvx 的定位与核心功能二、uvx 的典型应用场景三、uvx 与传统工具对比四、uvx 的技术实

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.

Springboot整合Redis主从实践

《Springboot整合Redis主从实践》:本文主要介绍Springboot整合Redis主从的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言原配置现配置测试LettuceConnectionFactory.setShareNativeConnect

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

《MyBatisPlus中update_time字段自动填充失效的原因分析及解决方案(最新整理)》在使用MyBatisPlus时,通常我们会在数据库表中设置create_time和update... 目录前言一、问题现象二、原因分析三、总结:常见原因与解决方法对照表四、推荐写法前言在使用 MyBATis

Java SWT库详解与安装指南(最新推荐)

《JavaSWT库详解与安装指南(最新推荐)》:本文主要介绍JavaSWT库详解与安装指南,在本章中,我们介绍了如何下载、安装SWTJAR包,并详述了在Eclipse以及命令行环境中配置Java... 目录1. Java SWT类库概述2. SWT与AWT和Swing的区别2.1 历史背景与设计理念2.1.

Redis过期删除机制与内存淘汰策略的解析指南

《Redis过期删除机制与内存淘汰策略的解析指南》在使用Redis构建缓存系统时,很多开发者只设置了EXPIRE但却忽略了背后Redis的过期删除机制与内存淘汰策略,下面小编就来和大家详细介绍一下... 目录1、简述2、Redis http://www.chinasem.cn的过期删除策略(Key Expir

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Java日期类详解(最新推荐)

《Java日期类详解(最新推荐)》早期版本主要使用java.util.Date、java.util.Calendar等类,Java8及以后引入了新的日期和时间API(JSR310),包含在ja... 目录旧的日期时间API新的日期时间 API(Java 8+)获取时间戳时间计算与其他日期时间类型的转换Dur