网站建设开发服务费记账,简阳网站建设,wordpress系统,设计大神云集的网站是文章目录 什么是超卖问题#xff1f;推荐策略#xff1a;Redis原子操作(Redis incr)乐观锁lua脚本利用Redis increment 的原子操作#xff0c;保证库存数安全update使用乐观锁LUA脚本保持库存原子性 什么是超卖问题#xff1f;
在并发的场景下#xff0c;比如商城售卖商品… 文章目录 什么是超卖问题推荐策略Redis原子操作(Redis incr)乐观锁lua脚本利用Redis increment 的原子操作保证库存数安全update使用乐观锁LUA脚本保持库存原子性 什么是超卖问题
在并发的场景下比如商城售卖商品中一件商品的销售数量库存数量的问题称为超卖问题。主要原因是在并发场景下请求几乎同时到达对库存资源进行竞争由于没有适当的并发控制策略导致的错误。
推荐策略Redis原子操作(Redis incr)乐观锁lua脚本
利用Redis increment 的原子操作保证库存数安全
先查询redis缓存中是否有库存信息如果没有就去数据库查这样就可以减少访问数据库的次数。获取到后把数值填入redis以商品id为key数量为value。 还需要设置redis对应这个key的超时时间以防所有商品库存数据都在redis中。比较下单数量的大小如果够就做后续逻辑。执行redis客户端的increment参数为负数则做减法。因为redis是单线程处理并且因为increment让key对应的value减少后返回的是修改后的值。有的人会不做第一步查询直接减其实这样不太好因为当库存为1时很多做减3或者减30情况其实都是不够这样就白减。扣减数据库的库存这个时候就不需要再select查询直接乐观锁update把库存字段值减1 。做完扣库存就在订单系统做下单。
update使用乐观锁
updateProduct方法中执行的sql如下
update Product set count count - 购买数量 where id 商品id and count - 购买数量 0 and version 查到的version;虽然redis已经防止了超卖但是数据库层面为了也要防止超卖以防redis崩溃时无法使用或者不需要redis处理时则用乐观锁因为不一定全部商品都用redis。
利用sql每条单条语句都是有事务的所以两条sql同时执行也就只会有其中一条sql先执行成功另外一条后执行。
LUA脚本保持库存原子性
扣减redis的库存时最好用lua脚本处理因为如果剩余1个时用户买100个这个时候其实会先把key increase -100就会变负99。 所以用lua脚本先查询数量剩余多少是否够减100后再去减100。
本人水平有限有错的地方还请批评指正。 什么是精神内耗 简单地说就是心理戏太多自己消耗自己。 所谓 言未出结局已演千百遍 身未动心中已过万重山 行未果假想灾难愁不展 事已闭过往仍在脑中演。