有什么更好的办法可以防止用户重复点击提交
就是我现在写了个积分系统,但是由于网页的卡顿,没有及时反馈给用户信息,有的时候用户会点击提交很多次,导致多次计算积分,除了前端JS控制按钮或者a标签,还有什么更好的方法吗
高认可度评论:
emmm……这玩意大厂都叫它:接口幂等
实现接口幂等性的几种方案
Request ID
加锁
redis锁、队列
emmm……这玩意大厂都叫它:接口幂等
实现接口幂等性的几种方案
后端加锁
redis 🔒
加一个数据签名
sign
用于保存表单状态,sign
选择mysql
,或者redis
驱动。有的人也选择session
,但是无法确保高并发sign
的唯一性mysql随意用一列,设置
unique
索引,redis
用有序集合。只要能实现唯一性
即可,唯一性
确保高可用,从性能出发推荐redis
。redis setnx 看下
没解决卡顿的话。良好的提示和健壮接口,或者先假定成功,马上显示,然后出错再显示。
点击后前端把按钮改为禁用状态,等请求结束返回成功再恢复为原始状态
一个比较容易理解的解决方案是往用户的数据表中添加字段如
flag
,字段初始化默认值为 0,后端接收到用户请求后则将flag
置为 1。在后端即将处理用户请求时,先判断数据表中该用户的flag
是否为 0,是的话则处理请求,否则直接退出。当然这个方法过于简陋,具体如何优化就看楼主自己咯。
使用文件缓存或者redis都是不错的选择
加载页面的时候,隐藏域里写个token,然后顺便服务端保存一下。 等下一次提交的时候带着这个token和服务端保存的对比。第一次提交过来后对比完成就删掉服务端的,第二次来的时候肯定对比不正确了。
1.唯一索引 2.下单校验未确认订单,用户id,积分,请求时间与表中记录的某条完全一致
以下代码是我以前做活码时候的场景,因为构造方法中需要搜集用户ip信息。实例化时候并发很大。经常出现数据库增加很多条相同的数据。后来改造在userJoin使用redis的 setnx解决了这一问题。