泉州公司建站模板,网站建设网站模板,友链是什么,域名服务器的作用是什么背景
如何防止接口中同样的数据提交#xff0c;以及如何保证消息不被重复消费#xff0c;这些都是shigen在学习的过程中遇到的问题。今天#xff0c;趁着在学习redis的间隙#xff0c;我写了一篇文章进行简单的实现。 注意#xff1a;仅使用于单机的场景#xff0c;对于…背景
如何防止接口中同样的数据提交以及如何保证消息不被重复消费这些都是shigen在学习的过程中遇到的问题。今天趁着在学习redis的间隙我写了一篇文章进行简单的实现。 注意仅使用于单机的场景对于分布式、高并发场景还是建议使用分布式锁。 首先我们分析一下Restful接口和幂等性的关系
请求方式是否幂等对应的sql案例get是select * from user;put是update user set name‘shigen’ where id 10001;delete是delete from user where id 10002;Post否insert 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?msgtest控制台的输出如下 成功了一次失败了1次并且redis中出现了值为true的keytesttest。java后端也如期的出现了the same requests的异常信息。 好了以上就是《redis如何保证接口的幂等性》的全部内容了觉得不错的话记得点赞 在看 转发 关注哈感谢您的支持。
与shigen一起每天不一样