思路
- 设置随机过期时间:避免所有缓存同时过期,在设置缓存过期时间时,给每个缓存项添加一个随机的时间偏移量。
- 使用缓存预热:在系统上线前,预先将部分热点数据加载到缓存中,并且设置不同的过期时间,避免大量缓存同时失效。
- 构建多级缓存:采用本地缓存(如Guava Cache)与Redis缓存结合的方式。当Redis缓存失效时,先从本地缓存获取数据,减少对数据库的直接访问压力。
- 使用互斥锁:在缓存失效时,通过互斥锁(如SETNX命令)保证只有一个线程去查询数据库并更新缓存,其他线程等待一段时间后重试从缓存获取数据。
Redis命令或配置项
- 设置过期时间:使用
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)
- 互斥锁:使用
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)
- 配置项:在Redis配置文件(redis.conf)中,可以调整
maxmemory
和maxmemory - policy
配置项,以更好地管理内存使用。例如设置maxmemory - policy
为allkeys - lru
,表示当达到最大内存限制时,使用最近最少使用(LRU)算法删除键,避免因内存不足导致缓存雪崩。
# redis.conf文件示例
maxmemory 100mb
maxmemory - policy allkeys - lru