面试题答案
一键面试设计思路
- 缓存数据结构:使用Redis的字符串(String)类型存储商品库存数量。例如,以商品ID为键,库存数量为值。
- 操作流程:
- 客户端发起抢购请求。
- 应用程序先从Redis获取商品库存数量,判断库存是否大于0。
- 若库存大于0,使用Redis的原子操作命令来减少库存数量。
- 根据减少库存的操作结果判断是否抢购成功。
- Redis命令:使用
GET
命令获取商品库存数量,使用DECR
(递减1)或DECRBY
(递减指定数量)命令减少库存。
可能存在的风险及应对措施
- 缓存穿透:恶意请求查询不存在的商品,每次都穿透到数据库。
- 应对措施:使用布隆过滤器(Bloom Filter),在请求到达时先判断商品是否存在,不存在则直接返回,避免查询数据库。
- 缓存雪崩:大量缓存同时过期,导致大量请求直接打到数据库。
- 应对措施:设置缓存过期时间时添加随机值,使缓存过期时间分散;同时使用互斥锁,保证同一时间只有一个请求去查询数据库并更新缓存。
- 网络延迟:高并发场景下,网络延迟可能导致部分请求操作库存不及时。
- 应对措施:在应用层增加重试机制,若因网络问题操作失败,可进行一定次数的重试。