主要问题
数据库压力:
- 当 Redis 缓存中的大量键同时过期时,这些缓存失效的请求会回源到数据库(通常是一个关系型数据库或其他类型的持久化存储)。
- 如果大量请求在同一时间涌向数据库,会导致数据库负载急剧增加,可能导致数据库响应变慢甚至崩溃。
- 这种情况会导致系统出现 502 错误,即网关错误,表示后端服务器(数据库)未能正确响应请求。
Redis 短暂卡顿:
-
即使不考虑回源到数据库的情况,Redis 本身在大量键同时过期时也会面临性能问题。
-
Redis 在处理过期键时,会在每秒定期检查一些键并删除过期的键。如果大量键同时过期,Redis
需要在很短的时间内处理这些过期事件,可能会导致短暂的卡顿。 -
这种卡顿会导致其他正常请求的延迟增加,影响整体系统性能。
解决方案:过期时间加随机值
为了预防上述问题,最佳实践是给每个键的过期时间加一个随机值,使得过期时间更加分散。这样可以平滑地分散过期事件,避免瞬时大量请求对数据库和 Redis 的冲击。
import redis
import random
# 连接到 Redis
r = redis.Redis(host='localhost', port=6379, db=0)
keys = ['key1', 'key2', 'key3'] # 假设这是需要设置过期时间的键列表
base_expire_time = 60 # 基础过期时间为 60 秒
for key in keys:
r.set(key, 'some_value') //给每一个key设置了一个值为'some_value'
# 设置一个基础时间加上 0 到 10 秒的随机偏移的过期时间
r.expire(key, base_expire_time + random.randint(0, 10))
具体解释
- 基础过期时间:假设我们希望这些键在 60 秒后过期。
- 随机偏移:为了避免所有键在同一时刻过期,我们给每个键的过期时间加上一个 0 到 10 秒的随机值。
- 目的:这样,每个键的过期时间在 60 到 70 秒之间随机分布,避免了同时过期的情况。
效果
- 数据库压力分散:缓存失效请求将更加分散地回源到数据库,避免瞬时的高负载。
- Redis 负载平衡:Redis 处理过期键的负载也会被平滑分布,减少短暂卡顿的可能性。
- 系统稳定性提高:整体系统的稳定性和性能都会得到提升,避免了由于大量键同时过期而导致的性能问题和故障。
67

被折叠的 条评论
为什么被折叠?



