php - 签到功能中并发引起的多次签到如何解决?
ringa_lee
ringa_lee 2017-04-11 09:46:14
[PHP讨论组]

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

ringa_lee
ringa_lee

ringa_lee

全部回复(10)
迷茫

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

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

天蓬老师

加一层缓存(memcache、redis)

高洛峰

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

PHPz

锁住。。。。。。

怪我咯

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

黄舟

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

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

黄舟

我学习了啊.....

PHPz

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

阿神

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

PHP中文网

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号