文章目录
- 1. 引入
- 2. 数据过期策略
- 2.1 策略一:惰性删除
- 2.1.1 原理
- 2.1.2 优点
- 2.1.3 缺点
- 2.2 策略二:定期删除
- 2.2.1 原理
- 2.2.2 模式
- 2.2.3 优点
- 2.2.4 缺点
- 2.3 两种策略的比较
- 3. 总结
1. 引入
Redis 是一个 高性能 的非关系型数据库,由于 Redis 的数据被保存在 内存 中,所以会比 MySQL 这种把数据保存在 磁盘 中的数据库的性能高很多。但是内存不像磁盘那样存储空间特别大,内存的大小一般不超过 1T,而 1/2/4T 的磁盘倒很常见,所以在使用内存时就不能像使用磁盘一样随意,不能将大量数据 无限期 地缓存。
所以,缓存在 Redis 中的数据需要有过期时间,一旦过期时间到了,Redis 就会清理它,而 Redis 清理这些过期数据使用的策略就是本文要讲的内容——数据过期策略,即 Redis 清理过期数据的方式。
2. 数据过期策略
2.1 策略一:惰性删除
2.1.1 原理
当操作 (读/写) 一个键时,Redis 才检查这个键是否过期,如果过期就删除它。
2.1.2 优点
- 消耗的 CPU 资源较少:相较第二种策略,本策略不会定期检查键是否过期,而只在操作一个键时才检查,所以消耗的 CPU 资源较少。
2.1.3 缺点
- 消耗的 内存 资源较多:如果一个键过期,但没有被操作,则不会通过惰性删除的方式清理这个键,这些没有被操作的过期键会浪费内存资源。
2.2 策略二:定期删除
2.2.1 原理
Redis 定期随机抽取一些键,检查这些键是否过期,批量删除过期的键。
注:在定期删除策略中,Redis 不会一次性查看所有键的过期情况,因为这样太浪费时间了,而是在设置了过期时间的键中随机抽取一部分出来,查看这部分键是否过期。
2.2.2 模式
定期删除策略分为两种模式:
模式 | SLOW 模式 | FAST 模式 |
---|---|---|
执行频率 | 默认 10hz (1s 内执行 10 次) | 不固定,但两次执行间隔 ≥ 2ms |
每次执行耗时 | ≤ 25ms | ≤ 1ms |
注:
- 可以通过配置
redis.conf
的hz
来调整 SLOW 模式定期删除的执行频率。例如hz 20
表示 1s 内执行 20 次。但不要将其设置得过大或过小,因为过高的执行频率会占用过多的 CPU 资源;过低的执行频率会占用过多的内存资源,从而和惰性删除类似。 - 定期删除会阻塞 Redis 的主进程,和 Java 在 GC (Garbage Collecting,垃圾收集) 时 STW (Stop The World) 类似,防止业务操作影响 清理过期键/垃圾收集。然而一般不会让 清理过期键/垃圾收集 这种操作过多地阻塞 业务操作,所以需要 限制 清理过期键/垃圾收集 的耗时,从而尽量减少对 Redis 主进程/Java 程序中的业务 的影响。
2.2.3 优点
- 比较灵活:本策略可以通过调整
hz
参数来配置 SLOW 模式定期删除的执行频率,这时根据 服务器的性能 和 业务需求 配置合理的执行频率,从而在 CPU 和 内存 资源的消耗上达到相对平衡。 - 消耗的 内存 资源较少:相较第一种策略,本策略删除过期数据的时机大概率会早一些,从而减少对 内存 资源的占用。
2.2.4 缺点
- 消耗的 CPU 资源较多:本策略需要定期检查一部分键是否过期,如果配置了不合理的执行频率,则可能消耗较多的 CPU 资源。
2.3 两种策略的比较
数据过期策略 | 惰性删除 | 定期删除 |
---|---|---|
原理 | 在操作时检查键是否过期,如果过期就删除 | 定期随机抽取部分键,检查过期情况, 批量删除过期键 |
消耗的 CPU 资源 | 较少,只需要在操作时检查过期 | 较多,需要定期检查过期情况 <具体和执行频率有关> |
消耗的 内存 资源 | 较多,只会在操作时删除过期键 | 较少,定期删掉过期键 <具体和执行频率有关> |
Redis 通过 同时使用这两种策略 来发挥各个策略的优势,进而平衡 CPU 和 内存 的消耗。
3. 总结
Redis 的数据过期策略指的是 Redis 清理过期数据的方式,共有两种:
- 惰性删除:在操作时检查键是否过期,如果过期就删除。占用的 CPU 资源相对较少。
- 定期删除:定期随机抽取部分键,检查过期情况,批量删除过期键。有两种具体的定期删除模式——SLOW 和 FAST 模式,可以通过
hz
调整 SLOW 模式定期删除的执行频率,从而平衡 CPU 和 内存 资源的占用。