Redis是如何处理过期键的

数据库 Redis
​Redis在不同版本中处理过期键的机制总体一致,主要包含以下三种策略:惰性删除、定期删除 和 内存淘汰策略。

Redis在不同版本中处理过期键的机制总体一致,主要包含以下三种策略:惰性删除、定期删除 和 内存淘汰策略。以下是Redis处理过期键的详细介绍及各版本的相关变化:

1. 基本机制

Redis的键过期时间处理方式包含以下两种主要策略:

(1)惰性删除(Lazy Deletion)

  • 机制:仅在尝试访问一个键时,Redis会检查其是否过期。如果过期,则在访问时删除键。
  • 优点:不需要额外的后台资源,节省CPU开销。
  • 缺点:如果某些过期键长时间不被访问,它们会一直占用内存。

(2)定期删除(Periodic Deletion)

  • 机制:Redis会周期性地随机检查一部分设置了过期时间的键,如果发现过期键,则删除它们。
  • 频率:由 hz 参数控制,默认每秒执行10次。每次操作中,Redis会从过期字典中抽样一定数量的键进行检查和删除。
  • 优点:保证大部分过期键能够及时被删除。
  • 缺点:如果过期键数量巨大,可能会造成删除不及时,增加内存压力。

(3)内存淘汰策略

  • 触发条件:当内存使用量达到 maxmemory 设置的上限,Redis会根据配置的淘汰策略(如LRU、LFU等)删除一部分键,包括未设置过期时间的键。
  • 作用:防止因过多未删除的过期键导致内存溢出。

2. Redis各版本的处理机制和优化

Redis 2.x

  • 实现了基本的过期机制,包括惰性删除和定期删除。
  • 定期删除频率较低,可能导致某些过期键未及时删除。

Redis 3.x

  • 改进定期删除逻辑:优化了定期删除的采样和迭代策略,提升了过期键的清理效率。
  • 增强内存淘汰策略:引入了 volatile-lfu 和 allkeys-lfu 策略,使得键的访问频率成为淘汰的重要依据。

Redis 4.x

  • 改进定期删除算法:定期删除更加智能,抽样和逐步删除的策略更高效,减少了对CPU的突发压力。
  • 引入内存诊断工具:提供命令帮助用户检测内存中的过期键比例和内存占用情况(如 INFO 命令中的 expired_keys 和 evicted_keys)。

Redis 5.x

  • 引入异步删除:对一些大对象(如大型哈希表或集合)采用异步删除策略,以避免主线程因删除操作被阻塞。
  • 改进后台清理线程:后台任务的定期清理更加智能,能根据实例负载动态调整清理频率。

Redis 6.x

  • 增强多线程支持:在开启多线程的模式下(针对I/O操作),过期键的清理速度进一步提高。
  • 改进淘汰机制:优化内存淘汰策略的性能,减少在高并发场景下可能的延迟。

Redis 7.x

  • 支持细粒度的过期时间(毫秒级):允许键以毫秒为单位设置过期时间,提升时间精度。
  • 加强过期键的统计:提供了更多关于过期键的统计信息和指标。
  • 引入动态配置机制:用户可以动态调整 hz 参数、maxmemory 策略等,无需重启Redis实例。

3. 参数相关配置

以下是与过期键相关的重要参数:

  • hz:控制定期任务(包括过期键检查)的执行频率,默认10。
  • maxmemory-policy:设置内存淘汰策略,包括:
  • volatile-lru:在所有带有过期时间的key中使用LRU算法淘汰数据。
  • allkeys-lru:在所有的key中使用LRU算法淘汰数据。
  • volatile-ttl:在所有带有过期时间的key中,优先淘汰TTL(Time To Live)最短的数据。
  • allkeys-random:在所有带有过期时间的key中随机淘汰数据。
  • volatile-random:在所有的key中随机淘汰数据。
  • noeviction:不淘汰任何数据,在内存不足时直接返回错误。
  • maxmemory:设置Redis实例允许使用的最大内存。

4. 性能优化建议

  • 合理设置过期时间:避免大量键同时过期,导致CPU负载激增。
  • 调整 hz 参数:提高定期删除频率,适当加速过期键清理。
  • 使用异步删除:对于大对象,采用异步删除以降低主线程阻塞风险。
  • 优化内存淘汰策略:根据业务需求选择合适的淘汰策略,防止内存不足导致实例不可用。

通过这些机制和优化策略,Redis能够高效地管理过期键并减少对性能的影响。

责任编辑:武晓燕 来源: 程序员故里
相关推荐

2023-09-12 14:29:28

数据中心服务器

2023-09-13 10:28:37

2021-03-24 10:40:26

Python垃圾语言

2014-11-10 10:52:33

Go语言

2024-04-16 13:32:57

2023-10-04 07:35:03

2023-09-19 22:41:30

控制器HTTP

2015-08-31 10:14:30

程序员处理代码糟糕代码

2015-09-01 11:20:58

程序员糟糕代码

2021-01-18 05:13:04

TomcatHttp

2022-08-08 13:45:12

Redis面试Hash

2013-03-20 11:01:37

Redis客户端连接

2018-12-25 09:44:42

2019-08-15 10:20:19

云计算技术安全

2012-12-12 09:49:41

2020-12-29 09:11:33

LinuxLinux内核

2017-03-13 13:21:34

Git处理大仓库

2017-10-26 08:43:18

JavaScript内存处理

2021-03-01 07:31:53

消息支付高可用

2019-12-23 10:20:12

Web图片优化前端
点赞
收藏

51CTO技术栈公众号