02_redis分布式锁原理

文章目录

    • 一、redis如何实现分布式锁
      • 1. 使用 SETNX 命令
      • 2. 设置过期时间
      • 3. 释放锁
      • 4. 注意事项
      • 5. 示例代码
    • 二、Java中分布式锁如何设置超时时间
      • 1. Redis分布式锁
      • 2. 基于Zookeeper的分布式锁
      • 3. 基于数据库的分布式锁
      • 注意事项

一、redis如何实现分布式锁

Redis 实现分布式锁是一种常见且高效的方式。以下是关于 Redis 实现分布式锁的一些关键点和步骤:

1. 使用 SETNX 命令

Redis 提供了一个非常方便的命令 SETNX(SET if Not eXists),它可以在指定的 key 不存在时,为 key 设置一个值。这个命令天然地适合用作分布式锁的占位符。

  • 命令格式SETNX key value
  • 返回值:如果 key 不存在,设置 key 的值为 value,返回 1。如果 key 已存在,不做任何操作,返回 0。

2. 设置过期时间

为了防止由于异常情况导致锁无法释放,我们通常需要给锁设置一个过期时间。这可以通过 EXPIRE 命令来实现,或者更优雅地使用 SET 命令的扩展参数。

  • 命令格式EXPIRE key secondsSET key value EX seconds(后者同时设置值和过期时间)

3. 释放锁

释放锁的操作相对简单,只需要删除对应的 key 即可。但是,这里需要注意一个细节:只有当锁的持有者(即设置锁的进程)才能释放锁。因此,在删除锁之前,我们需要检查锁的值是否匹配。

  • 命令格式DEL keyLUA 脚本(为了确保原子性,通常使用 LUA 脚本来检查并删除锁)

4. 注意事项

  • 时钟漂移:在分布式系统中,不同机器的时钟可能存在漂移。因此,设置过期时间时需要考虑这一点,避免由于时钟漂移导致的锁提前释放或过期未释放。
  • 可重入性:如果同一个进程需要多次获取同一个锁,那么锁应该是可重入的。Redis 本身不支持可重入锁,但可以通过在应用层实现一个计数器来解决这个问题。
  • 锁续期:为了避免锁因为操作时间过长而过期,可以在持有锁期间定期续期。这同样需要通过 LUA 脚本来确保原子性。
  • 死锁检测:虽然 Redis 分布式锁本身不会直接导致死锁(因为有过期时间),但应用层仍然需要处理可能出现的死锁情况。例如,可以设置一个监控线程来检测长时间未释放的锁,并进行相应的处理。

5. 示例代码

以下是一个简单的使用 Redis 实现分布式锁的 Java 示例代码(基于 Jedis 库):

import redis.clients.jedis.Jedis;public class RedisDistributedLock {private Jedis jedis;private String lockKey;private String lockValue;private int expireTime;public RedisDistributedLock(Jedis jedis, String lockKey,

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

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

相关文章

酷派Cool20/20S/30/40手机安装Play商店-谷歌三件套-GMS方法

酷派Cool系列主打低端市场,系统无任何GMS程序,也不支持直接开启或者安装谷歌服务等功能,对于国内部分经常使用谷歌服务商店的小伙伴非常不友好。涉及机型有酷派Cool20/Cool20S /30/40/50/60等旗下多个设备。好在这些机型运行的系统都是安卓11…

技术为器,服务为本:AI时代的客服价值重构

在智能化浪潮中,大语言模型的出现为客户服务行业注入了全新动能。然而技术创新的价值不在于技术本身,而在于其赋能服务的深度与广度。AI对于我们来说,如同发动机之于汽车,重要的不是引擎参数,而是整车带给用户的驾驶体…

技术创新如何赋能音视频直播行业?

在全球音视频直播行业的快速发展中,技术的持续创新始终是推动行业进步的核心动力。作为大牛直播SDK的开发者,我很荣幸能分享我们公司如何从产品的维度出发,精准把握市场需求,并不断推动产品的发展,以满足不断变化的行业…

Linux线程池(下)(34)

文章目录 前言一、v3版本二、单例模式概念特点简单实现 三、其余问题STL线程安全问题智能指针线程安全问题其他锁的概念 总结 前言 加油!!! 一、v3版本 「优化版」:从任务队列入手,引入 「生产者消费者模型」&#xff…

Netty 实战篇:Netty RPC 框架整合 Spring Boot,迈向工程化

本文将基于前面构建的 RPC 能力,尝试将其与 Spring Boot 整合,借助注解、自动扫描、依赖注入等机制,打造“开箱即用”的 Netty RPC 框架,提升开发效率与工程规范。 一、为什么要整合 Spring Boot? 手动 new 实例、写注…

Axure中继器学习笔记

一、中继器概述 中继器(Axure Repeater)是Axure中的高级组件,功能类似于数据集成器,主要用于: 数据存储与管理 数据的增删改查操作 数据的分页与展示控制 二、中继器基本使用流程 数据存储:将数据储存在中继器组件中 数据展…

hf-mirror断点续传下载权重

直接浏览器双击一个一个下载 这种方式不支持断点续传 dnf install git-lfs -y 下面成功跳过 LFS 权重下载只拿到 Git 元数据和 LFS 占位符文件了 GIT_LFS_SKIP_SMUDGE1 git clone https://hf-mirror.com/Tongyi-Zhiwen/QwenLong-L1-32B cd QwenLong-L1-32B git lfs install -…

【软件安装那些事 3 】CAD(2026 V60.7z) 安装教程(中文简体版)步骤完整不跳步 { 附软件提取下载链接,永久有效---------百度网盘 }

通过网盘分享的文件:CAD2026 V60.7z 安装包 中文 (永久有效) 链接: https://pan.baidu.com/s/122UXbOK9iGsD5Ld-lzrfAA?pwdneqd 提取码: neqd 1、解压完成后,打开【Setup】文件夹 2、鼠标右击【Setup】…

RK3399 Android7.1增加应用安装白名单机制

通过设置应用包名白名单的方式限制未授权的应用软件安装。 diff --git a/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java b/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java index af9a533..ca…

体现物联网环境下安全防护的紧迫性 :物联网环境下的个人信息安全:隐忧与防护之道

摘要:随着物联网的飞速发展,个人信息在物联网环境下面临的安全风险日益严峻。本文深入探讨了物联网环境下个人信息泄露的主要途径,分析了当前个人信息安全保护面临的挑战,并从技术、法律、企业责任和个人意识等多方面提出了相应的…

vue3 项目配置多语言支持,如何从服务端拿多语言配置

在 Vue3 项目中实现多语言支持并从服务端获取配置,可以使用 Vue I18n 库。在初始化阶段可以发送请求获取多语言配置或者通过本地文件加载json文件的方式,都可以实现。我这里是tauri项目,所以使用的是invoke从tauri端拿到配置文件,…

使用ssh-audit扫描ssh过期加密算法配置

使用ssh-audit扫描ssh过期加密算法配置 安装检查ssh的加密算法配置修改ssh的加密算法配置 安装 # pip3安装ssh-audit pip3 instal ssh-audit检查ssh的加密算法配置 # 检查ssh的配置 ssh-audit 192.168.50.149修改ssh的加密算法配置 # 查看ssh加密配置文件是否存在 ls /etc/c…

LeetCode 高频 SQL 50 题(基础版)之 【连接】部分 · 下

前五道题&#xff1a;LeetCode 高频 SQL 50 题&#xff08;基础版&#xff09;之 【连接】部分 上 题目&#xff1a;577. 员工奖金 题解&#xff1a; select r.name,b.bonus from Employee r left join Bonus b on r.empIdb.empId where b.bonus <1000 or b.bonus is nul…

[yolov11改进系列]基于yolov11引入感受野注意力卷积RFAConv的python源码+训练源码

[RFAConv介绍] 1、RFAConv 在传统卷积操作中&#xff0c;每个感受野都使用相同的卷积核参数&#xff0c;无法区分不同位置的信息差异&#xff0c;这都限制了网络性能。此外&#xff0c;由于空间注意力以及现有空间注意力机制的局限性&#xff0c;虽然能够突出关键特征&#xf…

【软件设计】通过软件设计提高 Flash 的擦写次数

目录 0. 个人简介 && 授权须知1. Flash 和 EEROM 基本情况2. 场景要求3. 软件设计思路4. 代码展示4.1 flash.h4.2 flash.c 0. 个人简介 && 授权须知 &#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是喜欢记录零碎知识点的菜鸟…

OpenCV CUDA模块直方图计算------在 GPU 上计算输入图像的直方图(histogram)函数histEven()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 该函数用于在 GPU 上计算输入图像的直方图&#xff08;histogram&#xff09;。它将像素值区间均匀划分为若干个 bin&#xff08;桶&#xff09;…

龙虎榜——20250530

上证指数阳包阴&#xff0c;量能较前期下跌有放大&#xff0c;但个股跌多涨少&#xff0c;下跌超过4000个。 深证指数和上涨总体相同。 2025年5月30日龙虎榜行业方向分析 1. 医药&#xff08;创新药原料药&#xff09; 代表标的&#xff1a;华纳药厂、舒泰神、睿智医药、华…

HarmonyNext使用request.agent.download实现断点下载

filedownlaod(API12) &#x1f4da;简介 filedownload 这是一款支持大文件断点下载的开源插件&#xff0c;退出应用程序进程杀掉以后或无网络情况下恢复网络后&#xff0c;可以在上次位置继续恢复下载等 版本更新—请查看更新日志!!! 修复已知bug,demo已经更新 &#x1f4d…

nginx: [emerg] bind() to 0.0.0.0:80 failed (10013: 80端口被占用

Nginx启动报错&#xff1a;nginx: [emerg] bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket in a way forbidden by its access permissions) 这个报错代表80端口被占用 先查看占用80的端口 netstat -aon | findstr :80 把它杀掉&#xff0c;强…

embbeding 视频截图

Embedding是什么&#xff1f;有什么作用&#xff1f;是怎么得到的&#xff1f;_哔哩哔哩_bilibili