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

防止死锁,一定要给锁加过期时间

指令方式: set  lock  111 ex  20  nx

                   get  lock

                   ttl  lock

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


    //redis的乐观锁保证了线程安全,但是效率比较慢,而且还会因为机器的性能问题,导致连接不够用,所以不推荐使用redis的的乐观锁
    public void deduct() {
        //加锁setnx (既可以防止死锁,又可以保证原子性)
        Boolean lockFirst = this.redisTemplate.opsForValue().setIfAbsent("lock", "111",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 {
            //解锁
            this.redisTemplate.delete("lock");
        }


    }

相关文章:

  • 实验 gazebo_ros_control
  • freeswitch三、开启视频通话功能
  • python中的列表对象
  • POC(客户验证性测试)项目中关于性能测试的一些心得
  • react扩展(一些单独技术点)
  • 多媒体相关的计算和种类
  • Vue项目实战——实现一个任务清单【基于 Vue3.x 全家桶(简易版)】
  • 分布式架构简述
  • 跨平台应用开发进阶(三十四) :uni-app 实现微信分享
  • 丙烯酸酯-聚乙二醇-羧基,AC-PEG-COOH,Acrylate-PEG-Acid一种带PEG间隔基的交联剂
  • Vue基本原理
  • 【MySql】mysql之主从复制和读写分离搭建
  • Python读取csv文件(super详细简单版)
  • 前端开发node.js、vue安装环境【安装node版本管理工具-nvm,耗时一天时间踩坑总结】
  • Cesium插值计算:运动的Label标签
  • 【css3】浏览器内核及其兼容性
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • android 一些 utils
  • HTML中设置input等文本框为不可操作
  • Idea+maven+scala构建包并在spark on yarn 运行
  • Linux快速复制或删除大量小文件
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • Python3爬取英雄联盟英雄皮肤大图
  • python学习笔记-类对象的信息
  • Swoft 源码剖析 - 代码自动更新机制
  • V4L2视频输入框架概述
  • 关于for循环的简单归纳
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 解析带emoji和链接的聊天系统消息
  • 区块链将重新定义世界
  • 如何实现 font-size 的响应式
  • 微信小程序--------语音识别(前端自己也能玩)
  • ​Spring Boot 分片上传文件
  • #include到底该写在哪
  • #pragma once
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • (0)Nginx 功能特性
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (编译到47%失败)to be deleted
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .NET Core 中插件式开发实现
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .net 怎么循环得到数组里的值_关于js数组
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • :O)修改linux硬件时间
  • @四年级家长,这条香港优才计划+华侨生联考捷径,一定要看!
  • [3300万人的聊天室] 作为产品的上游公司该如何?
  • [383] 赎金信 js
  • [Android实例] 保持屏幕长亮的两种方法 [转]