Redis(72)Redis分布式锁的常见使用场景有哪些?

作者:Victor356日期:2025/10/20

Redis分布式锁在很多需要协调多个分布式系统或组件的场景中都能发挥重要作用。以下是一些常见的使用场景以及相应的代码示例:

常见使用场景

  1. 防止资源竞争
    • 多个进程或线程需要访问同一共享资源时,使用分布式锁可以防止资源竞争,确保同一时间只有一个进程或线程在操作该资源。
  2. 定时任务调度
    • 在分布式系统中,确保某个定时任务在同一时刻只被一个调度器执行,避免重复执行任务。
  3. 库存扣减
    • 电商系统中,多个用户同时下单时,需要确保库存扣减操作的原子性和一致性。
  4. 分布式事务
    • 在跨多个服务的分布式事务中,使用分布式锁可以协调各服务的操作,确保事务的一致性。
  5. ID生成器
    • 分布式系统中生成全局唯一ID时,使用分布式锁可以确保ID的唯一性和有序性。

场景示例和相应代码

1. 防止资源竞争

假设有多个进程同时写入一个文件,我们需要确保同一时间只有一个进程在写入。

1import redis.clients.jedis.Jedis;
2import redis.clients.jedis.params.SetParams;
3
4public class FileWriteWithDistributedLock {
5    private Jedis jedis;
6    private String lockKey;
7    private String lockValue;
8    private int expireTime;
9
10    public FileWriteWithDistributedLock(Jedis jedis, String lockKey, int expireTime) {
11        this.jedis = jedis;
12        this.lockKey = lockKey;
13        this.expireTime = expireTime;
14        this.lockValue = String.valueOf(Thread.currentThread().getId());
15    }
16
17    public boolean acquireLock() {
18        SetParams params = new SetParams().nx().px(expireTime);
19        String result = jedis.set(lockKey, lockValue, params);
20        return "OK".equals(result);
21    }
22
23    public boolean releaseLock() {
24        String luaScript = "if redis.call('get', KEYS[1]) == ARGV[1] then " +
25                           "return redis.call('del', KEYS[1]) else return 0 end";
26        Object result = jedis.eval(luaScript, 1, lockKey, lockValue);
27        return result.equals(1L);
28    }
29
30    public void writeToFile(String content) {
31        if (acquireLock()) {
32            try {
33                // 模拟文件写操作
34                System.out.println("Writing to file: " + content);
35            } finally {
36                boolean released = releaseLock();
37                if (released) {
38                    System.out.println("Lock released after writing.");
39                } else {
40                    System.out.println("Failed to release lock.");
41                }
42            }
43        } else {
44            System.out.println("Failed to acquire lock, try again later.");
45        }
46    }
47
48    public static void main(String[] args) {
49        Jedis jedis = new Jedis("localhost", 6379);
50        FileWriteWithDistributedLock fileLock = new FileWriteWithDistributedLock(jedis, "file_write_lock", 10000);
51        fileLock.writeToFile("Hello, World!");
52        jedis.close();
53    }
54}
55

2. 定时任务调度

确保定时任务在分布式系统中同一时刻只被一个节点执行。

1import redis.clients.jedis.Jedis;
2import redis.clients.jedis.params.SetParams;
3
4public class ScheduledTaskWithDistributedLock {
5    private Jedis jedis;
6    private String lockKey;
7    private String lockValue;
8    private int expireTime;
9
10    public ScheduledTaskWithDistributedLock(Jedis jedis, String lockKey, int expireTime) {
11        this.jedis = jedis;
12        this.lockKey = lockKey;
13        this.expireTime = expireTime;
14        this.lockValue = String.valueOf(Thread.currentThread().getId());
15    }
16
17    public boolean acquireLock() {
18        SetParams params = new SetParams().nx().px(expireTime);
19        String result = jedis.set(lockKey, lockValue, params);
20        return "OK".equals(result);
21    }
22
23    public boolean releaseLock() {
24        String luaScript = "if redis.call('get', KEYS[1]) == ARGV[1] then " +
25                           "return redis.call('del', KEYS[1]) else return 0 end";
26        Object result = jedis.eval(luaScript, 1, lockKey, lockValue);
27        return result.equals(1L);
28    }
29
30    public void executeScheduledTask() {
31        if (acquireLock()) {
32            try {
33                // 执行定时任务
34                System.out.println("Executing scheduled task.");
35            } finally {
36                boolean released = releaseLock();
37                if (released) {
38                    System.out.println("Lock released after executing task.");
39                } else {
40                    System.out.println("Failed to release lock.");
41                }
42            }
43        } else {
44            System.out.println("Failed to acquire lock, another instance might be executing the task.");
45        }
46    }
47
48    public static void main(String[] args) {
49        Jedis jedis = new Jedis("localhost", 6379);
50        ScheduledTaskWithDistributedLock taskLock = new ScheduledTaskWithDistributedLock(jedis, "scheduled_task_lock", 10000);
51        taskLock.executeScheduledTask();
52        jedis.close();
53    }
54}
55

3. 库存扣减

在电商系统中,同时对同一个商品下单时需要确保库存扣减操作的原子性。

1import redis.clients.jedis.Jedis;
2import redis.clients.jedis.params.SetParams;
3
4public class InventoryReductionWithDistributedLock {
5    private Jedis jedis;
6    private String lockKey;
7    private String lockValue;
8    private int expireTime;
9
10    public InventoryReductionWithDistributedLock(Jedis jedis, String lockKey, int expireTime) {
11        this.jedis = jedis;
12        this.lockKey = lockKey;
13        this.expireTime = expireTime;
14        this.lockValue = String.valueOf(Thread.currentThread().getId());
15    }
16
17    public boolean acquireLock() {
18        SetParams params = new SetParams().nx().px(expireTime);
19        String result = jedis.set(lockKey, lockValue, params);
20        return "OK".equals(result);
21    }
22
23    public boolean releaseLock() {
24        String luaScript = "if redis.call('get', KEYS[1]) == ARGV[1] then " +
25                           "return redis.call('del', KEYS[1]) else return 0 end";
26        Object result = jedis.eval(luaScript, 1, lockKey, lockValue);
27        return result.equals(1L);
28    }
29
30    public void reduceInventory(String itemId, int quantity) {
31        if (acquireLock()) {
32            try {
33                // 模拟库存扣减操作
34                System.out.println("Reducing inventory for item: " + itemId + " by " + quantity);
35            } finally {
36                boolean released = releaseLock();
37                if (released) {
38                    System.out.println("Lock released after reducing inventory.");
39                } else {
40                    System.out.println("Failed to release lock.");
41                }
42            }
43        } else {
44            System.out.println("Failed to acquire lock, try again later.");
45        }
46    }
47
48    public static void main(String[] args) {
49        Jedis jedis = new Jedis("localhost", 6379);
50        InventoryReductionWithDistributedLock inventoryLock = new InventoryReductionWithDistributedLock(jedis, "inventory_lock", 10000);
51        inventoryLock.reduceInventory("item123", 1);
52        jedis.close();
53    }
54}
55

4. 分布式事务

在跨多个服务的分布式事务中,通过分布式锁来协调操作,确保事务的一致性。

1import redis.clients.jedis.Jedis;
2import redis.clients.jedis.params.SetParams;
3
4public class DistributedTransactionWithLock {
5    private Jedis jedis;
6    private String lockKey;
7    private String lockValue;
8    private int expireTime;
9
10    public DistributedTransactionWithLock(Jedis jedis, String lockKey, int expireTime) {
11        this.jedis = jedis;
12        this.lockKey = lockKey;
13        this.expireTime = expireTime;
14        this.lockValue = String.valueOf(Thread.currentThread().getId());
15    }
16
17    public boolean acquireLock() {
18        SetParams params = new SetParams().nx().px(expireTime);
19        String result = jedis.set(lockKey, lockValue, params);
20        return "OK".equals(result);
21    }
22
23    public boolean releaseLock() {
24        String luaScript = "if redis.call('get', KEYS[1]) == ARGV[1] then " +
25                           "return redis.call('del', KEYS[1]) else return 0 end";
26        Object result = jedis.eval(luaScript, 1, lockKey, lockValue);
27        return result.equals(1L);
28    }
29
30    public void executeDistributedTransaction() {
31        if (acquireLock()) {
32            try {
33                // 执行分布式事务的协调操作
34                System.out.println("Executing distributed transaction.");
35            } finally {
36                boolean released = releaseLock();
37                if (released) {
38                    System.out.println("Lock released after executing transaction.");
39                } else {
40                    System.out.println("Failed to release lock.");
41                }
42            }
43        } else {
44            System.out.println("Failed to acquire lock, try again later.");
45        }
46    }
47
48

Redis(72)Redis分布式锁的常见使用场景有哪些?》 是转载文章,点击查看原文


相关推荐


Java中Elasticsearch完全指南:从零基础到实战应用
xxxxxxllllllshi2025/10/19

Java中Elasticsearch完全指南:从零基础到实战应用 环境准备与基础概念 Elasticsearch 与关系型数据库核心概念对比 对于零基础读者,理解 Elasticsearch 的核心概念最直观的方式是与熟悉的关系型数据库进行类比。以下对比表清晰展示了两者核心组件的对应关系: Elasticsearch 概念关系型数据库概念说明索引(Index)数据库(Database)存储相关文档的集合,相当于关系型数据库中的数据库文档(Document)行(Row)索引中的一条数据记录


PCIe协议之 flit 模式 之 速率 vs flit/non-flit vs 编码方式对比汇总
那么菜2025/10/17

一、归纳对比汇总表 特性维度 PCIe 1.0-5.0 (非 FLIT 模式) PCIe 6.0 (FLIT 模式) 适用速率 2.5 GT/s (Gen1), 5.0 GT/s (Gen2), 8.0 GT/s (Gen3), 16.0 GT/s (Gen4), 32.0 GT/s (Gen5) 64.0 GT/s (Gen6) 数据包模式 非 FLIT 模式、FLIT


【ComfyUI】视频替换背景
Mr数据杨2025/10/16

今天给大家演示一个强大的 ComfyUI 视频替换背景工作流。本工作流可实现将原始视频中的人物与背景分离,并替换为任意指定图像或场景,同时保持视频流畅性与人物动作自然过渡。通过多个模型协作与节点连接,最终产出清晰、风格统一的个性化视频,适合用作AI视频创作、短视频特效、虚拟场景合成等应用。 文章目录 工作流介绍核心模型Node节点 工作流程应用场景开发与应用 工作流介绍 本工作流以视频中的人物主体为核心,通过分割、编码、采样、增强等多步骤实现高质量的背景替换。它集成了 文本


为博客添加 RSS 订阅
mCell2025/10/15

同步至个人站点:为博客添加 RSS 订阅 为博客添加 RSS 订阅 我时常关注一些博客、技术论坛或者公众号,但是每次阅读都很麻烦:因为我需要在不同网站或者平台间来回切换,甚至有些平台插入了不少的广告。 为了更高效地聚合我所关注的博客和新闻源,我最近开始使用一个名为 Folo 的信息聚合应用。在探索 Folo 的过程中,我认识了 RSS——一种经典但依旧强大的信息同步协议。 这让我萌生了一个想法:我的个人博客 CellStack 是使用 VitePress 构建的,能不能也成为一个 RSS


webSocket快速入门
一只游鱼2025/10/13

webSocket快速入门  一、WebSocket 是什么? WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。 简单说,它能让客户端(浏览器)和服务器之间实时双向通信。 对比传统 HTTP 特性 HTTP WebSocket 连接方式 请求-响应 持久连接 通信方向 客户端 → 服务端 双向 实时性 差,需要轮询


推荐 12 款开源美观、简单易用的 WPF UI 控件库,让 WPF 应用界面焕然一新!
追逐时光者2025/10/12

前言 今天大姚给大家分享 12 款开源美观、简单易用、主题控件齐全的 WPF UI 控件库,帮助大家轻松打造现代化 WPF 桌面应用,提升开发效率与视觉体验! WPF 介绍 WPF 是一个强大的桌面应用程序框架,用于构建具有丰富用户界面的 Windows 应用。它提供了灵活的布局、数据绑定、样式和模板、动画效果等功能,让开发者可以创建出吸引人且交互性强的应用程序。 HandyControl HandyControl是一套WPF控件库,它几乎重写了所有原生样式,同时包含80余款自定义控件。使用Ha


微硕WSD2018DN22 N沟MOSFET,汽车副驾桌板LED照明负载开关
MOS管-冠华伟业2025/10/10

随着“办公座舱”概念升温,副驾折叠桌板需集成5V/9V USB、LED照明、触控按键等模块,空间被压缩至“毫米级”,却必须满足“零继电器噪音+零待机功耗+1mm高度”三重要求。微硕WINSOK推出DFN2×2-6S N沟MOSFET WSD2018DN22,凭10mΩ低导通电阻与12A峰值电流,为12V平台桌板LED照明提供“芯片级”静音负载开关方案,一键实现“无感”点亮与μA级待机。 一、市场趋势催生器件需求 2025年中国副驾桌板渗透率预计达28%,单车灯节点由1路增至4路,核心痛点:


程序员副业 | 2025年9月复盘
嘟嘟MD2025/10/9

本文首发于公众号:嘟爷创业日记 。 我已经坚持日更600天+,欢迎过来追剧~ 大家好,我是嘟嘟MD,一个10年程序员,现在离职创业,有700天了,我每个月都会写一篇总结复盘,让大家可以近距离看看一个离职程序员都在干什么,今天这篇是九月份的总结,大概2000字,略长,有空的可以翻翻,希望对大家有一丢丢的借鉴作用! 一、月度大事 大家好,九月结束了,忙碌的一个月又结束了,这个月有些事情变化挺大,需要做出取舍。 1:公众号运营+B站视频运营 公众号和B站视频运营还是我的最高优先级,算是我的主业


【Ubuntu 20.04升级python3.9后终端打不开的bug】
woshihonghonga2025/10/7

3. 把Python3.9改为Python3首选项     sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.9 1     sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 2     sudo update-alternatives --config python3     


HBase的自动负载均衡,提升大数据存储性能
AI量化价值投资入门到精通2025/10/6

HBase自动负载均衡:让大数据存储像排队买奶茶一样高效 关键词 HBase、自动负载均衡、Region分布、大数据存储、性能优化、RegionServer、Master 摘要 在大数据存储领域,HBase凭借高可靠性、强一致性和可线性扩展的特性,成为电商订单、用户行为日志、物联网传感器数据等场景的首选。但随着数据量爆炸式增长,一个隐形的“性能杀手”会逐渐浮现——Region分布不均:有的RegionServer(数据节点)扛着100个Region(数据分片)忙得“喘不过气”,有的却只拿

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0