扫码关注官方订阅号
场景:签到功能,用户每天只能签到一次,签到成功送相应礼品;在并发的过程中,同个用户如果很短时间内多次调用接口,由于未在数据库找到当天签到记录,可能造成写入多条记录,造成多次签到,如何解决这一问题?目前方案:对数据库中的用户id和当天时间做唯一性索引,则只能插入一条数据;想请教下还有什么别的解决方案?
ringa_lee
我说下表结构把id,user_id,date
user_id+date设置唯一索引。记住是两个字段加起来,这样即使你多次签到也没关系,在数据层面上已经能够保证同一个user_id一天最多一条签到记录
加一层缓存(memcache、redis)
1.唯一索引2.锁3.replace into4.where not exists
锁住。。。。。。
用户调用接口的时候不直接入库,可以采用队列的形式保存,然后异步入库,模仿商城秒杀活动的方式即可。
方案就是你说的,数据库上加唯一索引!这个是最快也是最容易的解决方案!
如果非要其他的解决方案,那就是中间加一层redis去存储,然后异步把数据写入到数据库
我学习了啊.....
想起了以前做抢红包接口被人刷爆时的惨案,哈哈。可惜当时还不知道有memcache、redis。
可以考虑一下消息队列解决并发插入问题。网络可以搜索到很多应用消息队列解决此类问题的方案。
前端解决方案:点击按钮一次之后就把按钮disable
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
扫描下载App
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
我说下表结构把
id,user_id,date
user_id+date设置唯一索引。记住是两个字段加起来,这样即使你多次签到也没关系,在数据层面上已经能够保证同一个user_id一天最多一条签到记录
加一层缓存(memcache、redis)
1.唯一索引
2.锁
3.replace into
4.where not exists
锁住。。。。。。
用户调用接口的时候不直接入库,可以采用队列的形式保存,然后异步入库,模仿商城秒杀活动的方式即可。
方案就是你说的,数据库上加唯一索引!这个是最快也是最容易的解决方案!
如果非要其他的解决方案,那就是中间加一层redis去存储,然后异步把数据写入到数据库
我学习了啊.....
想起了以前做抢红包接口被人刷爆时的惨案,哈哈。可惜当时还不知道有memcache、redis。
可以考虑一下消息队列解决并发插入问题。网络可以搜索到很多应用消息队列解决此类问题的方案。
前端解决方案:点击按钮一次之后就把按钮disable