redis缓存实现分布式锁原理及注意事项(附代码)

分布式锁是用于在分布式系统中对共享资源进行访问控制的一种机制,它可以确保在多个节点并发访问时只有一个节点能够获取到锁,从而保证对共享资源的操作不会发生冲突。

实现原理:
  1. 使用Redis缓存实现分布式锁的基本原理:
    SETNX命令(SET if Not eXists):Redis的SETNX命令可以在键不存在时设置键的值,因此可以利用它来实现分布式锁。当一个节点尝试设置某个键的值时,如果返回1表示设置成功,即获取到了锁;如果返回0表示键已存在,即未获取到锁。
    SET命令设置过期时间:为了防止锁长时间占用,一般会在设置锁的同时设置一个过期时间,确保即使获取锁的节点异常退出或忘记释放锁,锁也能够自动释放。
  2. 使用Redlock算法实现分布式锁的基本原理:
    多节点协作:Redlock算法通过多个独立的Redis实例协作来实现分布式锁。当一个节点尝试获取锁时,需要在多个Redis节点上设置锁,只有在大多数节点上成功设置了锁才算获取成功;在释放锁时,也需要在多个节点上删除锁。
注意事项:
  1. 锁的过期时间设置:设置合适的过期时间是保证系统正常运行的关键。如果过期时间设置过长,可能会导致锁长时间占用,影响系统性能;如果过期时间设置过短,可能会导致锁被过早释放,影响业务逻辑的正确性。
  2. 避免死锁:在设计分布式锁时,需要避免因为各种异常情况导致的死锁问题,例如节点异常退出、网络分区等情况。可以通过设置锁的自动过期时间和引入重试机制来解决这些问题。
  3. 保证锁的互斥性:分布式锁需要确保在任何时刻只有一个节点能够获取到锁,否则会导致对共享资源的并发访问冲突。因此,在设置锁时需要保证原子性操作,例如使用Redis的SETNX命令。
  4. 考虑性能和可用性:在选择分布式锁的实现方式时,需要综合考虑性能和可用性。基于Redis的分布式锁通常性能较高,但需要依赖外部服务;而基于数据库或者ZooKeeper等分布式协调服务的分布式锁则更加稳定,但性能可能会受到影响。
  5. 谨慎处理异常情况:在编写使用分布式锁的代码时,需要谨慎处理各种异常情况,确保系统能够正确地处理锁的获取和释放,以避免因为异常情况导致的资源泄露或者死锁问题。
SETNX命令可以在键不存在时设置键的值,因此可以利用它来实现分布式锁。基本原理是:在执行SETNX命令时,如果返回1表示设置成功,即获取到了锁;如果返回0表示键已存在,即未获取到锁。

示例代码(Python):

import redisclass RedisLock:def __init__(self, redis_client, lock_key):self.redis_client = redis_clientself.lock_key = lock_keydef acquire(self):return self.redis_client.setnx(self.lock_key, "locked")def release(self):self.redis_client.delete(self.lock_key)# 使用示例
redis_client = redis.StrictRedis(host='localhost', port=6379, db=0)
lock = RedisLock(redis_client, "my_lock")if lock.acquire():try:# 在这里执行需要加锁的操作print("Lock acquired, executing critical section...")finally:lock.release()
else:print("Failed to acquire lock")

示例代码(JAVA):

import redis.clients.jedis.Jedis;public class DistributedLockExample {private static final String LOCK_KEY = "distributed_lock";private static final int LOCK_EXPIRE_TIME = 10000; // 锁的过期时间,单位毫秒private Jedis jedis;public DistributedLockExample() {// 连接到Redis服务器jedis = new Jedis("localhost", 6379);}public boolean acquireLock() {// 尝试获取锁String result = jedis.set(LOCK_KEY, "locked", "NX", "PX", LOCK_EXPIRE_TIME);return "OK".equals(result);}public void releaseLock() {// 释放锁jedis.del(LOCK_KEY);}public static void main(String[] args) {DistributedLockExample example = new DistributedLockExample();try {// 尝试获取锁if (example.acquireLock()) {System.out.println("成功获取到锁");// 执行业务逻辑// ...} else {System.out.println("未能获取到锁");}} finally {// 释放锁example.releaseLock();}}
}
在这个示例中,我们使用了Jedis库来连接到Redis服务器,并通过调用set命令来尝试获取锁。其中,NX表示只在键不存在时执行操作,PX表示设置键的过期时间。如果成功获取到锁,则执行业务逻辑;最后,无论是否成功获取到锁,都需要调用releaseLock方法来释放锁。

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

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

相关文章

每日一题:C语言经典例题之报数字说英文

题目描述 输入一个1到7之间的数字&#xff0c;表示星期一到星期日&#xff0c;输出相应的英文&#xff1a;Mon、Tue、Wed、Thur、Fri、Sat、Sun。 输入 输入一个1到7之间的数字。 输出 输出与数字对应的英文。 样例输入 6 样例输出 Sat 代码 #include <stdio.h> int …

kafka(六)——存储策略

存储机制 kafka通过topic作为主题缓存数据&#xff0c;一个topic主题可以包括多个partition&#xff0c;每个partition是一个有序的队列&#xff0c;同一个topic的不同partiton可以分配在不同的broker&#xff08;kafka服务器&#xff09;。 关系图 partition分布图 名称为t…

利用细粒度检索增强和自我检查提升对话式问题解答能力

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 论文标题&#xff1a;Boosting Conversational Question Answering with Fine-Grained Retrieval-Augmentation and Self-Check 论文地址&#xff1a;https://arxiv.org/abs/2403.18243 检索增强生成…

力扣53 最大子数组和 Java版本

文章目录 题目描述代码 题目描述 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 示例 1&#xff1a; 输入&#xff1a;nums [-2,1,-…

Echarts使用dataTool写可自定义横坐标的盒须图(箱线图)

在vue2中的完整盒须图组件代码 可自适应浏览器窗体变化&#xff0c;可自定义横坐标&#xff0c;无需写箱线图数据处理逻辑。dataTool是echarts自带的&#xff0c;无需额外安装&#xff0c;只要引入。 <template><span><div ref"BoxPlotChart" id&qu…

phpstorm 快捷键

PHPstorm最常用的快捷键&#xff0c;提高开发效率 - 知乎 (zhihu.com) 四年精华PHP技术文章整理合集——PHP框架篇 (qq.com) 四年精华PHP技术文合集——微服务架构篇 (qq.com)

程序“猿”自动化脚本(一)

1.剪贴板管理器&#x1f4cb; 您是否曾经发现自己在处理多个文本片段时忘记了复制的内容&#xff1f;有没有想过有一个工具可以跟踪您一天内复制的所有内容&#xff1f; 该自动化脚本会监视您复制的所有内容&#xff0c;将每个复制的文本无缝存储在时尚的图形界面中&#xff0c…

Python向文件里写入数据

直接上代码 name "测试" data name.encode("utf-8")# w特点&#xff1a;文件不存在则创建文件并在打开前清空 f open("db.txt", mode"wb")f.write(data)f.close()可以在 db.txt 文件里看到一句话 测试name "Testing" …

阿里云4核16G服务器可以用来做什么?

阿里云4核16G服务器可以用来做什么&#xff1f;可用来搭建游戏服务器&#xff0c;阿里云4核16G服务器10M带宽30元1个月、90元3个月&#xff0c;优惠活动 aliyunfuwuqi.com/go/youhui 阿里云4核16G服务器可以用来做什么&#xff1f;除了搭建游戏服务器&#xff0c;还可以用来哪…

167. 两数之和 II - 输入有序数组(Java)

目录 题目描述&#xff1a;输入&#xff1a;输出&#xff1a;代码实现&#xff1a;1.二分&#xff08;折半&#xff09;查找2.双指针向内缩进 题目描述&#xff1a; 给你一个下标从 1 开始的整数数组 numbers &#xff0c;该数组已按 非递减顺序排列 &#xff0c;请你从数组中找…

基于 GPIO 、Pinctl子系统、设备树的LED 驱动程序

理论部分&#xff1a; 编写思路&#xff1a; GPIO 的地位跟其他模块&#xff0c;比如 I2C 、 UART 的地方是一样的&#xff0c;要使用某个引脚&#xff0c;需要先把引脚配置为 GPIO 功能&#xff0c;这要使用 Pinctrl 子系统&#xff0c;只需要在设备 树里指定就可以。在…

力扣HOT100 - 41. 缺失的第一个正数

解题思路&#xff1a; 原地哈希 就相当于&#xff0c;让每个数字n都回到下标为n-1的家里。 而那些没有回到家里的就成了孤魂野鬼流浪在外&#xff0c;他们要么是根本就没有自己的家&#xff08;数字小于等于0或者大于nums.size()&#xff09;&#xff0c;要么是自己的家被别…

springCloud项目打包 ,maven package或install打包报错

解决思路一&#xff1a; <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.3.7.RELEASE</version></plugin><plugin>&…

【应急响应事件】记一次矿机木马事件

事情起因&#xff0c;是因为实验室有一台服务器的占用率从开机启动就是100%&#xff0c;很怀疑就是中了某种矿机木马&#xff0c;拿去挖矿了&#xff0c;然后经过师兄的不懈努力&#xff0c;终于找到了木马文件&#xff0c;给他命名为virus_sample 然后我就拿着样本去逆了 木马…

OSCP靶场--Peppo

OSCP靶场–Peppo 考点(ident枚举服务用户名ssh登陆rbash绕过 docker提权) 1.nmap扫描 ## ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.158.60 -sV -sC -Pn --min-rate 2500 -p- Starting Nmap 7.92 ( https://nmap.org ) at 2024-04-10 09:32 EDT Nmap scan report…

使用 Docker 部署 Linux-Command 命令搜索工具

1&#xff09;介绍 Linux-Command GitHub&#xff1a;https://github.com/jaywcjlove/linux-command Linux-Command 仓库搜集了 580 多个 Linux 命令&#xff0c;是一个非盈利性的仓库&#xff0c;生成了一个 Web 网站方便使用&#xff0c;目前网站没有任何广告&#xff0c;内…

T2.数据库原理

2.1 关系模型概述 1.域 域&#xff1a; 一组有相同数据类型的值得集合 2.笛卡尔积 笛卡尔积&#xff1a; 设任意的N个域D1,D2,…,Dn。 3、关系的定义和性质 &#xff08;1&#xff09;关系的数学定义&#xff1a; 在笛卡儿积中取出有实际意义的元组来构造关系。 关系也是…

设计模式学习笔记 - 设计模式与范式 -行为型:15.命令模式:如何利用命令模式实现一个游戏后端架构

概述 行为型设计模式只剩下3个模式了&#xff0c;它们分别是&#xff1a;命令模式、解释器模式、中介模式。这 3 个设计模式使用频率低、理解难度大&#xff0c;只在特定的应用场景下才会用到&#xff0c;所以这 3 个设计模式你只需要稍微了解即可。 本章学习其中的命令模式。…

C++11 数据结构1 线性表的概念,线性表的顺序存储,实现,测试

一 线性表的概念 线性结构是一种最简单且常用的数据结构。 线性结构的基本特点是节点之间满足线性关系。 本章讨论的动态数组、链表、栈、队列都属于线性结构。 他们的共同之处&#xff0c;是节点中有且只有一个开始节点和终端节点。按这种关系&#xff0c;可以把它们的所有…

双指针问题的常见剪枝

双指针问题的常见剪枝&#xff1a; 一.leecode第15题&#xff1a; 给定一个包含 n 个整数的数组 nums&#xff0c;判断 nums 中是否存在三个元素 a &#xff0c;b &#xff0c;c &#xff0c;使得 a b c 0 &#xff1f;请找出所有和为 0 且 不重复 的三元组。 示例 1&…