MST

星途 面试题库

面试题:Redis字典API在缓存雪崩场景下的优化

假设在一个高并发的Web应用中,使用Redis字典API进行数据缓存,突然大量缓存同时过期引发缓存雪崩,如何通过优化字典API的使用以及相关配置来避免这种情况?阐述具体思路及可能用到的Redis命令或配置项。
46.5万 热度难度
数据库Redis

知识考点

AI 面试

面试题答案

一键面试

思路

  1. 设置随机过期时间:避免所有缓存同时过期,在设置缓存过期时间时,给每个缓存项添加一个随机的时间偏移量。
  2. 使用缓存预热:在系统上线前,预先将部分热点数据加载到缓存中,并且设置不同的过期时间,避免大量缓存同时失效。
  3. 构建多级缓存:采用本地缓存(如Guava Cache)与Redis缓存结合的方式。当Redis缓存失效时,先从本地缓存获取数据,减少对数据库的直接访问压力。
  4. 使用互斥锁:在缓存失效时,通过互斥锁(如SETNX命令)保证只有一个线程去查询数据库并更新缓存,其他线程等待一段时间后重试从缓存获取数据。

Redis命令或配置项

  1. 设置过期时间:使用SET key value EX seconds命令设置缓存的过期时间,其中seconds可结合随机数生成不同的过期时间。例如:
# 使用Python伪代码示例生成随机过期时间
import random
expire_time = 3600 + random.randint(0, 600)  # 3600秒基础上,随机增加0到600秒
redis.setex(key, expire_time, value)
  1. 互斥锁:使用SETNX key value命令(SET if Not eXists),只有当键不存在时,才设置键的值。
if redis.setnx("mutex_key", "lock"):
    try:
        # 查询数据库,更新缓存
        value = get_data_from_db()
        redis.setex(key, expire_time, value)
    finally:
        redis.delete("mutex_key")  # 释放锁
else:
    # 等待一段时间后重试获取缓存数据
    time.sleep(0.1)
    value = redis.get(key)
  1. 配置项:在Redis配置文件(redis.conf)中,可以调整maxmemorymaxmemory - policy配置项,以更好地管理内存使用。例如设置maxmemory - policyallkeys - lru,表示当达到最大内存限制时,使用最近最少使用(LRU)算法删除键,避免因内存不足导致缓存雪崩。
# redis.conf文件示例
maxmemory 100mb
maxmemory - policy allkeys - lru