redis+token+分布式锁确保接口的幂等性

这篇具有很好参考价值的文章主要介绍了redis+token+分布式锁确保接口的幂等性。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1.幂等性是什么?

2.如何实现幂等性呢?

1.新增管理员,出弹窗的同时,请求后台。

2.后端根据雪花算法生成唯一标识key,以雪花数为key存到redis。并返回key给前端。

3.前端保存后端传过来的key。

4.前端输入完成信息,点击【保存】,携带key请求后端。

5.请求到达后端,验证key,根据key去redis里查,如果得不到值,说明已处理过。否则尝试获取redisson锁,然后处理业务,并删掉redis里的值。


1.幂等性是什么?

新增和修改功能的时候,常常需要用到幂等性。

所谓的幂等性就是,即使不小心多按了几次,仍然只执行一次。常用在下单、增量修改、插入数据的时候。

redis+token+分布式锁确保接口的幂等性,redis,数据库,缓存

效果:

在同一时间狂点鼠标“新增”,或者jmter压测并发多线程访问这个接口,也执行一次新增。

redis+token+分布式锁确保接口的幂等性,redis,数据库,缓存

 

2.如何实现幂等性呢?

本次案例采用,token+redis+分布式锁:

流程如下所示:

redis+token+分布式锁确保接口的幂等性,redis,数据库,缓存文章来源地址https://www.toymoban.com/news/detail-624188.html

1.新增管理员,出弹窗的同时,请求后台。

//获取唯一标识
    beforeAdd() {
      setTimeout(() => {
        this.dialogAdd = true;
      }, 500);
      //请求后台拿唯一标识
      (this.imageUrl = ""),
        this.$axios.get("/api/pc-zdy-sys/admin/preAddAdmin").then((res) => {
          if (res.data.code == 200) {
            this.allRoleList = res.data.data.allRoleList; //系统里所有的角色
            this.key = res.data.data.key; //唯一标识key
          }
        });
    },

2.后端根据雪花算法生成唯一标识key,以雪花数为key存到redis。并返回key给前端。

 public String preAddAdmin() {
        //雪花id 为key存到redis 值可以无意义
        Long snowflakeNextId = IdUtil.getSnowflakeNextId();
        String key = String.valueOf(snowflakeNextId);
        redisTemplate.opsForValue().set(key,"唯一标识");
        //返回雪花id
        return key;
    }

3.前端保存后端传过来的key。

data() {
    return {
      key: "", //唯一标识key
    };
  },

4.前端输入完成信息,点击【保存】,携带key请求后端。

confirmAdd() {
      
      //key带到后台去,请求接口确认新增
      this.AddAdmin.url = this.imageUrl;
      this.AddAdmin.key = this.key;
      if(this.isAnyFieldEmpty){
        this.$message({
              message: "不能为空",
              type: "danger",
            });
      
        return;
      }
      this.$axios
        .post("/api/pc-zdy-sys/admin", this.AddAdmin)
        .then((res) => {
          if (res.data.code == 200) {
            this.$message({
              message: "恭喜你,新增成功",
              type: "success",
            });
            this.dialogAdd = false;
            this.queryAdmin()
          }
        })
        .catch((error) => {
          this.$message({
            message: "新增失败",
            type: "danger",
          });
        });
    },

5.请求到达后端,验证key,根据key去redis里查,如果得不到值,说明已处理过。否则尝试获取redisson锁,然后处理业务,并删掉redis里的值。

public void addAdmin(UserDTO userDTO) {
        //根据key找是否有token
        String key = userDTO.getKey();
         if(StringUtils.isBlank(key)||ObjectUtil.isEmpty(redisTemplate.opsForValue().get(key))){
            //没有key或根据key找不到token直接抛异常
            throw new RuntimeException("新增失败");
        }
        //拿锁去处理
        RLock lock = redissonClient.getLock(key);

        boolean b = lock.tryLock();

        //如果拿锁失败
        if(!b){
            throw new RuntimeException("新增失败");
        }
        lock.lock();
        try {
            //admin加到用户表
            User user = new User();
            BeanUtils.copyProperties(userDTO,user);
            user.setStatus(1);
            userMapper.insert(user);
            //将userDTO里角色list加到角色-用户 中间表去
            //需要用户id 角色id集合
            userRoleMapper.addRoleListToUserRole(user.getId(),userDTO.getRoleList());
            //删掉缓存
            redisTemplate.delete(key);
        
        } catch (Exception e){
            e.printStackTrace();
        }finally {
            lock.unlock();
        }
    }

到了这里,关于redis+token+分布式锁确保接口的幂等性的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 一个注解解决分布式锁和接口幂等性,springboot 实战 。强到离大谱

    如今基本上都是分布式、多节点时代,我们业务代码中避免不了需要使用分布式锁。 admin4j-lock 为我们提供分布式锁解决方案。支持 redisson 和 zookeeper 分布式锁 支持redisson分布式锁和zookeeper 分布式锁 支持可重入锁 支持读写锁 支持红锁 redLock 支持一个注解解决分布式锁问题

    2023年04月26日
    浏览(43)
  • 使用 redis 实现分布式接口限流注解 RedisLimit

    前言 很多时候,由于种种不可描述的原因,我们需要针对单个接口实现接口限流,防止访问次数过于频繁。这里就用 redis+aop 实现一个限流接口注解 @RedisLimit 代码 点击查看RedisLimit注解代码 AOP代码 点击查看aop代码 lua脚本代码 注意:脚本代码是放在 resources 文件下的,它的类型是

    2024年02月08日
    浏览(59)
  • 【分布式】: 幂等性和实现方式

    幂等(idempotent、idempotence)是一个数学与计算机学概念, 常见于抽象代数中。在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统

    2024年02月08日
    浏览(45)
  • 云事业群CTO线技术晋升考核机试题-分布式专题-G 分布式幂等架构设计

    作者:田超凡 1 幂等的基本概念 答:幂等指的是同一块业务逻辑重复多次执行时,只能令其生效一次,防止重复执行。 2 幂等的发生场景 答: RPC 调用接口的幂等性问题 MQ 消费者防止重复消费的幂等性问题 定时任务防止重复执行的幂等性问题 3 RPC调用接口的幂等性问题产生

    2024年02月16日
    浏览(42)
  • Springboot 定时任务,分布式下幂等性如何解决

    在分布式环境下,定时任务的幂等性问题需要考虑多个节点之间的数据一致性和事务处理。 一种解决方法是使用分布式锁来保证同一时间只有一个节点能够执行该任务。具体实现可以使用Redis或Zookeeper等分布式协调工具提供的分布式锁功能。 另一种解决方法是使用消息队列来

    2024年02月11日
    浏览(34)
  • 【Spring Cloud系列】- 分布式系统中实现幂等性的几种方式

    在开发订单系统时,我们常遇见支付问题,既用户购买商品后支付,支付扣款成功,但是返回结果的时候网络异常,此时钱已经扣了,用户再次点击按钮,此时会进行第二次扣款,返回结果成功,用户查询余额发现多扣钱了,流水记录也变成了两条。在以前的单应用系统中,

    2024年02月10日
    浏览(45)
  • 如何保证接口的幂等性?

    作者:小牛呼噜噜 | https://xiaoniuhululu.com 计算机内功、源码解析、科技故事、项目实战、面试八股等更多硬核文章,首发于公众号「小牛呼噜噜」 目录 什么是幂等性? 为什么需要保证幂等性? 接口幂等设计和防止重复提交可以等同吗? 常用保证幂等性的措施 先select再inse

    2024年02月08日
    浏览(41)
  • 如何确保云中高可用?聊聊F5分布式云DNS负载均衡

    在当今以应用为中心的动态化市场中,企业面临着越来越大的压力,不仅需要提供客户所期望的信息、服务和体验,而且要做到快速、可靠和安全。DNS是网络基础设施的重要组成部分,拥有一个可用的、智能的、安全和可扩展的DNS基础设施是至关重要的。想简化基于云的 DN

    2024年02月03日
    浏览(47)
  • 开源:Taurus.Idempotent 分布式幂等性锁框架,支持 .Net 和 .Net Core 双系列版本

    分布式幂等性框架的作用是确保在分布式系统中的操作具有幂等性,即无论操作被重复执行多少次,最终的结果都是一致的。幂等性是指对同一操作的多次执行所产生的效果与仅执行一次的效果相同。 以下是分布式幂等性框架的主要作用: 避免重复操作: 在分布式系统中,

    2024年03月09日
    浏览(38)
  • 分布式环境集成JWT(Java Web Token)

    Token的引入:客户端向服务端请求数据时一般都会加入验证信息,比如客户端在请求的信息中携带用户名、密码,服务端会校验用户名和密码是否正确,校验通过响应该客户端请求。但是每次都携带用户名和密码无疑有些繁琐,而且也不安全,在这种背景下,Token便应运而生。

    2024年02月11日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包