当前位置: 首页 > news >正文

redis如何保证接口的幂等性

背景

如何防止接口中同样的数据提交,以及如何保证消息不被重复消费,这些都是shigen在学习的过程中遇到的问题。今天,趁着在学习redis的间隙,我写了一篇文章进行简单的实现。

注意:仅使用于单机的场景,对于分布式、高并发场景,还是建议使用分布式锁。

首先我们分析一下Restful接口和幂等性的关系:

请求方式是否幂等对应的sql案例
getselect * from user;
putupdate user set name=‘shigen’ where id =10001;
deletedelete from user where id = 10002;
Postinsert into user (id, name) values(10002, ‘shigen’);

可见我们主要是针对post的请求方式做进一步的优化。

常用的解决方式

大概主流的解决方案:

  • token机制(前端带着在请求头上带着标识,后端验证)
  • 加锁机制
    • 数据库悲观锁(锁表)
    • 数据库乐观锁(version号进行控制)
    • 业务层分布式锁(加分布式锁redisson)
  • 全局唯一索引机制,ID不能重复
  • redis的set机制
  • 前端按钮加限制,类似于vue的v-once指令,但前提是用户不刷新页面

今天用到的就是redis的set方法。我们只需要一个注解即可实现,接下来看看shigen是如何的设计吧!

代码实现

  • 自定义注解Idempotent

其中的value表示接口的唯一标识,可以为空,下边的IdempotentAspect中会讲到

  • 定义IdempotentAspect的切片

这里主要是定义一个切片的环绕通知,在里边处理主要的接口防刷逻辑

  • 幂等性处理类IdempotentProcessor

接口的唯一标识变成了方法名+方法的参数

  • 幂等性处理接口IdempotentProcessor的实现类RedisIdempotentProcessor

好的所有的准备已经就绪,现在我们写一个测试的接口测试一下:

采用的是get请求测试,是为了方便。post请求的使用也和案例一样。

直接写上一个注解即可。我们还是采用ab进行测试。

ab -n 2 '127.0.0.1:9000/idempotent/test?msg=test'

控制台的输出如下:

成功了一次,失败了1次,并且redis中出现了值为true的keytesttest。java后端也如期的出现了the same requests的异常信息。


好了,以上就是《redis如何保证接口的幂等性》的全部内容了,觉得不错的话,记得点赞 在看 转发 关注哈,感谢您的支持。

shigen一起,每天不一样!

http://www.lryc.cn/news/161657.html

相关文章:

  • 避坑之路 —— 前后端 json 的注意问题
  • [构建 Vue 组件库] 小尾巴 UI 组件库 —— 横向商品卡片(仿淘宝)
  • 【Python】Python实现五子棋游戏(带可视化界面)【独一无二】
  • 用Maloja创建音乐收听统计数据
  • GRU门控循环单元
  • 使用Puppeteer构建博客内容的自动标签生成器
  • 大数据分析案例-基于随机森林算法构建二手房价格预测模型
  • SLAM从入门到精通(ROS安装)
  • Linux 下spi设备驱动
  • 一:图形的位置和尺寸测量
  • rtthread下基于spi device架构MCP25625驱动
  • Open3D 点云投影到圆柱(python详细过程版)
  • Unity实战(10):如何将某个相机的画面做成贴图(RenderTexture)
  • STL- 函数对象
  • 前端 JS 经典:上传文件
  • 数据分析面试
  • Open3D(C++) 整体最小二乘拟合平面
  • 【android12-linux-5.1】【ST芯片】【RK3588】【LSM6DSR】HAL源码分析
  • MT8788安卓核心板详细参数_MTK安卓主板开发板智能通讯模块
  • C++String模拟实现
  • Java 设置免登录请求接口被拦截问题
  • (其他) 剑指 Offer 67. 把字符串转换成整数 ——【Leetcode每日一题】
  • 【MySQL】一文详解MySQL,从基础概念到调优
  • 机器学习——boosting之提升树
  • 解决Spring Boot启动错误的技术指南
  • 使用Spring Security保障你的Web应用安全
  • PostgreSQL本地化
  • MySQL——日志
  • 玩转Mysql系列 - 第18篇:流程控制语句(高手进阶)
  • LED屏幕电流驱动设计原理