MST

星途 面试题库

面试题:Redis过期键删除策略中的定期删除,如何平衡扫描成本与内存释放效益?

请阐述Redis定期删除过期键策略的基本原理,并说明在实际应用场景中,怎样调整扫描的频率和每次扫描的键数量,以达到成本与效益的平衡。
27.9万 热度难度
数据库Redis

知识考点

AI 面试

面试题答案

一键面试

Redis定期删除过期键策略基本原理

  1. 定期抽样删除:Redis不会对所有键进行定期检查过期。而是在每个serverCron(Redis服务器的周期性操作函数,默认每100毫秒执行一次)执行时,从过期字典中随机挑选一定数量的键进行检查,如果发现某个键已经过期,则删除该键。
  2. 过期字典:Redis使用一个字典(expires dict)来保存所有设置了过期时间的键的过期时间。这个字典的键是指向键空间中某个键对象的指针,值是该键的过期时间(一个毫秒级的UNIX时间戳)。

调整扫描频率和每次扫描键数量以平衡成本与效益

  1. 扫描频率
    • 频率高:如果扫描频率过高(例如每10毫秒执行一次扫描),虽然可以更及时地清理过期键,减少内存浪费,但是会增加CPU的负担,因为频繁的扫描操作会占用较多的CPU时间,可能会影响Redis对其他正常请求的处理。
    • 频率低:扫描频率过低(例如每10秒执行一次扫描),会导致过期键长时间占用内存,可能会造成内存使用量超出预期,尤其在过期键较多的情况下。同时,可能会导致一些过期键对应的缓存数据长时间存在,影响数据一致性。
    • 实际调整:在实际应用中,可以根据业务特点来调整。如果应用对内存使用非常敏感,且过期键生成速度较快,可以适当提高扫描频率,例如每50毫秒执行一次扫描。但如果应用更注重Redis的读写性能,对内存使用相对宽松,可以将扫描频率降低到每200毫秒或更久执行一次。
  2. 每次扫描键数量
    • 数量多:每次扫描键数量较多(例如每次扫描1000个键),能在一次扫描中删除更多过期键,加快过期键清理速度,节省内存。然而,这会在扫描期间占用更多CPU时间,可能导致其他请求响应延迟增加。
    • 数量少:每次扫描键数量较少(例如每次扫描10个键),对CPU的压力较小,Redis能更快速地响应其他请求。但这样清理过期键的效率较低,可能导致内存长时间被过期键占用。
    • 实际调整:对于内存使用压力大且CPU资源相对充足的场景,可以适当增加每次扫描的键数量,如每次扫描500个键。而对于对响应延迟要求极高,内存使用相对不那么紧张的场景,可以减少每次扫描键数量,如每次扫描50个键。同时,还可以根据运行时的内存使用情况和CPU负载动态调整每次扫描的键数量。例如,当内存使用率接近设定阈值时,增加每次扫描键数量;当CPU负载过高时,减少每次扫描键数量。