原生redis实现分布式锁

redis实现分布式锁(java/jedis) redis实现分布式锁(java/jedis),其中包含工具方法以及使用demo 本资源是利用java的jedis实现 redis实现分布式锁(java/jedis),其中包含工具方法以及使用demo 本资源是利用java的jedis实现 立即下载

用 原生 Redis(Jedis、Lettuce) 实现分布式锁,可以参考 Redisson 的原理,但需要自己处理锁的自动续期、故障恢复等细节。核心思路是使用 Redis 的 SET NX EX 或 SET PX NX 命令来实现互斥锁,并利用 Lua 脚本 保障原子性。

实现思路

  • 获取锁
    • SET key value NX PX expiration,确保锁只能被一个线程获取,并设置过期时间。
  • 自动续期
    • 通过 后台线程 定时续期,防止业务执行时间过长导致锁超时释放。
  • 释放锁
    • 通过 Lua 脚本 保证原子性,只有 当前线程 持有锁时才能释放。

完整代码

1. 依赖引入

使用 Jedis 作为 Redis 客户端:

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>4.3.1</version>
</dependency>

2. 分布式锁实现

获取锁
import redis.clients.jedis.Jedis;
import java.util.UUID;

public class RedisLock {
    private static final String LOCK_SUCCESS = "OK";
    private static final String LOCK_KEY = "my_lock";
    private static final int EXPIRE_TIME = 10_000; // 10秒过期

    private final Jedis jedis;
    private final String lockValue; // 唯一标识锁的持有者

    public RedisLock(Jedis jedis) {
        this.jedis = jedis;
        this.lockValue = UUID.randomUUID().toString(); // 防止误删
    }

    public boolean tryLock() {
        String result = jedis.set(LOCK_KEY, lockValue, "NX", "PX", EXPIRE_TIME);
        return LOCK_SUCCESS.equals(result); // 返回 true 代表加锁成功
    }
}
自动续期

如果业务执行时间超过 10s,锁会自动释放,所以需要定时续期:

import java.util.concurrent.*;

public class LockRenewal {
    private static final int RENEWAL_INTERVAL = 5000; // 每5秒续期
    private final Jedis jedis;
    private final String lockValue;
    private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

    public LockRenewal(Jedis jedis, String lockValue) {
        this.jedis = jedis;
        this.lockValue = lockValue;
    }

    public void startRenewal() {
        scheduler.scheduleAtFixedRate(() -> {
            if (lockValue.equals(jedis.get("my_lock"))) {
                jedis.pexpire("my_lock", 10_000);
            }
        }, 0, RENEWAL_INTERVAL, TimeUnit.MILLISECONDS);
    }

    public void stopRenewal() {
        scheduler.shutdown();
    }
}
释放锁

使用 Lua 脚本,确保只有 持有锁的线程 才能删除:

public void unlock() {
    String luaScript =
        "if redis.call('get', KEYS[1]) == ARGV[1] then " +
        "   return redis.call('del', KEYS[1]) " +
        "else " +
        "   return 0 " +
        "end";

    jedis.eval(luaScript, 1, "my_lock", lockValue);
}

3. 使用示例

Jedis jedis = new Jedis("localhost", 6379);
RedisLock redisLock = new RedisLock(jedis);
LockRenewal renewal = new LockRenewal(jedis, redisLock.lockValue);

if (redisLock.tryLock()) {
    renewal.startRenewal(); // 开启自动续期
    try {
        // 执行业务逻辑
        System.out.println("获取到锁,执行业务...");
        Thread.sleep(15000); // 模拟业务执行时间超过锁的原始超时时间
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        redisLock.unlock();
        renewal.stopRenewal(); // 停止续期
    }
} else {
    System.out.println("获取锁失败");
}

总结

  1. 互斥性:SET NX PX 确保只有一个线程能获取锁。
  2. 自动续期:定期 PEXPIRE 延长锁的存活时间。
  3. 安全释放:Lua 脚本保证只有锁的持有者才能删除。
Untiy之如何实现AI+MR (Pico4u 相机推流MR画面给Server做实时AI图像识别) 本文介绍了基于Pico4U企业版开发AI+MR应用的实现方案。文章详细说明了硬件准备步骤,包括购买企业版设备、申请相机权限和注册管理平台。重点讲解了Unity开发中获取摄像头画面的两种技术方案:通过Overlay直接渲染到Android Surface,或使用API获取图像数据转换为Texture。提供了完整的代码示例和权限配置说明,并揭示了底层通过JNI调用Android原生API的技术原理。该方案适用于带电操作等实习场景,可提升安全性和学习趣味性。 阅读详情

相关推荐

Android中的Service:Binder,Messenger,AIDL(2)

前言前面一篇博文介绍了关于Service的一些基本知识,包括service是什么,怎么创建一个service,创建了一个service之后如何启动它等等。在这一篇博文里有一些需要前一篇铺垫的东西,建议没有看过前一篇博文的同学先去看一下前一篇: Android中的Service:默默的奉献者 (1) 。但是在前一篇博文中也有一些遗漏的东西——主要是关于bindService()这一块的具体细节。由于这

lypeer的专栏 5万+

基于Jedis实现Redis分布式锁

在很多互联网产品应用中,有些场景需要加锁处理,比如:秒杀,全局递增ID,楼层生成等等。大部分的解决方案是基于DB实现的,Redis为单进程单线程模式,采用队列模式将并发访问变成串行访问,且多客户端对Redis的连接并不存在竞争关系。其次Redis提供一些命令SETNX,GETSET,可以方便实现分布式锁机制。

huangjhai的博客 5833

基于STM32与MPU6050的实时姿态检测系统设计与实现(源码+硬件解析)

本文详细介绍了基于STM32单片机与MPU6050传感器的实时姿态检测系统设计与实现。通过硬件解析、传感器校准、卡尔曼滤波算法和欧拉角计算,实现高精度姿态检测。提供完整源码和调试技巧,适用于无人机、平衡车等嵌入式开发项目,解决噪声干扰和数据漂移等常见问题。

jupi8的博客 494

Redis 分布式锁详解(七种实现方式)

Redis 分布式锁七种实现方式

new_baibai的博客 1万+

[AbutionGraph] 报表制作-使用Grafana动态可视化知识图谱指标

使用开源报表可视化工具Grafana实时监控时序知识图谱数据仓库AbutionGraph中的数据,实时性报表查询, 满足单次百万千万级的数据查询,毫秒级查询延迟,亚秒级对千亿数据量汇总统计,每日过亿报表查询/多维分析/日志分析等数据指标...

图特摩斯科技-博客 4278

kubedns-coredns部署pod出现not ready问题

文章目录遇到的问题1、发现问题2、排查问题3、解决方法 coredns的实例health_check不通过的问题,排查和解决方法 遇到的问题 1、发现问题 pod启动但是未ready 查看是readiness失败 使用对应的URL进行curl,发现真的返回503 2、排查问题 查看错误日志,发现一堆这个错误"waiting on : kubernetes" 网上相关的问题解答 这个跟测试场景不一样,这个案例是开了防火墙,可以确认我这个案例的机器没有开防火墙,但它提醒了一点,coredns是需要访问ap

u012533481的博客 2844

七种方案!探讨Redis分布式锁的正确使用姿势

前言 日常开发中,秒杀下单、抢红包等等业务场景,都需要用到分布式锁。而Redis非常适合作为分布式锁使用。本文将分七个方案展开,跟大家探讨Redis分布式锁的正确使用方式。如果有不正确的地方,欢迎大家指出哈,一起学习一起进步。 公众号:捡田螺的小男孩 什么是分布式锁 方案一:SETNX + EXPIRE 方案二:SETNX + value值是(系统时间+过期时间) 方案三:使用Lua脚本(包含SETNX + EXPIRE两条指令) 方案四:SET的扩展命令(

SUNXIOAJIE的博客 1075

基于NXP BFU730F的宽带WiFi LNA设计:从原理到实测的完整指南

低噪声放大器(LNA)是无线通信接收链路中的关键器件,其性能直接决定了系统的接收灵敏度。LNA的核心原理是在放大微弱信号的同时,尽可能降低自身引入的噪声,并保持良好的线性度以应对强干扰。在宽带应用场景下,如覆盖2.4GHz至5.9GHz的现代WiFi系统,设计需在宽带匹配、噪声优化和增益平坦度之间取得精妙平衡。本文以NXP的BFU730F SiGe:C HBT晶体管为核心,深入解析一种采用电阻反馈和LC匹配网络的经典宽带LNA架构。该设计通过优化反馈网络,在宽达3.5GHz的频带内实现了优异的噪声系数(低至

weixin_33587161的博客 327

jedis分布式锁实现

利用setNX若存在则不插入,不存在则插入成功,同时value为时间戳,没拿到锁则判断时间是否过期,get拿到时间戳,过期则用,getset方式赋值,在比较时间戳是否过期,过期则拿到锁;

我的博客 581

信息系统项目管理师(高项)重点!

学习高项自己做的笔记

PanJWei的博客 3301

【AUTOSAR-COM】-5.2-“Deadline Monitoring超时监控”-2-基于IPdu实现

目录 1 在CFG中配置Deadline Monitoring超时监控 1.1 参数说明 1.2 生成代码差异 2 通过一段测试代码看Deadline Monitoring超时监控 3 使用CAN盒观察Deadline Monitoring实际测试效果 3.1 Case 1:ECU开始工作时,没有收到Frame 3.2 Case 2:ECU工作中,接收的Frame丢失、 4 小结 5 结尾 关键字: DM=Deadline Monitoring超时监控 ComFirstTime...

「汽车电子助手」的博客 1788

Redis实现分布式锁

本文主要关于如何用Redis实现分布式锁

sunny123az的博客 2501

YOLOv13改进策略【特征提取层】| CVPR-2024 PKI Module 获取多尺度纹理特征,适应尺度变化大的目标

PKI Module是。

Limiiiing的博客 276

使用原生Redis命令实现分布式锁

对于多线程程序,避免同时操作一个共享变量而产生数据问题,我们通常会使用一把锁来互斥以保证共享变量的正确性,其使用范围是在同一个进程中,如果换做是多个进程,需要同时操作一个共享资源,如何互斥呢?如果指定的key存在,则直接返回0。原因在于客户端在拿到锁之后,在操作共享资源时,遇到的场景是很复杂的,既然是预估的时间,也只能是大致的计算,不可能覆盖所有导致耗时变长的场景。产生的值,之后在释放锁时,要先判断这把锁是否归自己持有,只有是自己的才能释放它。

qq_35989920的博客 478

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

分布式锁之Redis6+Lua脚本实现原生分布式锁

分布式锁之Redis6+Lua脚本实现原生分布式锁分布式锁之Redis6+Lua脚本实现原生分布式锁分布式核心技术—关于高并发下分布式锁分布式锁核心知识介绍背景避免共享资源并发操作导致数据问题分布式锁应该考虑的东西基于Redis实现分布式锁详述基于Redis实现分布式锁的几种坑实现分布式锁基于Redis实现分布式锁存在的问题分布式锁lua脚本+redis原生代码编写上文说了redis做分布式锁存在的问题代码实现 分布式锁之Redis6+Lua脚本实现原生分布式锁 分布式核心技术—关于高并发下分布式锁 分布式

ruan_luqingnian的博客 716

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Redis 第四篇 分布式锁原理+原生实现代码

Redis 第四篇 分布锁的实现及Lua脚本+原生代码实现 上一篇介绍了Redission,提到Redissiond在分布式锁上的运用,非常简单,便捷,但Redission本身是封装好的框架,这节探索一下Redis简单的底层分布式锁的实现(Redission的封装远复杂与这个,这里仅做底层的逻辑理解和分析) 需解决问题:保证同一时间只有一个客户端可以对共享资源进行操作 案例:优惠券领劵限制张数、商品库存超卖,这里以优惠券领取为案例 核心: 为了防止分布式系统中的多个进程之间相互干扰,需要一种分布式协调技术

m0_56164246的博客 1105

第6章:分布式锁之Redis+Lua脚本实现原生分布式锁

摘要:分布式锁是解决高并发场景下共享资源访问冲突的关键技术,如优惠券领取、库存防超卖等。其核心要求包括排他性、容错性、可重入性及高性能。Redis通过SETNX实现分布式锁,但存在原子性问题,需结合Lua脚本保证加锁/解锁操作的原子性。本文详细分析了Redis实现分布式锁的常见问题及解决方案,包括锁超时设置、误删除防护等,并提供了基于Spring Boot的完整代码示例,最后推荐使用Redis官方文档指导的分布式锁最佳实践。

guslegend的博客 366

Redis分布式锁深度解析:从原生实现到Redisson进阶

本文深入解析Redisson分布式锁的实现机制与优势,揭示其如何解决原生Redis锁的痛点问题。Redisson通过自动续命看门狗机制、可重入锁设计、集群环境适配等创新,提供了生产级分布式锁解决方案。文章详细拆解了Redisson的Lua脚本实现、数据结构选择、锁续期原理等核心细节,并介绍了公平锁、读写锁等高级特性。相比手动实现,Redisson显著提升了分布式锁的可靠性和易用性,是Java技术栈中的首选方案。

2301_80017072的博客 1508

分布式锁—Redis6+Lua脚本实现原生分布式锁

分布式锁——Redis6+Lua脚本实现原生分布式锁 1. 分布式核心技术——关于高并发下的分布式锁你知道多少? 在开发应用的过程中,如果需要对一个共享变量进行多线程同步访问的时候,我们可以使用学到的锁进行处理,比如在Java中我们可以使用Sychronized和lock的方式,保证同一时间只有一个客户端对共享资源进行操作。注意这是在单机应用下的,我们可以做到毫无破绽的完美运行。 但是当我们的业务发展,需要用到集群,每一个应用需要部署几台机器上然后坐负载均衡,大致如下图所示: [外链图片转存失败,源站可能有

mylordking的博客 346

Redis[3] 面试题:设计分布式锁+代码实现原生分布式锁

文章目录Redis[3] 面试题:设计分布式锁+代码实现原生分布式锁问题一 确保锁一定能释放问题二:业务超时,存在其他线程误删问题三 :判断锁是否为自己加的锁和 删除锁之间存在时间间隔问题四:如何避免业务执行时间过长,锁过期了实际运行效果截图 Redis[3] 面试题:设计分布式锁+代码实现原生分布式锁 分布式锁的用途就是保证同一时间只有一个客户端可以对共享资源进行操作 可以运用到优惠券领劵限制张数、商品库存超卖这些场景 为了防止分布式系统中的多个进程之间相互干扰,我们需要一种分布式协调技术来对这些进程进

尔等同学的博客 1125

原生PHP用 Redis ZSet 实现一个实时排行榜,用 Lua 脚本实现一个简单的分布式锁的庖丁解牛

数据结构:ZSet = Member (成员) + Score (分数)。底层实现跳表 (Skip List)字典 (Dict)。跳表:保证元素有序,插入/删除/查找复杂度为Olog⁡NO(\log N)OlogN。字典:保证 Member 唯一,查找复杂度O1O(1)O1。优势:无需每次查询都ORDER BY,Redis 内部永远维持有序状态,读取极快。KeyMemberuser_id(字符串)Scorescore(整数/浮点数)Lock KeyValue。

长风破浪会有时的博客 470

8-分布式锁之Redis6+Lua脚本实现原生分布式锁

这是我参与11月更文挑战的第9天,活动详情查看:2021最后一次更文挑战 本章是对分布式锁介绍,以及使用Redis实现分布式锁会遇到哪些坑,最后面将会手把手教你掌握分布式锁lua脚本与Redis的原生代码编写 什么是分布式锁 分布式锁可以理解为:控制分布式的系统有序性的对共享资源进行操作,通过互斥来保证数据的一致性。举个例子:假如系统共享的资源就是一间房子,房子里面有各式各样的书,分布式系统...

xdclass888的博客 83

Redis原生SET、SETNX、SETEX方法以及RedisTemplate的方法 + 分布式锁的实现

Redis原生GET/SET方法 SET()命令:有两个参数 set(key, value),将字符串值 value 关联到 key ,如果 key 已经持有其他值, SET 就覆写旧值,无视类型 SETNX():含义就是SET if Not Exists,有两个参数 setnx(key, value),该方法是原子的,如果key不存在,则设置当前key成功,返回1;如果当前key已经存在,则设置当前key失败,返回0。 SETEX()命令:有三个参数 set(key, time, value),在设置的

橘子汁的博客 1万+

【2023】通过redis 实现分布式锁由原生到Redisson代码三种实现和介绍

- **获取锁**:使用`redisTemplate.opsForValue().setIfAbsent()`, 方法实现,该方法的底层其实就是调用了`execute()`方法实现了`setnx`命令(先进行判定键是否存在,不存在则设置key,成功后返回`true`;存在则直接返回`false`)。 - **释放锁**:直接使用`redisTemplate.delete()`方法删除掉该key即可释放成功。但在删除之前需要通过验证值的方式,验证是否是该线程自己的锁。

weixin_52315708的博客 427

[060][调度模块]Redisson vs Redis 原生锁:两种分布式锁实现深度对比

本文对比了Redis原生锁与Redisson分布式锁的实现差异。Redis原生锁基于SET NX PX命令,实现简单但不支持重入和自动续期;Redisson提供了可重入锁和阻塞锁两种实现,内置看门狗机制自动续期,API更友好但依赖较重。在故障恢复方面两者均能保证锁最终释放。选型建议:轻量级应用可用Redis原生锁,需要高级功能时推荐Redisson,其中可重入锁适合大多数场景,阻塞锁适用于必须执行的任务。Redisson在功能和可靠性上更优,但会增加系统复杂度。

杨运交的博客 188

Redis 分布式锁与 Redisson 深度解析:从原生实现到工业级解决方案

本文系统介绍了Redis分布式锁的实现原理与演进过程。首先分析了分布式锁的必要性及其核心特性(互斥性、防死锁、可重入性、高可用)。然后详细讲解了原生Redis分布式锁的三个演进版本:从简单的SETNX实现,到增加唯一标识防止误删,再到使用Lua脚本保证解锁原子性。针对原生方案的不足,重点介绍了Redisson的工业级解决方案,包括其可重入锁的数据结构、加解锁流程、看门狗机制等核心设计。文章还提供了SpringBoot整合Redisson的实战示例,并给出线上最佳实践与常见误区。

2401_88151415的博客 621
上一篇: 力扣48旋转图像
下一篇: 力扣240 搜索二维矩阵 ll
format_push
博客等级 码龄4年 104粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值