Redis的过期策略和淘汰策略

想象一下周末的大型超市:生鲜区的酸奶贴着"今日特价"标签,促销员定时检查这些商品的保质期;而仓库管理员正根据"先进先出"原则整理货架,确保商品不会过期积压。这种高效的商品管理策略,正是Redis处理过期数据和内存淘汰机制的完美比喻。

在实际开发中,我们经常遇到这样的场景:用户登录会话7天后失效,热点新闻缓存需要保留24小时,促销活动数据在活动结束后需要自动清理。如果这些数据不及时清理,就会像超市积压的过期商品一样,占用宝贵的存储空间,甚至导致系统崩溃。

根据我多年使用Redis的经验,合理配置过期策略和淘汰策略是保证Redis高性能、高可用的关键。今天,我们就来深入探讨Redis如何像高效的超市管理员一样,智能管理数据生命周期。

一、Redis过期策略

理解了超市商品管理的比喻后,我们来看看Redis如何给数据贴上"保质期"标签。

在实际工作中,我们经常会遇到需要设置数据有效期的场景:

  • 用户验证码5分钟有效、
  • API访问令牌2小时有效
  • 每日排行榜在午夜重置。

Redis提供了两种核心策略来管理这些过期数据,它们就像超市里的两种质检员,各有分工又相互配合。

1.1 定时删除

定时删除策略就像超市中负责临期商品检查的专员。当我们在Redis中设置一个键的过期时间时,Redis会创建一个定时器,在键过期时立即执行删除操作。

# 设置键值对,并指定30秒后过期
SET user:session:1234 "user_data" EX 30# Redis内部会为这个键设置一个定时器
# 30秒后自动触发删除操作

上述代码展示了如何设置带有过期时间的键值对。EX参数指定过期时间(秒),Redis会为此键创建定时器,到期自动删除。

📌 经验分享: 根据我的观察,定时删除策略虽然实时性好,但会创建大量定时器。在高并发场景下,如果同时设置大量短期过期的键(比如短信验证码),可能对性能产生影响。我建议大家可以针对不同的业务场景选择不同的策略。

1.2 惰性删除

惰性删除策略则像超市收银员在结账时检查商品保质期。只有当客户端尝试访问一个键时,Redis才会检查该键是否过期,如果过期就立即删除。

# 客户端尝试获取一个可能过期的键
GET user:session:1234# Redis内部处理流程:
1. 检查键是否存在
2. 如果存在,检查是否过期
3. 如果过期,删除键并返回nil
4. 如果未过期,返回值

1.3 定期删除

在实际应用中,Redis采用了折衷方案:定期删除。这就像超市安排员工每隔一段时间抽查部分货架,检查商品保质期。

Redis默认每100ms随机抽取一定数量的键(默认20个)进行检查:

  1. 随机选择20个设置过期时间的键
  2. 删除其中已过期的键
  3. 如果过期键比例超过25%,重复步骤1

场景案例:电商平台会话管理

假设场景: 一个大型电商平台使用Redis存储用户会话,要求用户登录状态保持30分钟活跃期。

挑战: 每天有数百万用户登录,如果所有会话都使用定时删除,会创建大量定时器;如果只用惰性删除,可能积累大量过期会话占用内存。

解决方案: 考虑到实际业务需求和高并发场景,我们采用组合策略:

  • 对普通用户会话使用惰性删除+定期删除组合
  • 对VIP用户会话使用定时删除,确保及时释放资源
  • 配置定期删除策略增加采样数量

效果: 经过三个版本的迭代,我们发现内存使用减少35%,Redis CPU利用率下降20%,系统稳定性显著提升。

二、Redis淘汰策略

掌握了数据保鲜的艺术后,我们面临的下一个挑战是:当超市货架满了,新商品该如何上架?同样地,当Redis内存使用达到上限时,新数据写入该如何处理?这就是淘汰策略要解决的问题。

在实际工作中,我们经常会遇到Redis内存不足的情况,特别是在处理突发流量或大数据量时。Redis提供了8种淘汰策略,就像超市有多种商品淘汰标准一样,我们需要根据业务特点选择最合适的策略。

2.1 淘汰策略全景图

策略说明适用场景
noeviction不淘汰,新写入操作报错关键数据不能丢失的场景
allkeys-lru从所有键中淘汰最近最少使用的键通用场景,平衡性能
volatile-lru从设置过期时间的键中淘汰最近最少使用的键区分永久数据和临时数据
allkeys-random从所有键中随机淘汰所有键访问概率均等
volatile-random从设置过期时间的键中随机淘汰临时数据随机淘汰
volatile-ttl从设置过期时间的键中淘汰存活时间最短的键优先淘汰即将过期的数据
allkeys-lfu从所有键中淘汰最不经常使用的键热点数据区分明显的场景
volatile-lfu从设置过期时间的键中淘汰最不经常使用的键临时数据中区分热点数据

2.2 LRU与LFU算法深度解析

在淘汰策略中,LRU(最近最少使用)和LFU(最不经常使用)是最常用的两种算法。它们就像超市淘汰商品的两种思路:

# Redis配置淘汰策略(redis.conf)
maxmemory 2gb
maxmemory-policy allkeys-lfu# 查看当前内存策略
127.0.0.1:6379> CONFIG GET maxmemory-policy
1) "maxmemory-policy"
2) "allkeys-lfu"

上述配置设置Redis最大内存为2GB,并使用allkeys-lfu淘汰策略。通过CONFIG GET命令可以验证当前配置。

⚠️ 千万要避免: 默认的noeviction策略在生产环境可能导致写入失败。我建议大家在项目上线前一定要检查这个配置。

场景案例:新闻应用热点排行榜

假设场景: 一个新闻应用使用Redis存储热点新闻排行榜,内存经常达到上限。

挑战: 热点新闻变化快,旧新闻需要及时淘汰,但突发新闻可能突然成为热点。

解决方案: 考虑到实际业务中新闻热点的变化模式,我们选择了allkeys-lfu策略:

  • LFU算法能更好识别新热点(访问频率高)
  • 配合过期时间设置(热点新闻缓存24小时)
  • 监控LFU计数器,动态调整策略参数

效果: 使用LFU策略后,热点新闻缓存命中率提升40%,冷门数据及时淘汰,内存使用稳定在安全阈值内。

三、实战:配置与优化指南

理解了Redis的过期和淘汰策略后,我们来看看如何在实际项目中配置和优化。相信大家都对这个话题很感兴趣,因为合理的配置能极大提升系统性能。

3.1 最佳配置实践

根据我的经验,不同业务场景需要不同的配置策略。下面是一些常见场景的建议:

# 电商平台配置示例(redis.conf)
maxmemory 16gb
maxmemory-policy allkeys-lru
maxmemory-samples 10# 调整定期删除策略频率
hz 10 # 默认10,增加CPU使用但更及时清理

对于电商平台,我们使用allkeys-lru策略并调整采样数量。hz参数控制定期删除的频率,增加该值会更及时清理过期键,但会增加CPU使用。

3.2 监控与调优

在实际工作中,我们经常会遇到需要监控Redis内存使用的情况。我通常是这样做的:

# 查看内存关键指标
127.0.0.1:6379> INFO memory# 重点关注:
used_memory:已使用内存
mem_fragmentation_ratio:内存碎片率
expired_keys:已过期的键总数
evicted_keys:被淘汰的键总数

💡 调优建议: 如果发现evicted_keys持续增长,说明淘汰频繁,可能需要扩容或优化数据设计。如果expired_keys很高但used_memory不降,可能是定期删除不够及时,可以适当增加hz值。

场景案例:社交平台Feed流缓存

假设场景: 社交平台的用户Feed流使用Redis缓存,每个用户最新100条Feed。

挑战: 用户量巨大,活跃用户Feed更新频繁,内存压力大。

解决方案: 考虑到实际用户活跃模式和内存限制,我们采用多层策略:

  • 使用volatile-ttl策略,设置Feed数据1小时过期
  • 配合主动刷新机制,活跃用户Feed提前刷新
  • 使用Redis模块实现二级LRU链表管理

效果: 通过这个案例中的组合策略,内存使用减少50%,用户访问延迟降低30%,达到了高性能与资源平衡的效果。

总结与思考

通过今天的讨论,相信大家对Redis的过期策略和淘汰策略有了更深入的理解。让我们简单回顾一下本文的核心内容:

  • 过期策略:定时删除(精准但耗资源)、惰性删除(高效但可能积累)、定期删除(平衡之道)
  • 淘汰策略:8种策略适应不同场景,重点关注LRU和LFU算法差异
  • 配置实践:根据业务特点选择策略,监控关键指标持续优化

在实际工作中,没有放之四海而皆准的策略。我建议大家可以多尝试几种方法,找到最适合自己业务场景的配置。根据我的经验,合理的过期和淘汰策略配置可以使Redis性能提升30%-50%。

希望通过今天的分享,能帮助大家少走弯路。让我们共同打造更高效的技术解决方案,欢迎随时交流,一起分享Redis使用经验!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/84302.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/84302.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/84302.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …

【HarmonyOS 5】 影视与直播详以及 开发案例

&#x1f3a5; ‌一、超高清低延迟直播‌ ‌4K/8K硬解能力‌&#xff1a;通过鸿蒙媒体引擎实现15Mbps码率视频流稳定解码&#xff0c;华为Pura X实测端到端延迟<80ms‌分布式渲染‌&#xff1a;支持手机拍摄→智慧屏导播→平板监看的工作流协同&#xff0c;设备间传输延迟&…

Tunna工具实战:基于HTTP隧道的RDP端口转发技术

工具概述 Tunna是一款利用HTTP/HTTPS隧道进行TCP通信的渗透测试工具&#xff0c;由SECFORCE团队开发并开源。该工具主要应用于需要绕过防火墙限制的场景&#xff0c;通过Webshell实现内网服务的端口转发&#xff0c;特别适合在仅开放80/443端口的环境中建立TCP连接。 项目地址…

c# Autorest解析

AutoRest 工具生成用于访问 RESTful Web 服务的客户端库。AutoRest 的输入是使用 OpenAPI 规范格式描述 REST API 的规范。OpenAPI(f.k.a Swagger)规范代码生成器。支持 C#、PowerShell、Go、Java、Node.js、TypeScript、Python。 安装 AutoRest 在 Windows、MacOS 或 Linux …

高中数学联赛模拟试题精选学数学系列第24套几何题

⊙ O 1 \odot O_1 ⊙O1​ 和 ⊙ O 2 \odot O_2 ⊙O2​ 交于 A A A, B B B. Y Y Y 是 ⊙ O 1 \odot O_1 ⊙O1​ 上一点, Z Z Z 是 ⊙ O 2 \odot O_2 ⊙O2​ 上一点&#xff0c; Y Z YZ YZ 通过 A A A. 过 Y Y Y 的 ⊙ O 1 \odot O_1 ⊙O1​ 的切线和过 Z Z Z 的 ⊙…

【QT】INI格式文件读写类IniApi封装

【QT】INI文件读写类IniApi封装 前言实现INI文件写入方法INI文件读取方法 测试 前言 INI格式文件是一种纯文本格式&#xff0c;使用方括[]定义节&#xff08;Section&#xff09;&#xff0c;每个节下包含键值对&#xff0c;如下图所示。该格式文件简单易读易编辑。而且在所有…

ABAP设计模式之---“童子军法则(The Boy Scout Rule)”

法则介绍 The Boy Scout Rule&#xff0c;中文一般翻译为“童子军法则”&#xff0c;是一个简单却非常有意义的软件开发原则&#xff0c;它最早由软件开发大师 Robert C. Martin (Uncle Bob) 在他的《Clean Code》一书中提出。 这条法则的核心思想非常简单&#xff1a; “确保…

BaikalDB 架构演进实录:打造融合向量化与 MPP 的 HTAP 查询引擎

导读 BaikalDB作为服务百度商业产品的分布式存储系统&#xff0c;支撑了整个广告库海量物料的存储和OLTP事务处理。随着数据不断增长&#xff0c;离线计算时效性和资源需求压力突显&#xff0c;基于同一份数据进行OLAP处理也更为经济便捷&#xff0c;BaikalDB如何在OLTP系统内…

【抖音小程序】通用交易系统-下单问题整理

在通用交易系统中&#xff0c;支付流程如下 1、服务端-预下单&#xff1a;生成参数与签名信息&#xff08;此过程不需要与抖音平台对接&#xff09; 参考 生成下单参数与签名_抖音开放平台 2、小程序用户端&#xff1a;根据返回的参数与签名&#xff0c;拉起抖音支付&#x…

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…

EurekaServer 工作原理

一、核心工作流程 二、核心组件解析 1. 自动配置引擎 入口&#xff1a;EnableEurekaServer 引入 EurekaServerMarkerConfiguration&#xff0c;创建标记Bean Marker触发条件&#xff1a;EurekaServerAutoConfiguration 检测到 Marker 存在时激活关键Bean初始化&#xff1a; …

Playwright 与 Selenium:自动化测试的两大主流工具对比

《Playwright 与 Selenium&#xff1a;自动化测试的两大主流工具对比》 *Playwright 和 Selenium 是自动化测试领域的两大主流工具&#xff0c;二者在架构设计、功能特性和适用场景上存在显著差异&#xff0c;以下是核心对比&#xff1a; 一、架构与设计理念 维度Playwright…

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

R语言速释制剂QBD解决方案之二

影响含量均一性的显著因子&#xff08;%RSD&#xff09; 数据分析表明含量均一性的弯曲性不显著。如半正态图&#xff08;图12&#xff09;所示&#xff0c;影响含量均一性的显著因子为A&#xff08;原料药粒径&#xff09;和C&#xff08;MCC/Lactose&#xff09;。 mod2 <…

大模型原理、架构与落地

近年来&#xff0c;大模型&#xff08;Large Language Models&#xff0c;LLMs&#xff09;在人工智能领域迅猛发展&#xff0c;从GPT-3到GPT-4、Claude、Gemini、文心一言、GLM等模型相继发布&#xff0c;大模型已逐渐走出实验室&#xff0c;迈向产业落地。本文将从技术原理、…

WWDC 2025 macOS 26有哪些更新点

在2025年6月10日凌晨结束的WWDC 2025发布会中&#xff0c;苹果正式发布了全新的macOS 26&#xff0c;并给其命名为Tahoe。 以下为macOS相关的主要内容&#xff1a; 命名方式改变 苹果正式将各大系统的版本号改为对应年份&#xff0c;让命名方式更直观好记&#xff0c;macOS 2…

AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年6月10日第104弹

从今天开始&#xff0c;咱们还是暂时基于旧的模型进行预测&#xff0c;好了&#xff0c;废话不多说&#xff0c;按照老办法&#xff0c;重点8-9码定位&#xff0c;配合三胆下1或下2&#xff0c;杀1-2个和尾&#xff0c;再杀4-5个和值&#xff0c;可以做到100-300注左右。 (1)定…

.NET 8集成阿里云短信服务完全指南【短信接口】

文章目录 前言一、准备工作1.1 阿里云账号准备1.2 .NET 8项目创建 二、集成阿里云短信SDK2.1 安装NuGet包2.2 配置阿里云短信参数2.3 创建配置类 三、实现短信发送服务3.1 创建短信服务接口3.2 实现短信服务3.3 注册服务 四、创建控制器五、测试与优化5.1 单元测试5.2 性能优化…

解决HuggingFace不能git clone的问题

今天在从HuggingFace上clone项目的时候&#xff0c;一直出现超时问题&#xff0c;查了很多资料没有解决&#xff0c;后来向mentor请教了一下&#xff0c;可以通过镜像的方法解决这个问题&#xff0c;所以把方法放上来&#xff0c;希望对大家有帮助。 HuggingFace的服务器在国外…

Zookeeper 集群部署与故障转移

Zookeeper 介绍 Zookeeper 是一个开源的分布式协调服务&#xff0c;由Apache基金会维护&#xff0c;专为分布式应用提供高可用、强一致性的核心基础能力。它通过简单的树形命名空间&#xff08;称为ZNode树&#xff09;存储数据节点&#xff08;ZNode&#xff09;&#xff0c;…