过期策略默认使用惰性删除跟定期删除 🏠
- 过期策略?
- 这四种过期策略的由来, 解决什么问题, 主要功能,优势劣势
- 定期删除策略
- 优化定期删除策略
- 随机删除策略
- 优化 随机删除策略
你没办法唤醒一个装睡的人:当一个人与你不在一个频率上时,就算你说的每一个字都有道理,他也听不进去。而且,你说得越有道理,他就越觉得你很烦
过期策略?
过期策略是 Redis 用来处理过期键的一种机制。当 Redis 中的键值对设置了过期时间后,在过期时间到达时,会自动触发过期键删除策略,将过期的键值对删除以释放内存空间。
Redis 提供了以下四种过期策略:
- 定时删除策略:每个设置了过期时间的 key 都会创建一个定时器(timer),当时间到期时,这个 key 将会被自动删除。
- 惰性删除策略:只有当对 key 进行操作时,才会检查该 key 是否过期,如果过期则删除。
- 定期删除策略:每隔一段时间,程序会对过期键进行扫描,删除过期键。这种策略是惰性删除策略的补充,因为有些过期键可能会在惰性删除策略中被忽略。
- 随机删除策略:Redis 将设置过期时间的 key 放在一个字典中,并设置一个虚拟时间,每次随机删除字典中的一部分过期 key。这种策略可以避免在同一时间点过多的 key 过期而导致 Redis 阻塞。
redis 默认策略是 定期删除策略和惰性删除策略
定期删除策略是 Redis 删除过期键的默认策略。当 Redis 启动时,会自动创建一个定时任务,定期扫描已设置过期时间的键,将过期的键从数据库中删除,并释放内存空间。在 Redis 中,定期删除策略和惰性删除策略是两种默认的过期键删除策略。
可以在 Redis 的配置文件中通过 maxmemory-policy
参数来设置其他的过期键删除策略,如随机删除策略和最近最少使用删除策略。但是,定期删除策略和惰性删除策略是不需要配置的,它们是 Redis 的默认策略。
这四种过期策略的由来, 解决什么问题, 主要功能,优势劣势
这四种过期策略的由来是为了解决 Redis 中 key 的过期问题,Redis 中的 key 可以设置过期时间,在过期时间到达之后,key 将被自动删除。为了实现这一功能,Redis 引入了四种过期策略:
- 定时删除策略:定时删除策略是 Redis 最早的过期策略,它会为每个设置了过期时间的 key 创建一个定时器(timer),在定时器到期时,这个 key 将被自动删除。这种策略可以保证 key 能够在过期时间到达时立即被删除,但是会占用大量的 CPU 资源,尤其是在 Redis 中存在大量设置了过期时间的 key 时,CPU 开销会非常高。
- 惰性删除策略:惰性删除策略是 Redis 的第二种过期策略,它是一种节约资源的方式,只有当对 key 进行操作时,才会检查该 key 是否过期,如果过期则删除。这种策略可以避免定时删除策略的 CPU 开销,但是在 key 过期后,如果很长时间没有被访问,那么这个 key 就会一直留在 Redis 中,浪费空间。
- 定期删除策略:定期删除策略是对惰性删除策略的补充,它每隔一段时间,程序会对过期键进行扫描,删除过期键。这种策略可以避免惰性删除策略中的问题,但是会占用一定的 CPU 资源,并且如果扫描的频率过低,就可能导致过期键在 Redis 中一直存在,如果扫描的频率过高,就可能影响 Redis 的性能。
- 随机删除策略:随机删除策略是 Redis 中最常用的过期策略,它将设置过期时间的 key 放在一个字典中,并设置一个虚拟时间,每次随机删除字典中的一部分过期 key。这种策略可以避免在同一时间点过多的 key 过期而导致 Redis 阻塞,同时也不会像定时删除策略那样占用大量的 CPU 资源。但是,这种策略可能会造成一些 key 在过期时间到达之前就被删除,或者过期时间已到但是仍然没有被删除的情况。
综上所述,不同的过期策略在解决 Redis 中 key 过期问题时,都有各自的优劣势,应根据实际的应用场景选择合适的过期策略。
定期删除策略
定期删除策略是 Redis 的一种过期策略,它每隔一段时间,程序会对过期键进行扫描,删除过期键。
具体来说,Redis 会每隔一段时间执行一次定期删除操作,具体的间隔时间由 redis.conf
文件中的 hz
参数来控制,默认值为 10,表示每秒钟执行 10 次。当 Redis 检测到某个 key 已经过期时,它不会立即将该 key 删除,而是将该 key 加入到一个专门的过期字典中。在定期删除操作时,Redis 会对过期字典中的键进行扫描,删除已过期的键。
定期删除策略的优点在于它可以自动地删除过期键,避免了过期键长时间占用内存的问题,同时也不会像定时删除策略那样占用大量的 CPU 资源。但是,这种策略也存在一些缺点。首先,如果过期键在过期时间到达之前就被访问了,那么它就不会被定期删除,导致内存占用率增加;其次,如果定期删除的频率设置得太低,就可能导致过期键在 Redis 中一直存在,浪费内存;如果定期删除的频率设置得太高,就可能影响 Redis 的性能。因此,在使用定期删除策略时,需要根据实际情况来确定删除的频率,以平衡内存占用和性能损失。
优化定期删除策略
定期删除策略在 Redis 中是默认开启的,因此你不需要进行任何配置就可以使用它。
如果你需要优化定期删除策略的效果,可以考虑以下几点:
- 调整
hz
参数的值:默认情况下,Redis 每秒钟执行 10 次定期删除操作。如果你的系统负载较低,可以适当降低该值,减少定期删除操作对系统性能的影响;如果你的系统负载较高,可以适当提高该值,加快过期键的删除速度。 - 调整 Redis 的最大内存限制:如果 Redis 的内存使用率达到了最大内存限制,那么定期删除策略会变得非常重要,因为它可以自动删除过期键,释放内存空间。因此,你可以适当调整 Redis 的最大内存限制,以避免内存占用过高导致系统崩溃。
- 避免批量删除操作:定期删除策略的效率取决于过期键的数量。如果你在 Redis 中进行了大量的删除操作,就会导致定期删除操作的效率降低。因此,你应该尽量避免批量删除操作,避免对定期删除策略的影响。
- 合理设置过期时间:如果你的系统中有大量的键需要设置过期时间,那么你应该尽量合理地设置过期时间。如果过期时间设置得过短,就会导致定期删除策略频繁执行,影响系统性能;如果过期时间设置得过长,就会导致过期键长时间占用内存,影响系统的稳定性。因此,你需要根据实际情况来确定过期时间的长度。
随机删除策略
随机删除策略(Random Eviction Policy)是 Redis 中一种常用的过期键删除策略。它的实现原理非常简单:每次定期删除操作时,从已设置过期时间的键集合中随机选择一定数量的键,并删除这些键中已过期的键。
随机删除策略的主要功能是定期删除过期键,释放内存空间。它的优势在于删除过期键的效率比较高,因为它每次只删除一部分过期键,而不是全部删除。此外,由于它是随机选择过期键进行删除,因此可以有效地避免热点键的出现。
但是,随机删除策略也有一些劣势。首先,它不能保证在一定时间内删除所有过期键。因为它是随机选择过期键进行删除,所以有可能会出现某些过期键一直没有被删除的情况。其次,由于它是随机选择过期键进行删除,因此有可能会误删一些还没有过期的键,导致数据丢失。
如果你需要使用随机删除策略,可以在 Redis 的配置文件中设置 maxmemory-policy
参数为 random
。此外,你可以通过调整 maxmemory-samples
参数的值来控制每次随机选择的键的数量。
优化 随机删除策略
开启随机删除策略:
要开启随机删除策略,可以在 Redis 的配置文件中设置 maxmemory-policy
参数为 random
。例如,在 redis.conf
文件中添加以下配置:
maxmemory-policy random
这将会使用随机删除策略来删除过期键。
优化随机删除策略:
为了优化随机删除策略,我们可以调整 maxmemory-samples
参数的值来控制每次随机选择的键的数量。默认情况下,maxmemory-samples
的值是 5。这意味着每次随机选择 5 个键进行检查和删除。如果你的系统中有很多过期键,可以考虑将 maxmemory-samples
的值增加到一个更大的数值,以提高删除过期键的效率。
另外,如果你的系统中有一些热点键(被频繁访问的键),你可以将这些键的过期时间设置为不同的值,以避免它们同时过期,从而避免过期键集合中出现热点键。