在计算机系统中有三层存储结构,最上面是处理器,中间是内存,最下面是磁盘。它们各自的容量从几MB到几十TB不等,访问性能从几ns到几ms不等。如下图所示:

内存资源相比于磁盘还是比较稀缺的,Redis作为基于内存的数据库设计了完善的过期删除策略和内存淘汰机制,一起高效完成Redis的内存管理。
面试官:你了解Redis的过期删除策略吗?
Redis采用的是「惰性删除+定期删除」配合使用的策略,能够实现对过期数据的高效、精准管理,既保证了内存资源的有效利用,又避免了过度频繁的删除操作对系统性能造成影响。
1、惰性删除(LazyDeletion)
惰性删除是一种被动触发的过期数据清理方式。当客户端尝试访问一个键时,Redis会先检查该键是否设置了过期时间以及是否已过期。如果发现键已过期,则立即执行删除操作,并向客户端返回nil,表示该键不存在。如下图所示[1]:

这种策略的核心思想是“按需清理”,即只有在真正访问到过期键时才进行删除,不会主动去遍历查找过期键。这种方式的优点在于对系统的实时性能影响较小,因为只有在实际请求发生时才会触发删除操作。然而,其缺点是可能存在一些长期未被访问但已过期的键占用内存,造成一定的内存浪费。
2、定期删除(PeriodicDeletion)
为弥补惰性删除可能造成的内存浪费,Redis引入了定期删除策略。Redis服务器会周期性地运行一个后台“定时任务”,用于扫描并删除已过期的键。这个定时任务的执行频率以及每次扫描的键数量都可以通过配置参数进行调整,以适应不同的应用场景和负载情况。如下图所示[1]:

定期删除可以在一定程度上确保过期键能够及时得到清理,避免大量过期键长时间占用内存。然而,过于频繁或深度的扫描可能会导致CPU资源消耗增大,影响Redis服务的其他核心操作。因此,如何平衡扫描效率与系统负载,是定期删除策略实施时需要考虑的关键问题。
面试官:Redis有哪些内存淘汰策略?
Redis 内存淘汰策略共有八种,这八种策略可分为「不进行数据淘汰」和「进行数据淘汰」两类策略。
1、不进行数据淘汰的策略
noeviction(Redis3.0之后,默认的内存淘汰策略):它表示当运行内存超过最大设置内存时,不淘汰任何数据,这时如果有新的数据写入,会报错通知禁止写入,不淘汰任何数据,但是如果没用数据写入的话,只是单纯的查询或者删除操作的话,还是可以正常工作。
2、进行数据淘汰的策略
针对「进行数据淘汰」这一类策略,又可以细分为「在设置了过期时间的数据中进行淘汰」和「在所有数据范围内进行淘汰」这两类策略。
a)在设置了过期时间的数据中进行淘汰:
-
volatile-random:随机淘汰设置了过期时间的任意键值;
-
volatile-ttl:优先淘汰更早过期的键值。淘汰即将过期的键,即选择生存时间(TTL)最短的键优先删除。
-
volatile-lru(Redis3.0之前,默认的内存淘汰策略):淘汰所有设置了过期时间的键值中,最久未使用的键值;
-
volatile-lfu(Redis 4.0后新增的内存淘汰策略):淘汰所有设置了过期时间的键值中,最少使用的键值;利用LFU计数器跟踪键的访问频次,较少访问的键更可能被选中淘汰。
b)在所有数据范围内进行淘汰:
-
allkeys-random:随机淘汰任意键值;对所有键进行随机选择并删除,不考虑访问频率或过期时间。
-
allkeys-lru:淘汰整个键值中最久未使用的键值;不区分键是否设置过期时间;适用于希望在整体数据集层面维持热点数据的场景。
-
allkeys-lfu(Redis 4.0后新增的内存淘汰策略):淘汰整个键值中最少使用的键值。同样利用LFU计数器,但决策范围扩大至整个数据集。
Redis内存淘汰触发条件的相关配置如下:
Redis通过配置项maxmemory来设定其允许使用的最大内存容量。当Redis实际占用的内存达到这一阈值时,将触发内存淘汰机制,开始删除部分数据以释放内存空间,防止服务因内存溢出而异常。
Redis内存淘汰策略可在配置文件redis.conf中通过maxmemory-policy参数设定,或者在运行时使用CONFIGSET命令动态修改。适时监控Redis内存使用情况,并根据实际需求调整淘汰策略,是保证服务高效稳定的关键运维工作。
结语
Redis提供了「惰性删除+定期删除」配合使用的策略,对过期数据实现了高效、精准的管理,又提供了丰富的内存淘汰机制以应对不同业务场景的需求。
理解各策略的工作原理及适用条件很有必要,结合实际应用特点进行合理配置与调整,能够确保Redis在有限内存下更高效稳定地运行。
参考:
[1]https://xiaolincoding.com/redis/module/strategy.html
本篇文章来源于微信公众号: 程序员Aike
微信扫描下方的二维码阅读本文

Comments NOTHING