认识
一、认识
Redis
常被用作缓存层,存储热点数据,减少数据库压力,提升访问速度。在高并发系统中,Redis
常用于缓存以减轻数据库压力。然而,缓存系统会面临各种挑战,比如 缓存雪崩、缓存穿透、缓存击穿、缓存失效、缓存与数据库一致性 问题。具体工作流为: 在服务启动时,将定义的热点数据从数据库加载到 Redis
缓存中, 提前预加载热点数据到缓存。数据读取时,优先从缓存中读取,如果未命中则从数据库查询,并缓存到 Redis
。设置 随机过期时间(TTL
) 避免缓存集中过期,造成缓存雪崩。查询无效数据时,将无效结果(如 null
)缓存到 Redis
,设置短 TTL
避免频繁查询数据库, 造成缓存穿透。在高并发场景下,当缓存未命中时使用分布式锁限制同一时间只有一个请求可以加载数据并更新缓存,防止高并发场景下多个请求同时访问数据库,导致缓存击穿。在更新数据时,优先更新数据库,再使缓存失效。使用延迟双删策略确保并发场景下数据一致性。
其中,分布式锁增加指数退避重试机制,指数退避(Exponential Backoff
)是指: 每次重试的间隔时间按照指数增长(如 2^n
),逐步增加, 增加一个随机抖动(jitter
),防止大量请求在相同时间再次争抢锁。计算公式为: Math.min(baseDelay * Math.pow(2, attempts), maxDelay) + Math.random() * jitterRange
。baseDelay
为基础延迟时间, attempts
为当前重试的次数,使用 baseDelay * 2^attempts
动态调整重试间隔时间。maxDelay
为最大延迟时间,限制最大间隔时间为 maxDelay
,防止过长的延迟。randomJitter
为随机抖动时间, 每次重试增加随机抖动 randomJitter
,避免并发请求同时重试导致锁竞争。通过 引入指数退避策略,可以显著降低高并发场景下锁竞争的冲突概率,同时最大限度提高获取锁的成功率,增强系统的稳定性和可靠性。
二、工作
服务启动 - 用户 HTTP 请求 - Redis Cache - MySQL Storage