3

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

 1 year ago
source link: https://www.v2ex.com/t/923207
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

V2EX  ›  程序员

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

  mercurius · 6 小时 59 分钟前 · 530 次点击
背景:
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 了,它不支持元素的删除

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK