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

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

什么时候开始都不晚,学到老
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 25

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

2周前 评论

什么bug

2周前 评论
芝麻开门 (楼主) 2周前
php_yt (作者) 2周前
芝麻开门 (楼主) 2周前

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

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

Redis bitmap 专治你这种问题

2周前 评论

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

2周前 评论
王小大 2周前
MArtian 2周前
zongscan (作者) 2周前

数据库 day+userId 唯一索引

2周前 评论

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

2周前 评论

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

2周前 评论
playmaker

接口要幂等性啊

2周前 评论

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

2周前 评论

Mysql Unique Index + Redis Lock

2周前 评论

最简单的办法 开事务 再加入 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周前 评论

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