Redies分布式锁

分布式锁是一种在分布式系统中用于同步访问共享资源的机制。Redis 是一种常用的分布式缓存系统,它可以用来实现分布式锁。

Redis 分布式锁介绍

Redis 分布式锁通常通过以下方式实现:

  1. SET 命令:使用 Redis 的 SET 命令,并设置 NXPX 选项。

    • NX:只有当键不存在时,才能设置成功。
    • PX:设置键的过期时间(毫秒)。
  2. 过期时间:为了防止死锁,锁设置了一个过期时间。如果客户端在持有锁的过程中崩溃或发生网络分区,锁会在超时后自动释放。

  3. 锁的释放:客户端在完成对共享资源的操作后,需要主动释放锁。

示例代码

下面是一个使用 Python 和 Redis 实现的分布式锁示例。

首先,你需要安装 Redis 和 redis-py 库:

pip install redis

 然后,下面是一个简单的示例代码:

import redis
import time
import uuid

class RedisDistributedLock:
    def __init__(self, redis_client, lock_key, lock_expire=5000):
        self.redis_client = redis_client
        self.lock_key = lock_key
        self.lock_expire = lock_expire
        self.lock_value = str(uuid.uuid4())

    def acquire_lock(self):
        result = self.redis_client.set(self.lock_key, self.lock_value, nx=True, px=self.lock_expire)
        return result is not None

    def release_lock(self):
        lock_value_script = """
        if redis.call("get", KEYS[1]) == ARGV[1] then
            return redis.call("del", KEYS[1])
        else
            return 0
        end
        """
        self.redis_client.eval(lock_value_script, 1, self.lock_key, self.lock_value)

# 连接到 Redis
redis_client = redis.StrictRedis(host='localhost', port=6379, db=0)

# 创建分布式锁实例
lock = RedisDistributedLock(redis_client, "my_lock")

# 尝试获取锁
if lock.acquire_lock():
    print("Lock acquired!")
    try:
        # 执行共享资源的操作
        print("Working with the shared resource...")
        time.sleep(3)  # 模拟操作
    finally:
        # 释放锁
        lock.release_lock()
        print("Lock released!")
else:
    print("Failed to acquire lock.")

解释

  1. RedisDistributedLock:这个类封装了获取和释放锁的逻辑。
  2. acquire_lock 方法:使用 SET 命令尝试获取锁。如果成功获取锁,则返回 True,否则返回 False
  3. release_lock 方法:使用 Lua 脚本安全地释放锁。只有当锁的值与当前客户端的锁值匹配时,才删除锁。

这个示例展示了如何使用 Redis 实现一个简单的分布式锁。实际应用中,你可能需要考虑锁的续期、锁超时的处理等更复杂的情况。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Android面试八股文】Framework面试:Handler怎么进行线程通信的?原理是什么?

文章目录 Handler整体思想Handler工作流程Handler工作流程图总结Handler整体思想 在多线程的应用场景中,将工作线程中需更新 UI 的操作信息 传递到 UI 主线程,从而实现 工作线程对 UI 的更新处理,最终实现异步消息的处理。 Handler工作流程 Handler 机制的工作流程主要包括…

pytest测试框架pytest-html插件生成HTML格式测试报告

Pytest提供了丰富的插件来扩展其功能,pytest-html插件帮助我们生成HTML格式的测试报告,为我们提供直观、有效的测试结果展示。 为了使用 pytest-html,需要满足以下条件: Python 3.6 或更高版本 pytest-html安装 使用pip命令安…

【scrapy】3.XPath解析

目录 一、XPath介绍 1.基本介绍 2.HTML树状结构图 3.节点之间的关系 (1)Xpath中的绝对路径与相对路径 二、XPath的语法介绍 1.元素属性定位 1.1 根据属性名定位元素: 1.2 根据属性名和属性值定位元素: 1.3 根据部分属性…

C语言力扣刷题1——最长回文字串[双指针]

力扣算题1——最长回文字串[双指针] 一、博客声明二、题目描述三、解题思路1、思路说明2、知识补充a、malloc动态内存分配b、free释放内存c、strlen求字符数组长度d、strncpy函数 四、解题代码(附注释) 一、博客声明 找工作逃不过刷题,为了更…

Swagger与RESTful API

1. Swagger简介 在现代软件开发中,RESTful API已成为应用程序间通信的一个标准。这种架构风格通过使用标准的HTTP方法来执行网络上的操作,简化了不同系统之间的交互。API(应用程序编程接口)允许不同的软件系统以一种预定义的方式…

一键进阶ComfyUI!懂AI的设计师现在都在用的节点式Stable Diffusion

前言 _ 万字教程!奶奶看了都会的 ComfyUI 入门教程 推荐阅读 一、川言川语 大家好,我是言川。 阅读文章 > ](https://www.uisdc.com/comfyui-3) 目前使用 Stable Diffusion 进行创作的工具主要有两个:WebUI 和 ComfyUI。而更晚出现的…

2000—2022年青藏高原遥感生态指数数据集

该数据集是基于多套MODIS数据集,选取NDVI、LST、WET、NDBSI四项指标,采用主成分分析法,生成2000-2022年500米空间分辨率的遥感生态指数(RSEI)数据集。 遥感生态指数:是一种基于遥感技术的生态环境质量综合评…

容联云容犀Desk在线客服:全渠道+全场景+全智能辅助,提升客户体验

如今,客户体验已经从基础的对话、交易、业务办理,转变为深度的生活联结、情感共鸣、价值认可。客户期待的转变,也让更多企业越发重视“以客户为中心”的业务增长战略。 容犀Desk营销服统一体验工作空间应运而生,其核心能力在线客…

wsl ubuntu 安装Anaconda3步骤

如何在Ubuntu上安装Anaconda3呢?本章记录整个安装过程。 1、下载脚本 https://mirrors.bfsu.edu.cn/anaconda/archive/Anaconda3-2023.09-0-Linux-x86_64.sh 下载之后,将脚本上传到Ubuntu里。 2、安装脚本 bash Anaconda3-2021.11-Linux-x86_64.sh根据提示进行安装,提示输…

React:tabs或标签页自定义右击菜单内容,支持内嵌iframe关闭菜单方案

React:tabs或标签页自定义右击菜单内容,支持内嵌iframe关闭菜单方案 不管是react、vue还是原生js,原理是一样的。 注意如果内嵌iframe情况下,iframe无法使用事件监听,但是可以使用iframe的任何点击行为都会往父级wind…

【等保】网络安全等级保护(等保2.0PPT)

等保2.0(网络安全等级保护基本要求的第二代标准)的推出和实施,是基于多方面的考虑和需求。以下是实施等保2.0的主要原因: 加强网络安全保护: 随着网络技术的不断发展和网络威胁的不断增加,传统的网络安全保…

BGP中的TCP连接源地址问题

3.TCP连接源地址(用loop back地址是最优选择) 应用场景与理论: 由于BGP应用于大型网络中,为了避免单点失败,往往需要通过多条链路连接,当一条链路故障时候就用另一条链路继续工作,但是BGP又无法…

Swift 6:导入语句上的访问级别

文章目录 前言示例启用 AccessLevelOnImport破坏性变更采用这些更改总结前言 SE-0409 提案引入了一项新功能,即允许使用 Swift 的任何可用访问级别标记导入声明,以限制导入的符号可以在哪些类型或接口中使用。由于这些变化,现在可以将依赖项标记为对当前源文件(private 或…

IO-Link软件开发流程

目录 了解IO-Link协议: 确定物理连接方式: 编写驱动程序: 测试通信: 集成与应用: 优化与迭代: 文档编写与用户支持: IO-Link产品的开发流程主要包括以下几个步骤 了解IO-Link协议&#x…

【java实习评审】 项目详情模块,如何设计关联表,提高查询性能

大家好,本篇文章分享一下【校招VIP】免费商业项目“推评分16”第一期电影详情模块 java同学的文档周最佳作品。 1、本项目是基于年轻人的喜好,更个性的电影推荐网站。筛选各分类的知名电影,并给出推荐理由和下载链接。另外,通过…

泰迪智能科技实验室产品-云计算资源管理平台介绍

云计算资源管理平台是一款集群应用程序管理平台,以Docker、Kubernetes为核心引擎的容器化应用部署、运行环境,对数据中心的物理服务器、网络、存储、虚拟服务器等基础架构资源进行集中统一的管理、分配、监控等。平台旨在围绕行业应用逐步由“虚拟化”向…

Docker部署前端,动态配置后端地址

本文介绍了使用Docker环境变量动态配置nginx。采用的是通过docker run -e xxxxxxx先往容器注入环境变量,然后进一步通过envsubst指令将环境变量写入到conf文件中,实现动态配置文件内容。 背景 前后端分离的架构下,经常会用到nginx反向代理来…

深度学习 --- stanford cs231学习笔记七(训练神经网络之梯度下降优化器)

5,梯度下降优化器 5,1 梯度下降在深度学习中的作用 在深度学习中,权重W的值是否合理是由损失函数L来判断的。L越小,表示W的设置越happy。L越大,表示W的值越unhappy。 为了让L越来越小,常用的方法是梯度下降…

自主可控的芯片设计供应链软件:保障芯片产业安全的关键

在当前的科技浪潮中,芯片作为信息技术的核心,其设计、制造和供应链的安全性和自主可控性显得尤为重要。而自主可控的芯片设计供应链软件,正是保障这一产业链安全的关键环节。 首先,我们要明确自主可控芯片设计供应链软件的核心价值…

【强化学习】第02期:动态规划方法

笔者近期上了国科大周晓飞老师《强化学习及其应用》课程,计划整理一个强化学习系列笔记。笔记中所引用的内容部分出自周老师的课程PPT。笔记中如有不到之处,敬请批评指正。 文章目录 2.1 动态规划:策略收敛法/策略迭代法2.2 动态规划&#xf…