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

基于redis实现分布式锁的demo(循环重试)(比递归重试更好点)

    @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");
        //
        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");
            }


    }

相关文章:

  • Matplotlib 入门(一)
  • C++ Tutorials: C++ Language: Introduction: Compilers: Dev-C++
  • FineReport模板设计器——帆软笔记
  • flutter升级/版本切换
  • TDesign小程序组件库体验
  • 扩展工具 - 图片验证码生成工具kaptcha
  • 淤地坝安全自动监测预警系统解决方案
  • Revit中的公制植物RPC族制作步骤
  • E. Counting Rectangles(二维前缀和)
  • 流量操作与后门
  • RADIUS 本地服务器还能用吗?
  • springboot+mybatisplus+postgis实现几何点和线串增删改查分页
  • linux内核移植流程
  • canvas 正在慢慢吃掉你的内存...
  • 【无标题】11111
  •  D - 粉碎叛乱F - 其他起义
  • docker容器内的网络抓包
  • Golang-长连接-状态推送
  • JavaScript学习总结——原型
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • nginx 负载服务器优化
  • PV统计优化设计
  • webpack4 一点通
  • 闭包--闭包之tab栏切换(四)
  • 关于字符编码你应该知道的事情
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 前端设计模式
  • 协程
  • 携程小程序初体验
  • 译自由幺半群
  • 在Docker Swarm上部署Apache Storm:第1部分
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • Mac 上flink的安装与启动
  • 阿里云服务器如何修改远程端口?
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • #define用法
  • (06)金属布线——为半导体注入生命的连接
  • (1)虚拟机的安装与使用,linux系统安装
  • (C)一些题4
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (动态规划)5. 最长回文子串 java解决
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (四)鸿鹄云架构一服务注册中心
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (转)拼包函数及网络封包的异常处理(含代码)
  • (转载)OpenStack Hacker养成指南
  • ******之网络***——物理***
  • . NET自动找可写目录
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .NET CLR Hosting 简介
  • .NET Core跨平台微服务学习资源
  • .NET多线程执行函数
  • .pub是什么文件_Rust 模块和文件 - 「译」