求助一个高并发的数据校验与保存问题

2023-03-11 18:48:14 +08:00
 mercurius
背景:
1 、一个商品对应着多个 SKU 数据,它们是一个整体
2 、SKU 是自定义输入的,但相同店铺下 SKU 不能重复
3 、因为其他业务逻辑,不能从数据库层面加唯一索引

流程:
商品数据在保存前,会先校验数据,查询数据库,确定相同店铺不存在重复 SKU 后才给通过

伪代码:
{
// 数据校验,需查询数据库进行判断
check();

// 数据保存
save();
}

问题:
校验与保存之间存在极短的时间差,高并发下,存在相同 SKU 在该时间差内通过校验,最终导致插入重复 SKU 数据。

例子:
商品 A ,其 SKU 有 S1 、S2 、S3
商品 B ,其 SKU 有 S3 、S4 、S5
它们恰好在同一时间进行校验,并且通过了校验,到时候该店铺就会出现 S2 的重复 SKU

自己想的解决方案:
使用 Redisson 的 RSet.add 方法可以在添加时就判断是否重复,如果添加失败就说明存在上面描述的情况,直接校验失败。
在查询数据库后,使用 RSet 去缓存这些 SKU ,等到保存成功再删掉缓存,同时为防止服务出问题,设置下 set 的过期时间。

但这种解决方案,会在短时间内连续调用 RSet.add ,单个商品的次数可能是 1~200 ,考虑到网络开销,感觉性能应该会很差吧……
大佬们有没有支持在短时间内大量去重并且支持过期 /删除的东西? orz
布隆过滤器已经被 pass 了,它不支持元素的删除
1964 次点击
所在节点    程序员
21 条回复
xiaop1ng
2023-03-12 15:07:15 +08:00
@546L5LiK6ZOt 了解,thanks~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/923207

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX