当前位置:网络安全 > 【第206期】面试官:你们的项目如何处理重复请求/并发请求?

【第206期】面试官:你们的项目如何处理重复请求/并发请求?

  • 发布:2023-10-04 10:30

2022年5月17日下午4:00 • 面试问题 • 阅读 15 点击上方“Java面试题精选”,关注公众号 面试时画图,查漏补缺 >>例外:公众号改版后,文章顺序不固定。欢迎您将我们的面试题选公众号设为星星。感谢您一年来的支持! ! 阶段总结合集:一年内容,200道Java面试题阶段总结 对于某些用户请求,在某些情况下可能会重复发送。如果是查询操作的话倒也没什么大不了的,但是有些涉及到写操作。一旦重复,可能会导致交易等严重后果。如果重复请求该接口,可能会导致重复下单。 重复出现的场景可能是: 黑客拦截了请求并重放了它 前端/客户端由于某种原因重复发送请求,或者用户短时间内重复点击。 网关重传 …… 本文讨论如何在服务器端优雅、统一地处理这种情况。如何禁止用户重复点击等客户端操作超出了本文的讨论范围。 使用唯一请求号进行重复数据删除 你可能会想到的是,只要请求有唯一的请求号,就可以使用Redis来做这个去重——只要redis中存在唯一的请求号,并且证明它已经被处理过,那么就认为是重复的。 代码大致如下: String userId= "12345678";//用户String method = "pay";//接口名称 String dedupMD5 = new ReqDedupHelper().dedupParamMD5(req,"requestTime");//计算请求参数汇总,不包括请求时间干扰字符串KEY = "dedup:U=" + userId + "M=" + method + "P=" + dedupMD5; 长过期时间 = 1000; // 1000毫秒过期,1000ms内重复请求将被视为重复 long expireAt = System.currentTimeMillis() + expireTime;String val = "expireAt@" + expireAt;// 注意:直接SETNX不支持过期时间,因此设置+过期不是原子操作。极端情况下,设置后可能不会过期。后续相同的请求可能会误认为需要去重,所以这里使用了底层API来保证 SETNX+ 过期时间是一个原子操作 Boolean firstSet = stringRedisTemplate.execute((RedisCallback) connection -> connection.set( KEY.getBytes()、val.getBytes()、Expiration.milliseconds(expireTime)、RedisStringCommands.SetOption.SET_IF_ABSENT) ); 最终布尔 isConsiderDup;if (firstSet != null && firstSet) { isConsiderDup = false;} else { isConsiderDup = true;} 结尾 来源:www.sychzs.cn/blog/2020/05/19/handle-duplicate-request 推荐十期 【第191期】面试官:您能谈谈SOA架构和微服务架构的区别吗? 【第192期】面试官:线程池中多余的线程如何回收? 【第193期】如何使用装饰器模式在不改变原有对象的情况下扩展功能 [第194期] Redis - 我们应该如何执行非第三方jar封装的命令? 【第195期】MySQL中可以使用条件判断函数CASE WHEN、IF、IFNULL吗? 【第196期】打好基础,Java8新特性Stream详细教程 【第197期】华为OD两轮技术面试记录,供后人参考! 【第198期】面试官:你能告诉我方法重载和方法重写的原理吗? 【第199期】100%使用的hashCode()和equals()方法及使用规范你掌握了吗? 【第200期】面试官:您能简单讲一下SpringMVC的实现原理吗? 而不是在网上搜索问题?还不赶快关注我们吧~版权声明:本文内容由网友自愿贡献,本文所表达的观点仅代表作者自己的观点。本网站仅提供信息存储空间服务,不拥有任何所有权,也不承担相关法律责任。如果您发现本站有任何涉嫌侵权/非法内容,请发送邮件举报。一经核实,该网站将立即删除。 本文由斑马博客整理。本文链接为:https://www.sychzs.cn/index.php/post/7683.html

相关文章

热门推荐