中间件专栏之Redis篇——Redis中过期key删除和内存淘汰策略

news/2025/3/4 5:47:45/

在Redis中,过期键的删除内存淘汰策略是管理Redis内存的重要机制,确保Redis可以高效地使用内存,并避免由于内存不足导致的性能问题。以下是这两个概念的详细介绍:

一、过期键删除机制

Redis支持对存储的键设置过期时间(TTL, Time to Live),过期时间到达后,Redis会自动删除这些键。Redis对过期键的删除机制并不是严格的“实时”删除,而是采用了一些优化策略。

1. 过期键的删除方式

Redis中,过期键删除的方式分为两种:

  • 定期删除:Redis每隔一定时间会随机检查一部分带有过期时间的键,并删除那些已经过期的键。默认情况下,每100毫秒会进行一次检查。

  • 惰性删除:每次访问某个键时,如果发现该键已过期,Redis会在访问时删除这个键。这意味着过期的键不会立即删除,直到被访问时才会删除。

这两种方式的结合保证了Redis能够在保证性能的同时,避免内存占用过多的过期键。

2. 过期键的删除策略
  • 惰性删除:即键在被访问时,如果发现其过期,则立即删除。虽然这种方法简单,但如果没有被访问到的过期键仍然占用内存,可能会导致内存浪费。

  • 定期删除:Redis每隔一定时间会扫描一定比例的过期键并删除,这可以有效防止过期键占用内存,但也有一定的性能开销。

3. 过期策略的缺点
  • 延迟删除:由于过期键是在访问时被删除的,如果某个过期键长时间没有被访问到,它会一直占用内存,直到它被随机扫描到。
  • 性能开销:定期删除机制会消耗CPU和内存资源,尤其在大规模数据集和高并发环境下。

二、内存淘汰策略

Redis采用内存淘汰策略来管理内存使用,确保Redis在内存使用达到限制时不会出现崩溃。Redis提供了多种内存淘汰策略,这些策略决定了在内存不足时,Redis会如何选择和删除数据。

1. 内存淘汰策略类型

在Redis配置中,maxmemory-policy设置了内存淘汰的策略,当Redis的内存使用超过了maxmemory配置指定的限制时,会根据选择的策略决定如何处理内存:

  • noeviction(默认):当内存达到限制时,Redis会拒绝所有写入请求,并返回一个错误提示(OOM command not allowed when used memory > 'maxmemory')。这意味着在内存不足时,Redis会拒绝写入操作,而不会自动删除数据。

  • allkeys-lru:Redis会从所有键中删除最少使用的键(LRU,Least Recently Used)。LRU算法会选择最近最少使用的键进行删除。

  • volatile-lru:只从设置了过期时间的键中删除最少使用的键。如果某个键已经过期并且被选中进行删除,则删除该键。

  • allkeys-random:从所有键中随机删除一些键。

  • volatile-random:只从设置了过期时间的键中随机删除一些键。

  • volatile-ttl:只从设置了过期时间的键中,删除那些剩余时间最短的键(TTL,Time to Live)。

  • allkeys-lfu(Redis 4.0+):Redis会从所有键中删除最不常使用的键。LFU(Least Frequently Used)算法会选择那些使用频率最低的键进行删除。

  • volatile-lfu(Redis 4.0+):只从设置了过期时间的键中删除最不常使用的键。

2. 内存淘汰策略的选择

不同的内存淘汰策略适用于不同的使用场景,下面是一些常见策略的适用情况:

  • noeviction:适用于对数据的完整性有很高要求的场景,在这种场景下,Redis会拒绝写入操作,直到有足够的内存为止,避免丢失数据。

  • allkeys-lru:适用于希望缓存数据可以被替换的场景。LRU算法能够较好地保证常用数据的保留,淘汰不常用的数据。

  • volatile-lru:适用于希望对过期数据进行管理的场景,确保只有那些设置了过期时间的数据被淘汰。

  • allkeys-random:适用于需要简单且不需要考虑过期的场景,或者数据集较小且内存不紧张的场景。

  • volatile-ttl:适用于希望淘汰即将过期的数据的场景,例如会话管理中,接近过期的会话优先被清除。

  • allkeys-lfu:适用于缓存热点数据的场景,LFU算法能够根据数据的访问频率来选择需要淘汰的数据,避免热门数据被删除。

总结

  • 过期键删除:Redis通过惰性删除和定期删除相结合的方式来管理过期键。惰性删除在键被访问时删除过期键,而定期删除则定期扫描并删除过期的键。这些方法虽然能够有效减少内存的浪费,但仍可能导致延迟删除和性能开销。

  • 内存淘汰策略:Redis提供多种内存淘汰策略,在内存达到配置限制时,Redis根据不同的策略删除键,以释放内存。用户可以根据业务需求选择合适的策略,如LRU、LFU等。

 


http://www.ppmy.cn/news/1576465.html

相关文章

技术速递|Copilot Usage Advanced Dashboard 教程

作者:Xuefeng Yin 排版:Alan Wang Copilot Usage Advanced Dashboard 是为了充分利用 GitHub Copilot API 中的几乎所有数据,用到的 API 有: List teams of an onganization Get a summary of Copilot metrics for a team Get C…

MySQL数据库基本概念

目录 什么是数据库 从软件角度出发 从网络角度出发 MySQL数据库的client端和sever端进程 mysql的client端进程连接sever端进程 mysql配置文件 MySql存储引擎 MySQL的sql语句的分类 数据库 库的操作 创建数据库 不同校验规则对查询的数据的影响 不区分大小写 区…

C语言复习4:有关数组的基础常见算法

# 数组的常见算法 - 查找算法 1. 基本查找/顺序查找 2. 二分查找/折半查找 3. 插值查找 4. 分块查找 5. 哈希查找 6. 树表查找 7. 斐波那契查找 - 排序算法(顾名思义,就是把没有顺序的…

UniApp 按钮组件 open-type 属性详解:功能、场景与平台差异

文章目录 引言一、open-type 基础概念1.1 核心作用1.2 通用使用模板 二、主流 open-type 值详解2.1 contact - 客服会话功能说明平台支持代码示例 2.2 share - 内容转发功能说明平台支持注意事项 2.3 getUserInfo - 获取用户信息功能说明平台支持代码示例 2.4 getPhoneNumber -…

P8680 [蓝桥杯 2019 省 B] 特别数的和

P8680 [蓝桥杯 2019 省 B] 特别数的和 - 洛谷 题目描述 小明对数位中含有2、0、1、9的数字很感兴趣(不包括前导0),在1到40中这样的数包括1、2、9、10至32、39和40,共28个,他们的和是574。 请问,在1到n中&…

【Map vs Set】:Java数据存储的“双子星”对决

个人主页:♡喜欢做梦 欢迎 👍点赞 ➕关注 ❤️收藏 💬评论 目录 🍰一、搜索 🍮1.概念 🍮2.模型 🍰二、Map 🍨1.什么是Map? 🍨2.Map的实例化 &…

Suspense 使用方法

在这个组件树中有多个嵌套组件&#xff0c;要渲染出它们&#xff0c;首先得解析一些异步资源。如果没有 <Suspense>&#xff0c;则它们每个都需要处理自己的加载、报错和完成状态。在最坏的情况下&#xff0c;我们可能会在页面上看到三个旋转的加载态&#xff0c;在不同的…

版图自动化连接算法开发 00001 ------ 直接连接两个给定的坐标点

版图自动化连接算法开发 00001 ------ 直接连接两个给定的坐标点 引言正文定义坐标点的类绘图显示代码直接连接两个坐标点引言 由于人工智能的加速普及,每次手动绘制版图都会觉得特别繁琐,作者本人在想可否搞一个自动化连接器件端口的算法,后期可以根据一些设定的限制进行避…