1.4K Star 13.2K Fork 3.1K

Lilishop开源商城系统 / lilishop商城 电商 java商城系统

 / 详情

SKU的redis查询与商品更新有并发导致缓存错误的问题

已完成
任务
创建于  
2022-08-11 15:08

输入图片说明
输入图片说明
输入图片说明

1.商品在编辑了规格后,删除了redis中的skuId,在调用updateStock方法中的写入redis之前时。
2.如果有其他地方调用了getGoodsSkuByIdFromCache,此时无法命中缓存,则查询数据库后写入。
由于1#还处于事务中,数据库中的数据对其他事务为未提交状态,不会被获取到,甚至1#卡顿使得sku的update都还没调用。此时2#读取到的数据库为修改前的老数据。并且1#和2#写入redis的顺序不可控,可能会出现1#先写入然后2#再写入的情况,此时redis中的数据为老数据。

目前一个简单的想法是在进入商品的editGoods方法时使用skuId设置redislock,方法结束后释放,在getGoodsSkuByIdFromCache中对锁进行检测,这样即可保证更新商品时不会有上述问题。

评论 (7)

Morrowind 创建了任务
Morrowind 修改了描述
Morrowind 修改了标题
展开全部操作日志

:star2: :star2: :star2:

细心的发现,之前有个同学也提过类似的问题,他的意思是编辑商品库存直接写入,极端情况会存在库存事务问题。

这边不是很喜欢锁这个东西,虽然系统中使用了redisson,但是使用的地方目前就一个,而且准备未来剔除掉。

目前主要保证的是在商品并发秒杀时库存不超买(基于现有架构,不涉及库存变更,商品变更,redis清空的场景的话,不回有超卖问题),当前描述的这个场景发生概率极低,这边想想后续有什么样的好方案提供。感谢关注,后续有更好的方案再来回复这个issues

锁这种东西该用还是得用呀,尤其是库存变更这种高频多线程的地方,再加上现在基本都是微服务,实例一多那更没法避免了

锁这种东西该用还是得用呀,尤其是库存变更这种高频多线程的地方,再加上现在基本都是微服务,实例一多那更没法避免了

@Morrowind 可以参考库存扣减,并不是锁,只不过是把事务从数据库转到了lua脚本。越是高频的地方应该是更加不能用锁的,不然死锁等待、内存溢出zzz

其实可以把库存和商品剥离开,库存不放在商品表中,因为修改商品频率很低,大多数是读很少涉及写的操作,但是库存的话频繁更新数据库,很多写的操作,建议两个剥离开,然后lua脚本控制库存,延迟更新数据库库存表

有道理,库存与商品拆分确实会更好。

不过延迟更新无法解决这个问题描述的事情,这个问题的解决方案必须是用锁,如果你不锁数据,你在更新数据库数据的时候和其他修改数据库库存不在同一个事务里,就会出现这个问题。

还有一个库存应该要有变更单的,不然有问题都不知道哪里有问题

然后再商品维护一个字段,是否售尽的字段,这样前端比较好做售完的标识

Bulbasaur 任务状态待办的 修改为已完成

登录 后才可以发表评论

状态
负责人
项目
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
预计工期 (小时)
参与者(3)
701277 chopper711 1679448410
Java
1
https://gitee.com/beijing_hongye_huicheng/lilishop.git
git@gitee.com:beijing_hongye_huicheng/lilishop.git
beijing_hongye_huicheng
lilishop
lilishop商城 电商 java商城系统

搜索帮助