Redis设置Key过期时间
在 Redis 中,可以通过特定的命令为 Key 设置过期时间,使得 Key 在一定时间后自动删除,这对于管理缓存、验证码等临时数据非常有用。
解决方法
1. Redis过期删除策略
1.1 如何实现过期策略
对一个 key 设置了过期时间时,Redis 会把该 key 带上过期时间存储到一个过期字典中,字典保存了数据库中所有 key 的过期时间。
1.2 如何实现删除策略
1.2.1 常见的三种过期删除策略
-
定时删除:指在指定的时间点自动删除某些内容或文件。
-
惰性删除:可能指的是一种被动或延迟的删除方式,即在某些条件下或触发某些事件后才进行删除。
-
定期删除:指按照一定的时间间隔(如每天、每周等)自动删除某些内容或文件。
1.2.2 Redis 使用的过期删除策略
惰性删除:
-
客户端:
-
这是流程的起点,表示用户或应用程序发起了一个请求。
-
-
请求 key:
-
客户端请求一个特定的数据项,这个数据项通过一个唯一的标识符(key)来标识。
-
-
是否过期:
-
这是一个决策点,系统需要检查请求的 key 是否已经过期。这通常涉及到检查 key 的有效期限或最后访问时间。
-
-
是(删除 key):
-
如果 key 已经过期,流程进入这一分支。系统将执行删除操作,移除这个过期的 key 及其关联的数据。
-
-
返回 null:
-
删除操作完成后,系统向客户端返回一个 null 值,表示请求的数据项已被删除,不再可用。
-
-
结束:
-
流程结束,客户端接收到 null 值后,可以进行相应的处理,如提示用户数据已过期或删除。
-
-
否(返回数据):
-
如果 key 没有过期,流程进入这一分支。系统将检索并返回与该 key 关联的数据。
-
-
结束:
-
流程结束,客户端接收到请求的数据,可以进行进一步的处理或显示。
-
也就是说删除操作是在数据被请求时才进行的,而不是预先计划的。这种策略可以减少不必要的删除操作,只有在数据确实不再需要时才进行删除
定时删除:
-
开始:
-
这是流程的起点,表示定期删除过程的开始。
-
-
过期字典随机抽取:
-
在这一步,系统从存储过期数据的字典中随机抽取一部分数据进行处理。
-
-
删除过期 key:
-
系统检查抽取的数据中哪些 key 已经过期,并执行删除操作。
-
-
执行时间上限:
-
这是一个决策点,系统检查删除操作的执行时间是否超过了预设的时间上限。
-
如果执行时间超过了上限,流程将跳转到“结束”步骤,以避免过长的删除操作影响系统性能。
-
-
过期 key 超过 25%:
-
另一个决策点,系统检查被抽取的数据中过期的 key 是否超过了 25%。
-
如果过期的 key 超过了 25%,说明有大量的数据需要删除,流程将返回到“过期字典随机抽取”步骤,继续处理更多的数据。
-
如果过期的 key 没有超过 25%,流程将进入“结束”步骤。
-
-
结束:
-
这是流程的终点,表示定期删除过程的结束。
-
也就是说删除操作是按照一定的周期进行的,而不是在数据被请求时才进行。这种策略有助于系统定期清理过期数据,保持系统的整洁和性能。
2. Redis内存淘汰策略
-
noeviction(不淘汰数据):
-
当内存不足以容纳新写入数据时,Redis将拒绝执行写入操作(如SET、LPUSH等)。
-
这种策略不会主动删除任何数据,适用于对数据完整性要求非常高的场景。
-
-
进行数据淘汰:
-
当内存不足以容纳新写入数据时,Redis将根据配置的淘汰策略来删除一些数据以释放内存。
-
这种策略适用于需要动态调整内存使用的场景。
-
-
存在过期时间数据:
-
这类数据是指设置了过期时间的键(key),Redis可以对这类数据应用以下几种淘汰策略:
-
volatile-random:从设置了过期时间的键中随机选择一些进行删除。
-
volatile-ttl:从设置了过期时间的键中选择即将过期的键进行删除。
-
volatile-lru(Least Recently Used):从设置了过期时间的键中选择最近最少使用的键进行删除。
-
volatile-lfu(Least Frequently Used):从设置了过期时间的键中选择使用频率最低的键进行删除。
-
-
-
所有数据:
-
这类数据是指所有存储在Redis中的键,包括设置了过期时间和未设置过期时间的键。Redis可以对这类数据应用以下几种淘汰策略:
-
allkeys-random:从所有键中随机选择一些进行删除。
-
allkeys-lru:从所有键中选择最近最少使用的键进行删除。
-
allkeys-lfu:从所有键中选择使用频率最低的键进行删除。
-
-
通过这些策略,Redis可以在内存达到最大限制时,根据实际需求和数据的重要性来灵活地选择哪些数据应该被删除,以确保系统的稳定性和性能。