springboot2.2.X手册:分布式系统下,重复提交的解决方案

目录什么是幂等性重复提交如何产生基于redis的防止重复提交引入POM文件新建重复提交注解新建重复提交拦截新增redis配置新建测试类上一篇:springboot2.2.X手册:是时候用Lettuce替换Jedis操作Redis缓存了上一篇中我们讲解了redis,主要是因为接下来的更新,都会涉及到redis的操作,所以就放在上一篇了。今天我们主要讲解重复提交的问题,这种问题,算是比较常见,但是又容易出问题,加上现在基本上都是微服务架构,今天来聊一下在分布式系统下,
摘要由CSDN通过智能技术生成

目录

什么是幂等性

重复提交如何产生

基于redis的防止重复提交

引入POM文件

新建重复提交注解

新建重复提交拦截

新增redis配置

新建测试类


上一篇:springboot2.2.X手册:是时候用Lettuce替换Jedis操作Redis缓存了

上一篇中我们讲解了redis,主要是因为接下来的更新,都会涉及到redis的操作,所以就放在上一篇了。

今天我们主要讲解重复提交的问题,这种问题,算是比较常见,但是又容易出问题,加上现在基本上都是微服务架构,今天来聊一下在分布式系统下,如果防止重复提交。

springboot2.2.X手册:分布式系统下,重复提交的解决方案

 

什么是幂等性

小编以前面试过一家公司,被问到什么是幂等性,当时不懂,就瞎扯了一番,惨遭面试官鄙视。

幂等性指的是多次运算结果一样,用公式来表示就是F(F(x))=F(x)。

在我们的对数据库的操作中,以下操作就是幂等性

select查询就是最基础的幂等性

delete删除也是一样,删除多少次都是一样的结果

update这里分两种,如果是更新某个值,那就是幂等性;如果是更新累加操作的,那就是非幂等性。

insert是非幂等性操作,毕竟每次都增加一条,从而导致数据变化了

springboot2.2.X手册:分布式系统下,重复提交的解决方案

 

重复提交如何产生

重复问题发生的情况比较多,小编总结了一下以下几点

1、提交按钮点击两次

2、浏览器提交后进行后退操作,然后再一次提交

3、使用浏览器的历史记录进行重复提交表单

4、重复的请求浏览器的http请求

5、nginx不断重新发送

6、分布式RPC中,进行了try重试等

springboot2.2.X手册:分布式系统下,重复提交的解决方案

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
当然可以给你一个简单的 MyWebSocketHandler 的示例,如下所示: ```java import com.alibaba.fastjson.JSON; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import org.springframework.web.socket.CloseStatus; import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.WebSocketHandler; import org.springframework.web.socket.WebSocketMessage; import org.springframework.web.socket.WebSocketSession; @Component public class MyWebSocketHandler implements WebSocketHandler { private static final Logger logger = LoggerFactory.getLogger(MyWebSocketHandler.class); // 当 WebSocket 建立连接时调用 @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { logger.info("WebSocket opened"); session.sendMessage(new TextMessage("WebSocket connected")); } // 当收到 WebSocket 消息时调用 @Override public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception { logger.info("WebSocket received a message: {}", message.getPayload().toString()); // 解析收到的消息 try { MessageData data = JSON.parseObject(message.getPayload().toString(), MessageData.class); // 处理收到的消息 if ("ping".equals(data.getType())) { session.sendMessage(new TextMessage(JSON.toJSONString(new MessageData("pong")))); } else { session.sendMessage(new TextMessage(JSON.toJSONString(new MessageData("error", "Unknown message type")))); } } catch (Exception e) { logger.error("Error parsing or processing message: {}", e.getMessage()); } } // 当 WebSocket 关闭连接时调用 @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception { logger.info("WebSocket closed"); } // 当发生错误时调用 @Override public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception { logger.error("WebSocket error: {}", exception.getMessage()); } // 是否支持部分消息 @Override public boolean supportsPartialMessages() { return false; } } ``` 这个简单的 MyWebSocketHandler 示例实现了 WebSocket 的基本功能,包括建立连接、接收消息、关闭连接等。在这个示例中,我们还演示了如何解析收到的 JSON 格式的消息,并根据消息类型做出不同的响应。这个示例可以作为你编写自己的 WebSocket 处理器的参考,实现更加复杂的功能。需要注意的是,在 SpringBoot 2.2.x 中,需要使用 `@Component` 注解将 WebSocket 处理器标记为 Spring 组件,以便自动扫描并注册到 Spring 容器中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

互联网应用架构

码字不易,各位施主行行好吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值