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

redis中的锁,通过UUID防止误删

    @Autowired
    private StockMapper stockMapper;
    /**
     * redisTemplate
     */
    //StringRedisTemplate 和 RedisTemplate  序列化器不同
    @Autowired
    private StringRedisTemplate redisTemplate;


    //redis的乐观锁保证了线程安全,但是效率比较慢,而且还会因为机器的性能问题,导致连接不够用,所以不推荐使用redis的的乐观锁
    public void deduct() {

       //防止锁被误删
        String uuid = UUID.randomUUID().toString();
        //加锁setnx
        Boolean lockFirst = this.redisTemplate.opsForValue().setIfAbsent("lock", uuid,3, TimeUnit.SECONDS);
        // 重试、循环
        while(!lockFirst){
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
        try {
// 1.查询库存信息
            String stock = redisTemplate.opsForValue().get("stock").toString();
            //2.判断库存是否充足
            if (stock != null && stock.length() != 0) {
                Integer st = Integer.valueOf(stock);
                if (st > 0) {
                    //扣减库存
                    redisTemplate.opsForValue().set("stock", String.valueOf(--st));
                }
            }

        } finally {
            //解锁
            //判断是自己的锁,然后再进行解锁
            if(StringUtils.equals(this.redisTemplate.opsForValue().get("lock"),uuid )){
                this.redisTemplate.delete("lock");
            }

        }


    }

相关文章:

  • 生命在于折腾——浅谈羊了个羊
  • 微雪树莓派PICO笔记——6. I2C(集成电路总线)
  • 容斥原理
  • RealityCapture摄影测量软件
  • TransBigData:一款基于 Python 的超酷炫交通时空大数据工具包
  • 矩阵理论复习部分——线性代数(1)行列式
  • 3 MyBatis 级联操作
  • Vue项目的部署(服务器)
  • 什么是 Docker 镜像层?
  • 0922 理论知识
  • 信号采集之传感器信号学习笔记
  • CS:APP第九章 虚拟内存
  • Android Tile快捷设置
  • JVM监控和诊断的工具(JProfiler)
  • 批判性思维读书笔记
  • [LeetCode] Wiggle Sort
  • [译] 怎样写一个基础的编译器
  • [译]前端离线指南(上)
  • 【剑指offer】让抽象问题具体化
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • Docker 笔记(2):Dockerfile
  • Flannel解读
  • React系列之 Redux 架构模式
  • spring boot下thymeleaf全局静态变量配置
  • SpringCloud集成分布式事务LCN (一)
  • 聊聊hikari连接池的leakDetectionThreshold
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 排序(1):冒泡排序
  • 小李飞刀:SQL题目刷起来!
  • 由插件封装引出的一丢丢思考
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • ​一些不规范的GTID使用场景
  • #162 (Div. 2)
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • ${factoryList }后面有空格不影响
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (C语言)fread与fwrite详解
  • (libusb) usb口自动刷新
  • (八)Spring源码解析:Spring MVC
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (三)mysql_MYSQL(三)
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .net CHARTING图表控件下载地址
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .net 调用php,php 调用.net com组件 --
  • .net 发送邮件
  • .Net 垃圾回收机制原理(二)
  • .net解析传过来的xml_DOM4J解析XML文件