Redis(161)如何使用Redis实现分布式锁?

作者:Victor356日期:2025/12/3

分布式锁是用来在分布式系统下控制对资源的独占访问,确保多个进程或线程不会同时操作同一资源。Redis 是实现分布式锁的常用工具之一。下面是详细的实现步骤和代码示例:

1. Redis 分布式锁的基本实现

通过设置一个唯一的键来实现锁,当操作完成后删除该键即可释放锁。

1.1 获取锁

使用 SET 命令并设置过期时间。NX 参数表示只有在键不存在时才能设置成功,EX 参数用于设置键的过期时间。

1SET lock_key unique_value NX EX 10
2

1.2 释放锁

只有持有锁的客户端才能删除锁。为了确保这一点,需要在释放锁时进行唯一值验证。

1# Lua脚本原子性地检查唯一值并删除锁
2if redis.call("GET", KEYS[1]) == ARGV[1] then
3    return redis.call("DEL", KEYS[1])
4else
5    return 0
6end
7

2. Java 实现 Redis 分布式锁

2.1 引入依赖

在 Maven 项目中引入 Jedis 依赖:

1<dependency>
2    <groupId>redis.clients</groupId>
3    <artifactId>jedis</artifactId>
4    <version>3.5.2</version>
5</dependency>
6

2.2 获取锁的方法

1import redis.clients.jedis.Jedis;
2import redis.clients.jedis.params.SetParams;
3
4public class RedisDistributedLock {
5    private Jedis jedis;
6    private String lockKey;
7    private String lockValue;
8    private int expireTime;
9
10    public RedisDistributedLock(Jedis jedis, String lockKey, String lockValue, int expireTime) {
11        this.jedis = jedis;
12        this.lockKey = lockKey;
13        this.lockValue = lockValue;
14        this.expireTime = expireTime;
15    }
16
17    public boolean acquireLock() {
18        SetParams setParams = new SetParams();
19        setParams.nx().ex(expireTime);
20        // 尝试获取锁
21        String result = jedis.set(lockKey, lockValue, setParams);
22        return "OK".equals(result);
23    }
24
25    public boolean releaseLock() {
26        // 释放锁的 Lua 脚本
27        String luaScript =
28            "if redis.call('GET', KEYS[1]) == ARGV[1] then " +
29            "return redis.call('DEL', KEYS[1]) " +
30            "else " +
31            "return 0 " +
32            "end";
33        Object result = jedis.eval(luaScript, 1, lockKey, lockValue);
34        return "1".equals(result.toString());
35    }
36
37    public static void main(String[] args) {
38        // 连接到本地 Redis 服务
39        Jedis jedis = new Jedis("localhost");
40
41        String lockKey = "distributed_lock";
42        String lockValue = "unique_value";
43        int expireTime = 10; // 锁的过期时间,单位为秒
44
45        RedisDistributedLock lock = new RedisDistributedLock(jedis, lockKey, lockValue, expireTime);
46
47        // 获取锁
48        if (lock.acquireLock()) {
49            try {
50                // 执行你的逻辑
51                System.out.println("Lock acquired!");
52
53                // 模拟业务处理时间
54                Thread.sleep(5000);
55            } catch (InterruptedException e) {
56                e.printStackTrace();
57            } finally {
58                // 释放锁
59                if (lock.releaseLock()) {
60                    System.out.println("Lock released!");
61                } else {
62                    System.out.println("Failed to release lock!");
63                }
64            }
65        } else {
66            System.out.println("Failed to acquire lock!");
67        }
68
69        jedis.close();
70    }
71}
72

3. Redisson 提供的分布式锁

Redisson 是一个开源的 Redis 客户端,提供了更高级的分布式锁实现,与 Java 的java.util.concurrent.locks.Lock接口兼容。

3.1 引入依赖

在 Maven 项目中引入 Redisson 依赖:

1<dependency>
2    <groupId>org.redisson</groupId>
3    <artifactId>redisson</artifactId>
4    <version>3.16.5</version>
5</dependency>
6

3.2 使用 Redisson 实现分布式锁

1import org.redisson.Redisson;
2import org.redisson.api.RLock;
3import org.redisson.api.RedissonClient;
4import org.redisson.config.Config;
5
6import java.util.concurrent.TimeUnit;
7
8public class RedissonDistributedLock {
9    public static void main(String[] args) {
10        // 创建 Redisson 配置
11        Config config = new Config();
12        config.useSingleServer().setAddress("redis://127.0.0.1:6379");
13
14        // 创建 Redisson 客户端
15        RedissonClient redissonClient = Redisson.create(config);
16
17        // 获取锁对象
18        RLock lock = redissonClient.getLock("distributed_lock");
19
20        try {
21            // 尝试获取锁,等待时间10秒,持有锁30秒
22            if (lock.tryLock(10, 30, TimeUnit.SECONDS)) {
23                try {
24                    // 执行你的逻辑
25                    System.out.println("Lock acquired!");
26
27                    // 模拟业务处理时间
28                    Thread.sleep(5000);
29                } finally {
30                    // 释放锁
31                    lock.unlock();
32                    System.out.println("Lock released!");
33                }
34            } else {
35                System.out.println("Failed to acquire lock!");
36            }
37        } catch (InterruptedException e) {
38            e.printStackTrace();
39        } finally {
40            redissonClient.shutdown();
41        }
42    }
43}
44

总结

通过配置 Redis 和编写合适的代码,可以实现可靠的分布式锁。上述示例展示了如何使用 Jedis 和 Redisson 来实现分布式锁。使用 Jedis 提供了更灵活的低级实现,而 Redisson 提供了更高级别的 API,使得分布式锁的使用更加简单和直观。选择合适的工具和方法取决于具体的应用场景和需求。


Redis(161)如何使用Redis实现分布式锁?》 是转载文章,点击查看原文


相关推荐


单片机手搓掌上游戏机(十五)—pico运行fc模拟器之编译环境
Bona Sun2025/11/30

pico是arm内核的单片机,基本的还是gcc、make那些东西,另外有自己的pico-sdk和必须使用cmake生成makefile,当然也可以用msbuild或ninja代替make 流程无非是按照pico-sdk的说明把需要的工具链下载,然后设置环境变量,用vs code之类的ide编辑修改。链接: https://github.com/raspberrypi/pico-sdk 还是需要fastgithub之类的加速器,不然无法下载。 如果只是在windows下使用,还有一种更省事


大学生HTML期末大作业——HTML+CSS+JavaScript名侦探柯南
无·糖2025/11/27

HTML+CSS+JS【动漫网站】网页设计期末课程大作业 web前端开发技术 web课程设计 网页规划与设计 💥 文章目录一、🏁 网站题目二、🚩 网站描述三、🎌 网站介绍四、🏴 网站效果五、🏳️ 网站代码六、🏳️‍🌈 如何学习进步七、🏴‍☠️ 更多干货 💥 文章目录 一、🏁 网站题目 💪💪💪 动漫网站 名侦探柯南 5页 含网页设计报告 二、🚩 网站描述 🏅 总结了一些学生网页制作的经验:一般的网页需要融入以下知识点:div+css布局、浮动、


UI小姐姐要求有“Duang~Duang”的效果怎么办?
前端九哥2025/11/25

设计小姐姐: “搞一下这样的回弹效果,你行不行?” 我:“行!直接梭哈 50 行 keyframes + transform + 各种百分比,搞定 ” 设计小姐姐:“太硬(撇嘴),不够 Q 弹(鄙视)” 我:(裂开) 隔壁老王:这么简单你都不行,我来一行贝塞尔 cubic-bezier(0.3, 1.15, 0.33, 1.57) 秒了😎 设计小姐姐:哇哦!(兴奋)好帅!(星星眼🌟)好Q弹!(一脸崇拜😍) 我:“???” 🧠 一、为什么一行贝塞尔就能“Duang”起来? 1️⃣ c


精选 5 款 .NET 开源、实用的商城系统(Shop),快速商城二开利器!
追逐时光者2025/11/23

前言 今天大姚给大家分享 5 款基于 .NET 开源、实用的商城系统(Shop),快速商城二开利器!希望可以帮助到有商城系统开发需求的同学。 nopCommerce nopCommerce是一个.NET开源功能丰富、免费、灵活且可定制的开源电子商务解决方案(大家假如有商城需求可以直接使用该项目进行二次开发,省时省力) ,具备商城该有的各种功能和特性。 项目源码地址:github.com/nopSolution… 项目详细介绍:mp.weixin.qq.com/s/GMCIYwGUr… C


Python中的简单爬虫
q***57742025/11/21

文章目录 一. 基于FastAPI之Web站点开发 1. 基于FastAPI搭建Web服务器2. Web服务器和浏览器的通讯流程3. 浏览器访问Web服务器的通讯流程4. 加载图片资源代码 二. 基于Web请求的FastAPI通用配置 1. 目前Web服务器存在问题2. 基于Web请求的FastAPI通用配置 三. Python爬虫介绍 1. 什么是爬虫2. 爬虫的基本步骤3. 安装requests模块4. 爬取照片 ① 查看index.html② 爬取照片步骤③


Fastadmin切换英文,部分新增菜单没有切换原因
JSON_L2025/11/19

在使用Fastadmin开启多语言后,切换为英文时,部分新增菜单没有切换问题及解决。 目录 开启多语言 开启多语言 部分菜单没有变化 原因 添加菜单规则 语言包解析 其他标题或提示语解析 总结   开启多语言 开启多语言 首先介绍一下fastadmin中如何开启多语言配置, 在application/config.php中把lang_switch_on改为true。 默认情况下是关闭的,如下: 开启后,在后台会多一个切换语言的入口,默认就是中英


GitHub 热榜项目 - 日榜(2025-11-16)
CoderJia_2025/11/19

GitHub 热榜项目 - 日榜(2025-11-16) 生成于:2025-11-16 统计摘要 共发现热门项目: 18 个 榜单类型:日榜 本期热点趋势总结 本期GitHub热榜显示AI应用开发依然是绝对焦点,开发者正致力于将前沿AI技术转化为开箱即用的解决方案。舆情监控工具TrendRadar和谷歌的AI工具包adk-go引领了这股潮流,它们强调用AI解决信息过载和复杂流程自动化等实际问题。同时,轻量化RAG框架LightRAG和大模型记忆引擎Memori的流行,反映出社区


【深度学习新浪潮】算法工程师如何入门芯片硬软件设计工作?
Andrew-国星宇航2025/11/17

在AI与边缘计算爆发的当下,“算法落地难”逐渐成为行业痛点——很多时候不是算法不够优,而是缺乏匹配算法需求的芯片硬件支撑,或是算法与硬件“脱节”导致部署后性能打折扣。这也让越来越多算法工程师开始关注芯片硬软件设计:既能更深刻地理解算法的硬件适配性,又能参与到“算法-芯片”协同优化的核心环节,成为跨领域的复合型人才。 但算法工程师转型芯片设计,常面临“软件思维 vs 硬件思维”的鸿沟:习惯了软件的灵活性,却对硬件的并行性、时序约束、资源限制感到陌生;熟悉模型训练与推理优化,却不懂EDA工具、数字


python爬虫入门案例day05:Pexels
自学互联网2025/11/16

python爬虫入门案例day05:Pexels 目标网站 Pexels 目标网址 https://www.pexels.com/zh-cn/search/%E6%97%A5%E8%90%BD/ 开发环境 1、window11 2、python3.7 3、PyCharm Community Edition 2021.2.1 4、双核浏览器 5、浏览器自带开发者工具 网站分析 在下拉网页的过程中发现,会不断加载出新的图片,说明该网页为动态网页,那我们可以初步猜想图片的链接存放在通过Ajax请求的网


Python 的内置函数 map
IMPYLH2025/11/15

Python 内建函数列表 > Python 的内置函数 map Python 的内置函数 map() 是一个高阶函数,它允许对一个可迭代对象(如列表、元组等)的所有元素应用指定的函数,并返回一个 map 对象(可迭代对象)。其基本语法是: map(function, iterable, ...) 主要特点: 惰性计算(Lazy Evaluation):map 对象不会立即执行计算,只有在需要时才会真正处理数据多参数支持:可以同时处理多个可迭代对象函数式编程特性:配合 lambda 表

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2025 聚合阅读