如何防止重复请求提交
创作时间:
作者:
@小白创作中心
如何防止重复请求提交
引用
1
来源
1.
http://www.cdweb.net/article/pgisji.html
在软件开发中,防止重复请求提交是一个常见的问题,特别是在交易系统、售后维权以及支付系统中,重复请求可能会造成严重的后果。本文将介绍三种有效的解决方案:基于缓存数据状态的验证、利用唯一索引机制的验证以及基于缓存的计数器验证。
背景
在平常开发中,我们经常会面对防止重复请求的问题。当服务端对于请求的响应涉及数据的修改,或状态的变更时,可能会造成极大的危害。重复请求的后果在交易系统、售后维权,以及支付系统中尤其严重。但是很多时候,都是指望着前端来限制,比如提交之后,按钮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
感谢各位的阅读,以上就是“如何防止重复请求提交”的内容了,经过本文的学习后,相信大家对如何防止重复请求提交这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。
热门推荐
车辆保险中的拖车费用报销问题解答
病理科质量管理体系
中医诊疗≠中医养生保健——带你了解中医那些事儿
如何用FMEA评估项目风险管理
红包数字代表的意思大全
什么是账户恢复选项?如何设置
新时达(002527.SZ):从电梯巨头到机器人玩家的十年浮沉
公司社保举报攻略:轻松维护自身权益
净耀法师与厦门南普陀寺的两岸佛教交流纪事
扶桑璀璨 金乌盘桓:古蜀文明的太阳崇拜
指甲苍白无血色?可能是身体在发出这些预警信号
梁廷波教授赴美开展学术交流,展现浙大一院胰腺癌治疗创新成果
投产比:企业资源利用效率的关键指标
从高端突破、向创造跨越,深圳制造业如何在创造能力上“下功夫”?
用人单位未缴社保,劳动者如何保障自身权益?
一个程序从源代码到可执行程序的过程
叶赫那拉英子,这谁给我起的名
透明质酸钠:从护肤到医疗的全方位应用
中国18座著名山峰的高度和地理位置
川椒种业:椒田土壤深耕减轻连作障害的重要性
10万元创业启动资金,适合选择哪些行业?
12家企业签约入驻!贵州科学城“科创智谷”项目推介会举行
存放茶叶的正确方法,你真的知道吗?5个技巧让茶叶原味不流失
如何打造优秀的医院中层管理者
社保退保流程和退保所需材料有哪些
知识青年上山下乡,有着刻骨铭心印象,老照片记录那段燃情岁月
唇毛严重的原因
全球204个国家和地区抗生素耐药现状
球镜-2.25是近视多少度?深度解析225度近视
Starlink卫星动力学系统仿真建模番外篇3-陀螺仪介绍