jedis实现分布式锁案例:

news2024/11/18 19:53:25

一、redis配置类:

import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;



@Configuration
@Data
public class JedisConfig {

    @Value("${spring.redis.host}")
    private String host;

    @Value("${spring.redis.port}")
    private int port;

    @Value("${spring.redis.database}")
    private int database;

}

二、实现分布式锁工具类:

import redis.clients.jedis.Jedis;


/**
 * @author:songwl
 * @Date:2023/9/15 10:08
 * @Description:
 */
public class AndawellRedisLock {

    private Jedis jedis;
    private String lockKey;
    /**
     * 锁自动过期时间,60秒
     */
    private int expireTime = 60;
    /**
     * 重试时间,3秒
     */
    private int retryTime = 3;


    public AndawellRedisLock(String host, int port, int database,String lockKey, int expireTime) {
        this.jedis = new Jedis(host, port);
        jedis.select(database);
        this.lockKey = lockKey;
        this.expireTime = expireTime;
    }

    public AndawellRedisLock(String host, int port, int database, String lockKey) {
        this.jedis = new Jedis(host, port);
        jedis.select(database);
        this.lockKey = lockKey;
    }

/*    public AndawellRedisLock(int database,String lockKey) {
        this.jedis = new Jedis();
        jedis.select(database);
        this.lockKey = lockKey;
    }*/

    /**
     * @author: songwl
     * @Date: 2023/9/15 10:38
     * @description:
     */
    public boolean acquire() {
        long startTime = System.currentTimeMillis();
        while (System.currentTimeMillis() - startTime < retryTime * 1000) {
            if (jedis.setnx(lockKey, "locked") == 1) {
                jedis.expire(lockKey, expireTime);
                //TimeLogUtil.printlnNowTime("内:"+Thread.currentThread().getName());
                return true;
            }
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        return false;
    }

    public void release() {
        jedis.del(lockKey);
        if(jedis!=null){
            jedis.close();
        }
    }

    public void close() {
        if(jedis!=null){
            jedis.close();
        }
    }
}

三、使用案例:

引入配置类:
在这里插入图片描述

    @RequestMapping("/getLock")
    public String getAndawellRedisLock() {
        AndawellRedisLock andawellRedisLock = new AndawellRedisLock(jedisConfig.getHost(),jedisConfig.getPort(),jedisConfig.getDatabase(),"swlLock");
        // 获取锁
        if (andawellRedisLock.acquire()) {
            try {
                TimeUnit.SECONDS.sleep(10);
                // 执行需要加锁的业务逻辑
                System.out.println("获取到锁,执行业务逻辑");
            } catch (Exception e){

            } finally {
                // 释放锁
                andawellRedisLock.release();
            }
        } else {
            System.out.println("获取锁失败,其他进程已经持有锁");
            andawellRedisLock.close();
        }
        return "成功";
    }

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1025141.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

行业报告:视频直播美颜sdk对互联网直播产业的影响与前景

随着互联网直播产业的不断崛起&#xff0c;直播内容的质量和用户体验已成为成功的关键因素之一。本篇报告将深入研究视频直播美颜sdk对互联网直播产业的影响&#xff0c;并探讨其未来的前景。 第一章&#xff1a;视频直播美颜sdk的基本概念 1.1 什么是视频直播美颜 SDK&#x…

【音视频】H264视频压缩格式

H264简介 H.264从1999年开始&#xff0c;到2003年形成草案&#xff0c;最后在2007年定稿有待核实。在ITU的标准里称为H.264, 在MPEG的标准里是MPEG-4的一个组成部分-MPEG-4 Part 10&#xff0c;又叫Advanced Video Codec&#xff0c;因此常常称为MPEG-4AVC或直接叫AVC。 压缩算…

RabbitMQ —— 深入发布确认

前言 面对在实际的生产环境中RabbitMQ服务宕机或者重启导致消息在投递阶段丢失的问题&#xff0c;我们需要采用消息的发布确认和回退消息两种机制来保证消息的不丢失。在这篇文章中&#xff0c;荔枝同样以demo实例的方式来梳理相关的知识&#xff0c;希望能够帮助到有需要的小伙…

土耳其市场最全开发攻略

2023年6月1日起&#xff0c;亚马逊土耳其站开始正式面向中国卖家试运营。土耳其这个古丝绸之路西域的重要节点&#xff0c;再一次吸引了来自东方众商家的目光。 土耳其是一个著名的贸易中心&#xff0c;向世界提供许多出口产品。土耳其总统埃尔多安指出&#xff0c;根据调整后…

[Linux 基础] linux基础指令(2)head,tail,Cal,find,grep,zip/unzip,tar,bc,uname

文章目录 1、head指令2、tail指令引申&#xff1a;如何拿到中间行内容方案一&#xff1a;方案二&#xff1a;方案三&#xff1a; 补充指令&#xff1a;(1) wc -l 文件名(2) uniq 文件名(3) sort 文件名 3、时间相关的指令4、Cal指令5、find指令&#xff1a;&#xff08;灰常重要…

如何设置代理ip服务器地址

目录 前言 一、使用HTTP代理服务器 1. Python代码 2. Java代码 二、使用SOCKS代理服务器 1. Python代码 2. Java代码 三、使用代理池 1. Python代码 2. Java代码 总结 前言 代理服务器是一种可以隐藏真实IP地址并且保护用户隐私的工具。在某些情况下&#xff0c;比…

「聊设计模式」之备忘录模式(Memento)

&#x1f3c6;本文收录于《聊设计模式》专栏&#xff0c;专门攻坚指数级提升&#xff0c;助你一臂之力&#xff0c;带你早日登顶&#x1f680;&#xff0c;欢迎持续关注&&收藏&&订阅&#xff01; 前言 设计模式是软件设计中经典的解决方案&#xff0c;旨在解决…

中科驭数联合处理器芯片全国重点实验室获得FPL 2023最佳论文奖

在2023年的FPGA领域顶级会议FPL (International Conference on Field Programmable Logic and Applications) 上&#xff0c;由中科驭数团队、中国科学院计算技术研究所处理器芯片全国重点实验室团队共同完成的论文《Co-ViSu: a Video Super-Resolution Accelerator Exploiting…

高教杯数学建模竞赛A题文章写作要点与示范

数学建模竞赛写作最重要的一点 LaTeX 很重要 非常重要 非常重要一定要规范 美观 写作注意事项 标准的附录详实的支撑材料和清晰的支撑材料说明 文章中所有的图片都应该包含在支撑材料中正确得引用参考文献模型的评价部分应当包含 模型优点模型缺点改进方案图像绘制应当标准假设…

通过uni.chooseImage返回的临时路径转为base64

uniapp官方API文档&#xff1a;https://uniapp.dcloud.net.cn/api/media/image.html#chooseimage 代码在后面 chooseimage的succes函数中的res.tempFilePaths&#xff0c;是图片的一个临时路径&#xff0c;没法直接传给后端接口使用&#xff0c;且接口需要的是base64格式的 ge…

使用dokcer部署分布式任务调度平台XXL-JOB

XXL-JOB是一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线&#xff0c;开箱即用。 部署docker略有需要看下面文档即可 ​​​​​​yum安装docker以及安装指定版本docker_yum安装指定版本dock…

迅为RK3588开发板修改编译工具路径

1 因为此章节以 rknn_yolov5_demo 在 RK3588 Linux 64 位平台上运行为例&#xff0c;所以修改 examples/rknn_yolov5_demo/build-XXX.sh 的编译工具路径&#xff0c;如下图所示&#xff1a; 2 修改 build-linux_RK3588.sh 文件&#xff0c;将 TOOL_CHAIN 修改为 gcc-arm-10.3…

set和map通过一颗红黑树进行封装

T是什么我不知道&#xff0c;但是我知道set 那么T一定得是key &#xff0c; map一定得是pair的数据类型 得用一颗模板是红黑树&#xff0c;实例化出map和set ---------------------------------------------------------------------------------------------------------…

如何与QVC 建立EDI连接?

QVC&#xff0c;全称为Quality, Value, Convenience&#xff08;品质、价值、便利&#xff09;&#xff0c;成立于1986年&#xff0c;是一家全球领先的零售电视和在线零售商。作为一家多渠道零售商&#xff0c;QVC致力于为客户提供高品质、独特的商品&#xff0c;通过电视、互联…

山石网科国产化防火墙,打造全方位边界安全解决方案

互联网的快速发展促进了各行各业的信息化建设&#xff0c;但也随之带来了诸多网络安全风险。大部分组织机构采用统一互联网接入方案&#xff0c;互联网出口承担着内部用户访问互联网的统一出口和对外信息服务的入口&#xff0c;因此在该区域部署相匹配的安全防护手段必不可少。…

Spring WebFlux使用未加前缀的双通配符模式绕过安全性CVE-2023-34034

文章目录 0.前言漏洞漏洞介绍描述 1.参考文档2.基础介绍3.解决方案3.1. 升级版本 4.漏洞修复源码分析5. 漏洞利用示例 0.前言 背景&#xff1a;公司项目扫描到 WebFlux中使用"**"作为模式会导致Spring Security和Spring WebFlux之间 CVE-2023-34034漏洞 漏洞 高 | 2…

junit.Test误踩坑,识别不到@Test注解,无法运行测试方法

问题的出现源自于下面的一段代码&#xff1a; 在这一段代码中&#xff0c;只看到可以运行的main方法&#xff0c;无法看到test方法可以运行的标志。 只能运行main()方法。 开始排查&#xff0c;对junit包的导入进行检查&#xff0c;发现是没有问题的。 怀疑是否是IntelliJ IDE…

lazada跨境电商商品数据采集

Lazada跨境电商商品数据采集可以使用以下两种方法&#xff1a; 手动采集&#xff1a;可以在Lazada网站上手动搜索商品信息&#xff0c;然后复制粘贴到Excel表格中。这种方法比较麻烦&#xff0c;需要逐个搜索和记录商品信息&#xff0c;适合采集数量较少的商品数据。使用采集软…

无涯教程-JavaScript - PI函数

描述 PI函数返回数字3.14159265358979,数学常数pi,精确到15位数字。 语法 PI ()争论 PI函数语法没有参数。 适用性 Excel 2007,Excel 2010,Excel 2013,Excel 2016 Example JavaScript 中的 PI函数 - 无涯教程网无涯教程网提供描述PI函数返回数字3.14159265358979,数学常…

基于Android+OpenCV+CNN+Keras的智能手语数字实时翻译——深度学习算法应用(含Python、ipynb工程源码)+数据集(二)

目录 前言总体设计系统整体结构图系统流程图 运行环境模块实现1. 数据预处理2. 数据增强3. 模型构建1&#xff09;定义模型结构2&#xff09;优化损失函数 相关其它博客工程源代码下载其它资料下载 前言 本项目依赖于Keras深度学习模型&#xff0c;旨在对手语进行分类和实时识…