问一下大家,laravel中怎么防止多次签到?
最近接手了一个旧项目,项目中有一个用户签到积分功能,目前发现有bug,有些用户可以多次签到,刷了很多积分,希望大家能分享一下在后端中怎么杜绝这个情况的?之后我也会把相关应用代码总结出来分享,谢谢大家~
高认可度评论:
前端防连点 后端用户id+day的标识唯一索引+redis原子锁
什么bug
前端防连点 后端用户id+day的标识唯一索引+redis原子锁
day+user_id 唯一键
Redis bitmap 专治你这种问题
既然是旧项目的bug , 肯定是技术越简单,代码越少能解决问题就最好了
解决方式:直接就加个时间限制就不ok了,比如今天签到了,在签直接就return
数据库 day+userId 唯一索引
1、mysql唯一索引,插入时语句忽略错误或者捕获异常 2、锁
接口都需要幂等性,关键的操作都需要加锁当前用户签到时,如果未完成后续请求都排队等候处理,直到完成再释放锁 推荐使用redis setnx 记得加一个过期时间
接口要幂等性啊
其实就是普通的并发问题,但是没有做并发处理
Mysql Unique Index
+Redis Lock
最简单的办法 开事务 再加入 lockForUpdate
这个办法很多
一个使用 redis 也是 当前日期 + uId 到0点过期
第二个 走 mysql 做唯一索引 直接 暴力 解决 当前日期 + uId
redis锁稳稳解决
建议看看 Redis bitmap,适用于用户签到的场景
提供下思路,如果每天签到数据量大(一百万以上)的话,就用redis bitmap的方式,不然就用redis set集合 (比如key为business:sign:set:日期)解决。
一篇壁虎的 ”bitmap“ 推荐给楼主 zhuanlan.zhihu.com/p/480386998
如果服务器重启 是不是数据都没有了