详解Redis如何保证接口的幂等性

 更新时间:2023年11月14日 11:26:33   作者:shigen01  
如何防止接口中同样的数据提交,以及如何保证消息不被重复消费,这些都是shigen在学习的过程中遇到的问题,今天,趁着在学习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如何保证接口的幂等性的文章就介绍到这了,更多相关Redis保证接口的幂等性内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Redis配置文件redis.conf详细配置说明

    Redis配置文件redis.conf详细配置说明

    本文列出了Redis的配置文件redis.conf的各配置项的详细说明,简单易懂
    2018-03-03
  • 详解redis大幅性能提升之使用管道(PipeLine)和批量(Batch)操作

    详解redis大幅性能提升之使用管道(PipeLine)和批量(Batch)操作

    这篇文章主要介绍了详解redis大幅性能提升之使用管道(PipeLine)和批量(Batch)操作 ,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2016-12-12
  • redis快速部署为docker容器的方法实现

    redis快速部署为docker容器的方法实现

    部署 Redis 作为 Docker 容器是一种快速、灵活且可重复使用的方式,特别适合开发、测试和部署环境,本文主要介绍了redis快速部署为docker容器的方法实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-05-05
  • 单线程Redis快的4 个原因总结

    单线程Redis快的4 个原因总结

    作为内存中数据存储,Redis 以其速度和性能着称,通常被用作大多数后端服务的缓存解决方案,但是,在内部,Redis 采用单线程架构,为什么单线程设计依然会有这么高的性能,在本文中,让我们深入探讨为什么 Redis 才有单线程架构
    2023-07-07
  • 浅谈redis缓存在项目中的使用

    浅谈redis缓存在项目中的使用

    最近由于项目需要,在系统缓存服务部分上用到了redis,本文就浅谈下在redis缓存在项目中的使用,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • redis实现多级缓存同步方案详解

    redis实现多级缓存同步方案详解

    这篇文章主要介绍了redis实现多级缓存同步方案详解,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-12-12
  • Redis可视化客户端小结

    Redis可视化客户端小结

    因为 Redis 官方只提供了命令行版的 Redis 客户端 redis-cli,以至于我们在使用的时候会比较麻烦,而且命令行版的客户端看起来也不够直观,下面是我这些年使用过的一些 Redis 可视化客户端,分享给大家
    2021-06-06
  • 基于redis实现token验证用户是否登陆

    基于redis实现token验证用户是否登陆

    这篇文章主要为大家详细介绍了基于redis实现token验证用户是否登陆,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • Redis实现高并发计数器

    Redis实现高并发计数器

    这篇文章主要为大家详细介绍了Redis实现高并发计数器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-10-10
  • 详解Redis中数值乱码的根本原因以及解决方式

    详解Redis中数值乱码的根本原因以及解决方式

    这篇文章给大家详细分析了Redis中数值乱码的根本原因以及解决方式,通过代码示例给大家介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-02-02

最新评论