MST
星途 面试题库

面试题:如何基于Redis过期键删除策略,设计一个成本效益最优的数据缓存架构?

假设你负责设计一个大规模数据缓存架构,要求在满足业务需求的前提下,实现成本效益最优。请结合Redis过期键删除策略,详细阐述架构设计思路,包括如何选择和配置删除策略、怎样处理缓存穿透和缓存雪崩问题以平衡成本与效益等。
38.1万 热度难度
数据库Redis

知识考点

AI 面试

面试题答案

一键面试

架构设计思路

  1. 选择和配置删除策略
    • Redis过期键删除策略
      • 定时删除:在设置键的过期时间时,同时创建一个定时器,到过期时间时,立即删除键。此策略对内存友好,能立即释放过期键占用的内存,但对CPU不友好,因为大量过期键集中过期时,会占用较多CPU资源去处理删除操作。
      • 惰性删除:键过期时不做处理,每次从数据库获取键时,检查键是否过期,若过期则删除并返回空。此策略对CPU友好,只有在访问到过期键时才进行删除操作,但对内存不友好,若大量过期键未被访问,会一直占用内存。
      • 定期删除:每隔一段时间,随机从数据库中取出一定数量的键检查并删除其中过期的键。这种策略是定时删除和惰性删除的折中,通过合理设置检查频率和每次检查的键数量,在CPU和内存之间取得平衡。
    • 策略选择与配置
      • 选择定期删除和惰性删除结合的方式。定期删除可以在系统负载较低的时间段,如凌晨等业务低谷期,适当增加检查频率和每次检查的键数量,以清理过期键释放内存;在业务高峰期,降低定期删除频率,减少对CPU的影响,依赖惰性删除来处理访问到的过期键。
      • 通过配置redis.conf文件中的hz参数来调整定期删除的频率,hz表示服务器每秒执行多少次serverCron函数,该函数会执行过期键删除等操作。一般默认值为10,可根据实际业务情况调整,如在低峰期可设置为20 - 30 ,高峰期设置为5 - 10。
  2. 处理缓存穿透问题
    • 布隆过滤器:在缓存之前加一层布隆过滤器。当有查询请求时,先通过布隆过滤器判断该数据是否存在,如果布隆过滤器判断不存在,则直接返回,不再查询数据库,避免了大量无效请求穿透到数据库。布隆过滤器有一定的误判率,但合理设置其参数(如哈希函数个数、位数组大小)可将误判率控制在较低水平。布隆过滤器可以使用Redis的bitmaps数据结构来实现,通过计算哈希值对应到bitmaps的位置来标记和查询。
    • 空值缓存:当查询数据库发现数据不存在时,将空值也缓存起来,并设置一个较短的过期时间,如1 - 5分钟。这样后续相同的无效请求可以直接从缓存中获取空值,避免穿透到数据库。但要注意设置合适的过期时间,防止过期时间过长影响数据更新。
  3. 处理缓存雪崩问题
    • 设置随机过期时间:在缓存数据时,给每个键设置的过期时间不是固定值,而是在一个合理范围内随机生成。例如,原本设置过期时间为1小时,可以改为在45分钟到75分钟之间随机取值。这样可以避免大量键在同一时间过期,减少缓存雪崩发生的概率。
    • 使用互斥锁:当缓存失效时,先获取一个互斥锁,只有获取到锁的请求才去查询数据库并更新缓存,其他请求等待。等获取锁的请求更新完缓存后,释放锁,其他请求再从缓存中获取数据。在Redis中可以使用SETNX命令来实现互斥锁,获取锁成功返回1,失败返回0 。但要注意设置锁的过期时间,防止死锁。
    • 多级缓存:采用多级缓存架构,如一级缓存使用Redis,二级缓存可以使用本地缓存(如Guava Cache等)。当一级缓存失效时,先从二级缓存获取数据,如果二级缓存也没有,再查询数据库并更新两级缓存。这样可以在一定程度上缓解数据库压力,降低缓存雪崩对数据库的冲击。同时,二级缓存可以根据业务场景设置较小的容量和较短的过期时间,以平衡成本。

通过以上针对Redis过期键删除策略的选择配置以及对缓存穿透和缓存雪崩问题的处理方式,可以在满足大规模数据缓存业务需求的前提下,实现成本效益最优。