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

Redis的过期策略及其优缺点

Redis 的过期策略是指 Redis 如何处理设置了过期时间的键值对。Redis主要有两种过期策略:惰性删除、定期删除,以及一种辅助机制内存淘汰策略。

惰性删除(被动删除)
原理:惰性删除是Redis最简单的过期策略,也是默认的过期。当客户端尝试访问一个已过期的键时,Redis会检查该键是否已过期,如果已过期,则立即删除该键,并返回空值。

优点
按需清理,减少CPU开销:只有在访问过期键时才会触发删除操作,减少了不必要的删除开销。在高并发场景下,这种按需清理的方式可以避免因频繁扫描过期键而导致的CPU资源浪费。

缺点

  • 内存泄漏问题:如果大量过期键在被访问之前一直未被访问,这些键会一直占用内存空间,可能导致内存泄漏问题。
  • 突发访问压力:当大量过期键同时被访问时,可能会导致瞬间的高负载,影响系统性能。

适用场景:适用于对内存占用要求不高,且过期键访问频率较高的场景。

定期删除(主动删除)
原理:Redis会定期检查并删除已过期的键。每次检查会随机选择一定数量的键进行过期检查和删除。具体流程如下:

  • 随机抽样:从每个数据库中随机选取一定数量的键(默认每次检查20个键)。

  • 删除判断:若超过25%的抽样键已过期,则重复抽样和删除过程,直至比例低于25%或达到时间限制。

  • 频率控制:通过配置hz参数调整每秒执行的定期任务次数(默认10次/秒),平衡CPU和内存效率。

  • hz 10 # 默认值,可调整为 1~500(通常不超过 100)

优点:
及时释放内存:通过定期检查,能够及时删除过期键,释放内存空间,避免内存被无用数据占用,也避免了集中式的扫描带来的性能问题。

缺点

  • 内存占用波动:由于定期删除的频率和数量有限,可能会导致内存占用在某些时刻较高,尤其是在过期键较多时。
  • CPU资源占用:定期检查和删除操作会占用一定的CPU资源,尤其是在过期键较多的情况下。

适用场景:适用于对内存占用有一定要求,且需要及时释放过期键内存的场景。

内存淘汰策略(辅助机制)
原理:当内存达到maxmemory限制时,Redis会根据配置的淘汰策略删除键,即使部分键未过期。定期淘汰策略可以根据不同的内存淘汰算法进行配置,常见的有:

maxmemory 4gb           # 设置 Redis 最大内存限制(如 4GB:maxmemory 4gb)
maxmemory-policy volatile-ttl  # 常用策略:优先删除 TTL 短的键
  • volatile-ttl:优先删除剩余存活时间(TTL)最短的键。
  • volatile-lru:在设置过期时间的键中,删除最近最少使用的(LRU)。
  • volatile-lfu:在设置过期时间的键中,删除最不经常使用的(LFU)。
  • allkeys-lru/allkeys-lfu:从所有键中按LRU/LFU淘汰。
  • volatile-random/allkeys-random:随机删除键。
  • noeviction(默认):拒绝写入新数据,直到释放足够内存。

优点

  • 主动管理内存:通过主动淘汰未过期但占用较多内存的键,能够更有效地管理内存,避免内存不足导致的问题。
  • 灵活性高:可以根据不同的业务需求选择合适的淘汰算法,灵活配置内存管理策略。

缺点

  • 复杂度高:实现机制较为复杂,需要配置和管理不同的淘汰算法。
  • 数据丢失风险:可能会导致一些未过期但重要的键被误淘汰,需要谨慎配置。

适用场景:适用于内存资源有限,且需要主动管理内存的场景,例如在高并发、大数据量的分布式系统中。


http://www.kler.cn/a/567241.html

相关文章:

  • 独立开发者的内容营销教程
  • Java 并发编程之synchronized
  • 线代[9]|线性代数主要内容及其发展简史(任广千《线性代数的几何意义》的附录1)
  • 面试基础---Spring 生态---深入剖析 Spring 中 @Bean 与 @Component
  • VUE3+Vite使用TailwindCSS【若依前后端分离框架】
  • 1-PostgreSQL 简介
  • 【网络安全】从NA到P1,我是如何扩大思路的?
  • 自然语言处理:词频-逆文档频率
  • 脚本无法获取响应主体(原因:CORS Missing Allow Credentials)
  • FREERTOS的三种调度方式
  • 【网络安全 | 渗透工具】小程序反编译分析源码 | 图文教程
  • React Native 核心技术知识点快速入门
  • MacDroid for Mac v2.3 安卓手机文件传输助手 支持M、Intel芯片 4.7K
  • 7.2 - 定时器之计算脉冲宽度实验
  • JMeter 引入 JAR 包的几种方法
  • 【Qt】ffmpeg照片提取、视频播放▲
  • Linux学习——退出vi编辑模式
  • Python中字符串的常用操作
  • Java 大视界 -- Java 大数据在智能安防入侵检测与行为分析中的应用(108)
  • 大模型工程师学习日记(五):基于LangServe的AI服务架构深度解析