【开源中国 APP 全新上线】“动弹” 回归、集成大模型对话、畅读技术报告”
if(StringUtils.isEmpty(key)){
log.error(" key为空 ");
throw new Exception("key为空");
}
//如果缓存中存在此key 视为重复提交
if(redisTemplate.opsForValue().get(key) == null){
//不存在 放入redis 设置超时时间为2s
redisTemplate.opsForValue().set(key,key,60, TimeUnit.SECONDS);
}else{
log.error(" 重复提交 ");
throw new Exception("重复提交");
}
log.info(" ===================业务动态代理成功请求提交了=========================== ");
引用来自“北极心”的评论
补充上面的字符串转表情了
“先取值后进行判断,再做处理”,这种做法,典型的不安全。会有并发问题。
这句是有并发问题的。
防止重复提交,弄个“加载动画”吧。服务器没影响结果,就不允许再次执行提交操作。
看看日志,打印重复提交没有,key的判断逻辑没什么问题
http request是并发发送的. 会不会是第一个request 发送到服务器, 服务器还没来得及处理.(收到请求但是redis还没写入进去)
用户快速点击第二次, 这时候服务器可能会拥堵等等, 检查重复的时候redis还没第一次写入的数据 于是便处理了.
setNx,年轻人
加锁
图简单的话redis那一块加个锁万事大吉