面试题答案
一键面试可能出现的问题
- 事务回滚频繁:高并发场景下,多个客户端同时WATCH库存数据,只要有一个客户端修改了库存,其他客户端的事务就会回滚,导致重试次数增加,性能下降。
- 性能瓶颈:大量的回滚重试会占用系统资源,包括网络资源、CPU资源等,可能造成整个系统的性能瓶颈。
- 死锁风险:如果多个客户端以不同顺序WATCH和操作数据,可能会出现死锁情况,导致部分事务永远无法完成。
优化措施
- 减少WATCH范围:只对关键的库存数据进行WATCH,而不是整个相关数据集,降低其他无关数据修改导致事务回滚的概率。
- 合理设置重试策略:设置合理的重试次数和重试间隔,避免无限重试占用过多资源。可以采用指数退避算法,随着重试次数增加,间隔时间逐渐增大。
- 批量操作:将多个相关操作合并为一个事务,减少WATCH的次数,降低事务回滚风险。
替代方案
- 使用Lua脚本:Redis支持Lua脚本执行,Lua脚本在执行过程中是原子性的,可以避免并发问题。通过Lua脚本实现库存扣减逻辑,不需要使用WATCH命令。
- 基于队列的处理:将库存扣减请求放入消息队列(如RabbitMQ、Kafka等),然后由一个消费者按顺序处理队列中的请求,确保库存扣减操作的串行化,避免并发冲突。
- 分布式锁:使用分布式锁(如Redisson实现的分布式锁),在扣减库存前获取锁,只有获取到锁的客户端才能进行库存扣减操作,保证同一时间只有一个客户端修改库存数据。