问一下大家,laravel中怎么防止多次签到?

最近接手了一个旧项目,项目中有一个用户签到积分功能,目前发现有bug,有些用户可以多次签到,刷了很多积分,希望大家能分享一下在后端中怎么杜绝这个情况的?之后我也会把相关应用代码总结出来分享,谢谢大家~

什么时候开始都不晚,学到老
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 25

前端防连点 后端用户id+day的标识唯一索引+redis原子锁

1年前 评论

什么bug

1年前 评论
芝麻开门 (楼主) 1年前
php_yt (作者) 1年前
芝麻开门 (楼主) 1年前

前端防连点 后端用户id+day的标识唯一索引+redis原子锁

1年前 评论
  1. 记录签到时间,日后可以查看签到信息(也可优化 xx 日连续签到 n 天,只要一条)
  2. Redis布隆过滤器 来判断当天是否有签到,降低 mysql 的压力,非必须
1年前 评论

Redis bitmap 专治你这种问题

1年前 评论

既然是旧项目的bug , 肯定是技术越简单,代码越少能解决问题就最好了
解决方式:直接就加个时间限制就不ok了,比如今天签到了,在签直接就return

1年前 评论
王小大 1年前
MArtian 1年前
zongscan (作者) 1年前

数据库 day+userId 唯一索引

1年前 评论

1、mysql唯一索引,插入时语句忽略错误或者捕获异常 2、锁

1年前 评论

接口都需要幂等性,关键的操作都需要加锁当前用户签到时,如果未完成后续请求都排队等候处理,直到完成再释放锁 推荐使用redis setnx 记得加一个过期时间

1年前 评论
playmaker

接口要幂等性啊

1年前 评论
Junwind

其实就是普通的并发问题,但是没有做并发处理

1年前 评论
随波逐流

Mysql Unique Index + Redis Lock

1年前 评论

最简单的办法 开事务 再加入 lockForUpdate

1年前 评论
自由与温暖是遥不可及的梦想

这个办法很多

一个使用 redis 也是 当前日期 + uId 到0点过期

第二个 走 mysql 做唯一索引 直接 暴力 解决 当前日期 + uId

1年前 评论
orange1994

redis锁稳稳解决

1年前 评论

建议看看 Redis bitmap,适用于用户签到的场景

1年前 评论
╰ゝSakura

提供下思路,如果每天签到数据量大(一百万以上)的话,就用redis bitmap的方式,不然就用redis set集合 (比如key为business:sign:set:日期)解决。

逻辑大概如下:
1. 用redis sadd 判断对应的用户id能不能正常加入集合内,若无法加入则表示已经签到过,直接返回已签到,否则走步骤2
2. 通过数据库查该用户id是否已经在数据库内,若在则返回已签到,否则走步骤3
3. 将该用户的签到记录入库,若成功则返回签到成功
4. 若不成功则 从集合sRem相关用户ID

提示 步骤2-4这几步可以走异步队列消费,不一定要同步
1年前 评论
oceanjiayu 1年前
sanders

一篇壁虎的 ”bitmap“ 推荐给楼主 zhuanlan.zhihu.com/p/480386998

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!