Redis 内存淘汰策略深度解析

Redis 作为高性能的内存数据库,其内存资源的高效管理直接关系到系统的稳定性和性能。当 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)​

​原理:淘汰访问频率最低的键(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 ​淘汰流程

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

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

4.1 ​缓存场景

​推荐策略: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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/983611.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Windows 如何开启和使用FTP服务

在Windows 系统开启FTP的服务方式有很多种,最快速的就是使用Windows自身的FTP服务了。 Windows 搭建FTP服务的方式 在Windows 中搭建FTP的方式有很多种,有商用收费的,也有开源免费的,除此之外, Windows本身也内置了F…

ASP.NET Core 6 MVC 文件上传

概述 应用程序中的文件上传是一项功能,用户可以使用该功能将用户本地系统或网络上的文件上传到 Web 应用程序。Web 应用程序将处理该文件,然后根据需要对文件进行一些验证,最后根据要求将该文件存储在系统中配置的用于保存文件的存储中&#…

计算机毕业设计SpringBoot+Vue.js制造装备物联及生产管理ERP系统(源码+文档+PPT+讲解)

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

yoloV5训练visDrone2019-Det无人机视觉下目标检测

一、visDrone2019数据集详解 visDrone2019数据集是无人机视角下最具挑战性的目标检测基准数据集之一,由天津大学机器学习与数据挖掘实验室联合其他研究机构共同构建。该数据集采集自中国14个不同城市,覆盖复杂城市场景、交通枢纽、密集人群等多种环境。…

Unity开发——CanvasGroup组件介绍和应用

CanvasGroup是Unity中用于控制UI的透明度、交互性和渲染顺序的组件。 一、常用属性的解释 1、alpha:控制UI的透明度 类型:float,0.0 ~1.0, 其中 0.0 完全透明,1.0 完全不透明。 通过调整alpha值可以实现UI的淡入淡…

C语言学习笔记-进阶(7)字符串函数3

1. strstr的使用和模拟实现 char * strstr ( const char * str1, const char * str2); Returns a pointer to the first occurrence of str2 in str1, or a null pointer if str2 is not part of str1. (函数返回字符串str2在字符串str1中第⼀次出现的位置&#x…

如何利用数字校园平台提升职业竞争力

现在我们来探讨如何借助数字校园平台来增强自身的职业竞争力。当今之时代,技术与数据堪称热门领域,略懂编程语言及数据分析,于求职之际,实能增添诸多优势! 首先,咱们得说说编程语言。现在很多学校都有提供在…

使用 Arduino 的 WiFi 控制机器人

使用 Arduino 的 WiFi 控制机器人 这次我们将使用 Arduino 和 Blynk 应用程序制作一个 Wi-Fi 控制的机器人。这款基于 Arduino 的机器人可以使用任何支持 Wi-Fi 的 Android 智能手机进行无线控制。 为了演示 Wi-Fi 控制机器人,我们使用了一个名为“Blynk”的 Android 移动应…

动态ip和静态ip适用于哪个场景?有何区别

在数字化浪潮席卷全球的今天,IP地址作为网络世界的“门牌号”,其重要性不言而喻。然而,面对动态IP与静态IP这两种截然不同的IP分配方式,许多用户往往感到困惑:它们究竟有何区别?又分别适用于哪些场景呢&…

求最大公约数【C/C++】

大家好啊,欢迎来到本博客( •̀ ω •́ )✧,我将带领大家详细的了解最大公约数的思想与解法。 一、什么是公约数 公约数,也称为公因数,是指两个或多个整数共有的因数。具体来说,如果一个整数能被两个或多个整数整除&…

conda 配置新环境时package will be install 和 package will be download 的区别

install 和 download 的区别 package will be downloaded下的包:这一类显示的是需要从 conda 仓库或其他指定的源下载的软件包。这些软件包通常是 .tar.bz2、.tar.xz 或 .conda 格式的压缩包。这些包会被下载到本地缓存目录(通常是 ~/.conda 或 C:\Users…

【2025小黑课堂】计算机二级WPS精选系列20G内容(可下载:真题+预测卷+软件+选择题)

2025年3月全国计算机等级考试即将于3月29日至31日举行。为了帮助广大考生高效备考,小编特意收集并整理了最新版(备考2025年3月)的小黑课堂计算机二级WPS 电脑题库软件,助力考生在考试中游刃有余,轻松通关! …

C++编写Redis客户端

目录 安装redis-plus-plus库 ​编辑 编译Credis客户端 redis的通用命令使用 get/set exists del keys expire /ttl type string类型核心操作 set和get set带有超时时间 set带有NX string带有XX mset mget getrange和setrange incr和decr list类型核心操作…

①EtherCAT转Modbus485RTU网关多路同步高速采集无需编程串口服务器

EtherCAT转Modbus485RTU网关多路同步高速采集无需编程串口服务器https://item.taobao.com/item.htm?ftt&id798036415719 型号 1路总线EC网关 MS-A2-1011 2路总线EC网关 MS-A2-1021 4路总线EC网关 MS-A2-1041 EtherCAT 串口网关 EtherCAT 转 RS485 技术规格 …

C++ Primer 交换操作

欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…

TDengine 服务无法启动常见原因

taosd 是 TDengine 的核心服务进程,如果无法启动将导致整个数据库无法使用,了解常导致无法启动的原因,可以帮你快速解决问题。 1. 如何查找日志 无法启动的原因记录在日志中,日志文件默认在 /var/log/taos 的 taosdlog.0 或者 t…

一周学会Flask3 Python Web开发-SQLAlchemy连接Mysql数据库

锋哥原创的Flask3 Python Web开发 Flask3视频教程: 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili app.py下,我们先配置数据库连接,然后写一个简单sql测试。 连接配置,包括用户名&#xff…

【NLP 32、文本匹配任务 —— 深度学习】

大劫大难以后,人不该失去锐气,不该失去热度,你镇定了却依旧燃烧,你平静了却依旧浩荡,致那个从绝望中走出来的自己,共勉 —— 25.1.31 使用深度学习在文本匹配任务上主要有两种方式:① 表示型 ②…

打造智能聊天体验:前端集成 DeepSeek AI 助你快速上手

DeepSeek AI 聊天助手集成指南 先看完整效果: PixPin_2025-02-19_09-15-59 效果图: 目录 项目概述功能特点环境准备项目结构组件详解 ChatContainerChatInputMessageBubbleTypeWriter 核心代码示例使用指南常见问题 项目概述 基于 Vue 3 TypeScrip…

2008-2024年中国手机基站数据/中国移动通信基站数据

2008-2024年中国手机基站数据/中国移动通信基站数据 1、时间:2008-2024年 2、来源:OpenCelliD 3、指标:网络类型、网络代数、移动国家/地区、移动网络代码、区域代码、小区标识、单元标识、坐标经度、坐标纬度、覆盖范围、测量样本数、坐标…