会员登录 - 用户注册 - 设为首页 - 加入收藏 - 网站地图 面试官扎心一问:防止重复请求提交,有什么方案?!

面试官扎心一问:防止重复请求提交,有什么方案?

时间:2025-11-05 06:35:18 来源:益强数据堂 作者:应用开发 阅读:647次

 本文转载自微信公众号「UP技术控」,面试作者 conan5566。官扎转载本文请联系UP技术控公众号。心问 conan5566  

背景

在平常开发中,防止方案我们经常会面对防止重复请求的重复问题。当服务端对于请求的请求响应涉及数据的修改,或状态的提交变更时,可能会造成极大的面试危害。重复请求的官扎后果在交易系统、售后维权,心问以及支付系统中尤其严重。防止方案但是重复很多时候,都是请求指望着前端来限制,比如提交之后,提交按钮diseabled之类的面试,其实这些都是不靠谱的。关键时候还是需要后端来校验。

解决方式

1、源码库基于缓存数据状态的验证

Redis存储查询轻量快速。在request进来的时候,可以先记录在缓存中。后续进来的request每次进行验证。整个流程处理完成,清除缓存。

if (!CacheExtension.getInstance().AddUnique($"{key}_unique", 1, DateTimeOffset.Now.AddDays(365)))             {                 LogExtention.getInstance().WriteCustomLogAsync("", "", true, "上批次还未执行结束");                 return ResponseResult.FromError("上批次还未执行结束!");             }  if (!string.IsNullOrEmpty(uniqueKey))             {                 CacheExtension.getInstance().Remove(uniqueKey);             }             return ResponseResult.Ok(); 

2、利用唯一索引机制的验证

需要原子性操作,想到了数据库的唯一索引。新建一个表,每次request进来则往表里面插入数据, 操作完成后,删除此条记录。

3、基于缓存的计数器验证

由于数据库的操作比较消耗性能,了解到redis的计数器也是原子性操作。果断采用计数器。既可以提高性能,还不用存储,云服务器提供商而且能提升qps的峰值。 每次request进来则新建一个以orderId为key的计数器,然后+1。如果>1(不能获得锁): 说明有操作在进行,删除。如果=1(获得锁): 可以操作。

redis> SET test 20 OK redis> INCR test (integer) 21 redis> GET test # 数字值在 Redis 中以字符串的形式保存 "21" //获取指定的所有计数器 HGETALL counter:user:{userID}    //获取指定的指定计数器 HMGET counter:user:{userID}  praiseCnt hostCnt  //指定点赞数+1 HINCRBY counter:user:{userID}   praiseCnt 

总结

1、c#本身有lock机制,单体模式可以使用。

2、但是考虑到我们的分布式部署,建议还是用缓存。在大并发的情况下,程序各种情况的发生。特别是涉及到金额操作。所以在大并发要互斥的情况下可以考虑2、3两种方案。b2b供应网

(责任编辑:应用开发)

推荐内容
  • 组装电脑主机的简易教程(一步步教你如何组装自己的电脑主机,轻松实现个性化定制)
  • 域名查询工具可以查询域名哪些信息?
  • Oracle升级该怎么选版本,目前看已经没有异议了
  • MySQL方向工作的三股清流
  • 联想电脑CPU风扇错误的解决方法(探索联想电脑CPU风扇错误原因及应对措施)
  • Python 标准库中非常有用的装饰器