认识一下redis的分布式锁

ops/2025/2/13 19:11:10/

Redis的分布式锁是一种通过Redis实现的分布式锁机制,用于在分布式系统中确保同一时刻只有一个客户端可以访问某个资源。它通常用于防止多个应用实例在同一时间执行某些特定操作,避免数据的不一致性或竞争条件。

实现分布式锁的基本思路:

    1.    锁的获取:客户端通过SETNX(SET if Not eXists)命令在Redis中创建一个锁。SETNX只会在指定的键不存在时设置键的值,如果键已存在,则获取锁失败。
    2.    锁的释放:客户端持有锁时,通过某些操作完成任务后,应该释放锁,通常使用DEL命令删除锁的键。
    3.    锁的超时:为了防止死锁,分布式锁通常会设置一个超时机制,在客户端没有释放锁的情况下,Redis会在一段时间后自动释放锁。

Redis分布式锁的实现步骤:

1. 获取锁:

SET resource_name my_random_value NX EX 30

    •    SET resource_name: 设置键名为resource_name,对应的锁资源。
    •    my_random_value: 用一个唯一的随机值(如UUID或时间戳)来标识请求锁的客户端。可以防止锁的误释放。
    •    NX: 只有当键不存在时才设置锁,确保锁是互斥的。
    •    EX 30: 锁的过期时间,单位为秒,防止因客户端故障而导致锁一直存在。

2. 释放锁:

在释放锁时,需要确保只释放自己持有的锁,可以通过检查锁的值来实现:

if GET resource_name == my_random_value:
    DEL resource_name

    •    GET resource_name: 获取锁的值。
    •    my_random_value: 比对锁的值,确保只有持有该锁的客户端才能释放锁。

3. 防止死锁:

设置一个合理的锁过期时间(如EX 30),即使客户端因为故障未能释放锁,锁会在超时后自动过期,避免死锁问题。

Redis分布式锁的优缺点:

优点:

    •    性能高:Redis是内存数据库,获取和释放锁的操作速度非常快,适合高并发场景。
    •    简单易用:使用Redis原生命令(如SETNX)就能实现分布式锁,简单易懂。
    •    支持分布式:Redis作为一个独立的服务,可以被多个分布式节点共享,适合分布式系统使用。

缺点:

    •    不可靠:如果客户端在持有锁期间崩溃,锁可能无法释放(即死锁)。可以通过设置合理的锁过期时间来缓解这个问题。
    •    精确控制困难:在高并发情况下,可能需要使用更为复杂的锁实现(例如:Redisson库提供的锁功能)来确保准确性和效率。

使用Redisson实现分布式

为了简化分布式锁的使用,Redisson提供了一些高级功能来避免手动管理锁。例如,使用RLock接口:

RLock lock = redissonClient.getLock("myLock");
lock.lock();  // 获取锁
try {// 执行需要保护的业务逻辑
} finally {lock.unlock();  // 释放锁
}

总结:

Redis的分布式锁通过SETNX和DEL实现基础锁功能,适合在分布式环境中使用。但为了避免死锁、锁竞争等问题,可以设置合理的过期时间或使用高级封装工具(如Redisson)。


http://www.ppmy.cn/ops/158108.html

相关文章

树莓集团:从区域到全国,数字产业园服务如何有效赋能企业?

树莓集团从区域发展起步,逐步迈向全国,其数字产业园服务在赋能企业方面有着独特的路径。 在区域发展阶段,树莓集团深入了解当地企业的需求和特点,为企业量身定制服务方案。例如,针对当地传统制造业企业,提…

MySQL的innoDB引擎

一、逻辑存储结构 表空间:ibd文件,一个MySQL实例可以对应多个表空间,用于存储记录,索引等数据; 段:分为数据段(leaf node segment)、索引段(non-leaf node segment)、回滚段(rollback segment),innodb是索引组织表,数据段就是B+树的非叶子节点。段用来管理多个e…

Rhel Centos环境开关机自动脚本

Rhel Centos环境开关机自动脚本 1. 业务需求2. 解决方法2.1 rc.local2.2 rc.d2.3 systemd2.4 systemd附着的方法2.5 tuned 3. 测试 1. 业务需求 一台较老的服务器上面业务比较简单,提供一个简单的网站,但已经没有业务的运维人员. 想达到的效果: 由于是非标准的apache或者nginx…

Java分布式幂等性怎么设计?

在高并发的场景的架构中,幂等性是必须得保证的。比如说支付功能,用户发起支付,如果后台没有坐幂等性校验,刚好用户手抖多点了几下,于是后台就有可能多次收到同一个请求,不做幂等性校验很容易就让用户重复支…

【分布式理论7】分布式调用之:服务间的(RPC)远程调用

文章目录 一、RPC 调用过程二、RPC 动态代理:屏蔽远程通讯细节1. 动态代理示例2. 如何将动态代理应用于 RPC 三、RPC序列化与协议编码1. RPC 序列化2. RPC 协议编码2.1. 协议编码的作用2.2. RPC 协议消息组成 四、RPC 网络传输1. 网络传输流程2. 关键优化点 一、RPC…

计算机毕业设计SpringBoot校园二手交易小程序 校园二手交易平台(websocket消息推送+云存储+双端+数据统计)(源码+文档+运行视频+讲解视频)

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

Ubuntu18 将脚本设置成自启动的几种方法

Ubuntu18 将脚本设置成自启动 在Ubuntu 18.04中,有多种方法可以将脚本设置为自启动。以下是几种常见的方法: 方法1:使用crontab 打开终端。 输入 crontab -e 命令编辑当前用户的crontab文件。 在文件末尾添加以下行来设置脚本在启动时运行…

如何修改IDEA的maven远程仓库地址

IDEA自动的maven的远程仓库地址为国外地址&#xff0c;导致下载依赖时很慢&#xff0c;通过如下方法可以将其修改为国内地址 选中模块&#xff0c;右击&#xff0c;创建setting.xml文件 添加阿里仓库地址 <mirrors><mirror><id>nexus-aliyun</id><…