上一篇地址:整理好了!2024年最常见 20 道 Redis面试题(八)-CSDN博客
十七、Redis 的过期策略有哪些?
Redis 的过期策略主要有三种:
-
定时删除:当为一个键设置了过期时间后,Redis 会创建一个定时器。当定时器到达过期时间时,Redis 会自动执行删除操作。这种方式的优点是能够保证内存被尽快释放,但缺点是如果过期的键非常多,删除这些键会占用大量的 CPU 时间,可能会影响到服务器的响应时间和吞吐量。
-
惰性删除:Redis 不会在键过期时立即删除它,而是在每次访问该键时进行检查,如果发现键已过期,则进行删除操作。这种方式的优点是对 CPU 比较友好,因为只有在访问键时才会检查和删除过期键,因此不会占用太多的系统资源。不过,缺点是如果一个键过期后长时间未被访问,它所占用的内存将不会被释放,可能导致内存泄露。
-
定期删除:Redis 会定期执行删除操作,随机检查一定数量的键,并删除其中的过期键。这种方式的优点是可以在一定程度上限制删除操作对 CPU 的影响,并且能够删除过期数据以减少对内存的无效占用。不过,它的缺点是在内存清理方面不如定时删除,同时在 CPU 时间友好方面不如惰性删除。
实际上,Redis 采用的是惰性删除和定期删除的组合策略,以在 CPU 和内存使用之间取得平衡。在 Redis 4.0 版本之后,还引入了 lazyfree-lazy-expire
参数,允许异步删除过期键,进一步优化了性能。此外,Redis 的过期字典用于存储所有键的过期时间,使得过期键的查找和删除更加高效。
十八、Redis 的 LRU 缓存淘汰策略是如何工作的?
Redis 的 LRU(Least Recently Used,最近最少使用)缓存淘汰策略是一种基于数据访问模式的内存淘汰机制,用于在内存达到限制时决定哪些数据应该被删除。以下是 LRU 策略在 Redis 中的工作原理:
-
数据访问记录:Redis 维护了一个内部的数据结构,通常是链表,用于记录每个键的访问顺序。当一个键被访问时,它会被移动到链表的头部,表示最近被访问过。
-
内存限制:Redis 配置中有一个
maxmemory
选项,用于设置最大内存使用量。当 Redis 的内存使用量达到这个限制时,会触发内存淘汰策略。 -
淘汰过程:
- 当 Redis 需要为新数据腾出空间时,它会根据 LRU 策略检查链表中的键。
- 链表尾部的键表示最长时间没有被访问过,因此它们是被淘汰的首选。
- Redis 会从链表尾部开始,逐个检查并删除这些键,直到腾出足够的空间。
-
配置选项:Redis 提供了不同的内存淘汰策略配置选项,
allkeys-lru
是其中之一,它表示在所有键中使用 LRU 策略进行淘汰。此外,还有volatile-lru
,它仅在设置了过期时间的键中使用 LRU 策略淘汰。 -
性能考虑:LRU 策略在实现上需要维护一个有序的数据结构,这可能会对性能产生一定影响,尤其是在高并发场景下。Redis 通过精心设计的数据结构和算法来最小化这种影响。
-
与其他策略的比较:
- allkeys-lru:淘汰最久未使用的所有键。
- volatile-lru:仅淘汰设置了过期时间且最久未使用的键。
- allkeys-random:随机淘汰任意键。
- volatile-random:随机淘汰设置了过期时间的键。
-
动态调整:Redis 允许在运行时动态调整内存淘汰策略,这使得管理员可以根据应用的具体需求和性能指标来优化内存使用。
LRU 策略是 Redis 中一种有效的内存管理机制,它可以帮助确保 Redis 缓存中保留的是最近被频繁访问的数据,从而提高缓存的效率和响应速度。然而,选择合适的淘汰策略需要根据具体的应用场景和数据访问模式来决定。