签到功能中并发引起的多次签到如何解决?

geekuzzw
  • 160

场景:签到功能,用户每天只能签到一次,签到成功送相应礼品;
在并发的过程中,同个用户如果很短时间内多次调用接口,由于未在数据库找到当天签到记录,可能造成写入多条记录,造成多次签到,如何解决这一问题?
目前方案:对数据库中的用户id和当天时间做唯一性索引,则只能插入一条数据;
想请教下还有什么别的解决方案?

回复
阅读 5.9k
10 个回答

我说下表结构把
id,user_id,date

user_id+date设置唯一索引。记住是两个字段加起来,这样即使你多次签到也没关系,在数据层面上已经能够保证同一个user_id一天最多一条签到记录

用户调用接口的时候不直接入库,可以采用队列的形式保存,然后异步入库,模仿商城秒杀活动的方式即可。

加一层缓存(memcache、redis)

1.唯一索引
2.锁
3.replace into
4.where not exists

锁住。。。。。。

方案就是你说的,数据库上加唯一索引!这个是最快也是最容易的解决方案!

如果非要其他的解决方案,那就是中间加一层redis去存储,然后异步把数据写入到数据库

ACDC
  • 2
新手上路,请多包涵

我学习了啊.....

想起了以前做抢红包接口被人刷爆时的惨案,哈哈。可惜当时还不知道有memcache、redis。

可以考虑一下消息队列解决并发插入问题。网络可以搜索到很多应用消息队列解决此类问题的方案。

前端解决方案:点击按钮一次之后就把按钮disable

宣传栏