如何设计秒杀系统的缓存策略?
本题考察了缓存相关的很多经典问题,大家好好掌握它,对于面试官的拷打直接拿捏。
1. 缓存设计
1.1 缓存热点数据
秒杀系统的主要压力在于秒杀商品的库存数据查询、商品信息查询等。这些数据通常是热点数据,频繁被请求,因此需要将它们缓存到 Redis 中,避免每次都查询数据库。
- 库存信息:将秒杀商品的库存信息缓存到 Redis 中。每当用户请求秒杀商品时,首先从缓存中获取库存信息,而不是每次查询数据库。
- 商品信息:商品详情、秒杀活动信息等可以缓存到 Redis,减少数据库的访问次数。
1.2 缓存粒度
- 商品库存缓存:库存数量可以作为缓存的粒度。每次秒杀成功后,更新 Redis 中的库存数量。
- 商品详情缓存:例如商品的名称、图片、价格等内容可以进行缓存。
2. 解决缓存穿透问题
缓存穿透指的是请求的数据在缓存中不存在,且缓存未命中的数据每次都查询数据库,导致每次请求都增加数据库压力。
解决方案:
- 布隆过滤器:布隆过滤器可以在请求到达缓存之前先进行一次有效性检查,防止无效请求进入缓存系统。对于秒杀活动中的无效商品请求,可以使用布隆过滤器过滤掉,避免这些请求直接穿透缓存访问数据库。
- 接口校验:检查请求参数是否有效(例如商品ID是否存在、秒杀活动是否进行等),避免恶意请求导致缓存穿透。
3. 解决缓存击穿问题
缓存击穿指的是缓存中的数据过期或被删除,导致大量请求在短时间内同时访问数据库,给数据库带来很大的压力。
解决方案:
- 互斥锁:当缓存失效时,通过使用互斥锁(如 Redis 的
SETNX
命令)确保只有一个请求去数据库查询并更新缓存,避免多个请求同时访问数据库。 - 缓存预加载:在秒杀活动开始前,可以将一些热点数据提前加载到缓存中,以避免秒杀活动开始时大量请求同时访问数据库。
4. 解决缓存雪崩问题
缓存雪崩是指缓存中大量数据在同一时间过期,导致大量请求直接打到数据库,造成数据库压力暴增,可能引发系统崩溃。
解决方案:
- 随机过期时间:为了避免缓存中数据在同一时间过期,可以为每个缓存项设置不同的过期时间。通过随机化过期时间,可以避免缓存数据同时过期的问题。
- 延时缓存清理:使用合理的过期策略,让缓存中的数据逐渐过期而不是集中在同一时间点过期。
5. 缓存更新策略
秒杀系统中的数据是动态变化的,尤其是库存信息,因此缓存的数据需要进行及时更新,以确保缓存与数据库的数据一致性。
解决方案:
- 写时更新:当库存或其他数据发生变化时,立即更新缓存。例如,在秒杀成功后,减少 Redis 中的库存值。
- 延迟双删:当更新缓存时,可能会导致缓存和数据库之间的一致性问题。采用延迟双删策略:首先删除缓存,然后执行数据库更新操作,最后再次删除缓存,确保缓存被正确清理。
- 异步更新:对于不急于立即一致的数据,可以通过异步更新缓存。例如,使用消息队列来处理数据更新,后台服务会异步更新缓存。
6. 缓存容量与淘汰策略
缓存容量有限,当缓存空间不足时,可能需要淘汰一些缓存数据。合理的淘汰策略能提高缓存的使用效率。
解决方案:
- LRU(Least Recently Used)策略:Redis 默认使用 LRU 策略来淘汰最久未使用的缓存数据,这可以确保常用的数据保留在缓存中。
- 缓存预热:在秒杀活动前,提前将热点商品的数据预加载到缓存中,确保秒杀活动开始时缓存中已有数据,避免首次查询的缓存未命中。
7. 高并发控制
秒杀系统中,通常会有大量的并发请求。为了避免缓存系统在高并发时被压垮,需要对请求进行流量控制。
解决方案:
- 令牌桶/漏桶算法:利用限流算法(如令牌桶、漏桶)来限制每秒钟可以接受的请求数量,避免系统崩溃。
- 消息队列削峰:使用消息队列(如 Kafka、RabbitMQ)来将请求异步化,逐步处理请求,从而避免瞬时高并发请求直接打到缓存和数据库。
8. 缓存与数据库的一致性
缓存与数据库之间必须保持一致性,特别是在秒杀库存更新的场景中,缓存和数据库中的库存需要保持同步。
解决方案:
- 强一致性:采用分布式事务、两阶段提交等方式来确保数据库和缓存的一致性。但由于性能开销较大,秒杀系统中一般会选择最终一致性。
- 最终一致性:使用消息队列和异步处理来更新缓存和数据库,使其在一定时间后达到一致性。
9. 缓存失效策略
秒杀系统的缓存数据如商品库存等必须考虑到失效和过期的情况。合理的失效策略可以确保缓存中的数据不会过时。
解决方案:
- 合理设置缓存过期时间:对于商品库存等数据,可以设置相对较短的过期时间,防止缓存长期存在过期数据。通常秒杀库存数据可以设置为几分钟的过期时间,确保数据新鲜。
- 定期刷新缓存:可以使用定时任务或者后台更新机制定期刷新缓存,以确保数据的及时性。
本题小结:我给大家介绍了缓存系统的设计,以及常见的缓存问题,穿透,击穿,雪崩等解决方式,还有缓存于数据库一致性问题,这些不清晰的大家看详情文章。