Redis04-分布式锁

目录

Redis实现分布式锁

分布式锁的工作流程

Redis实现分布式锁

Redission的watch dog

Redis分布式锁的合理应用


Redis实现分布式锁

在单节点的服务器中,java中的synchronized机制是处于JVM层面的,只能保证线程之间的同步。而实际的服务部署中,我们通常会使用多节点的集群部署方式,而要保证多个节点中的不同进程对数据的同步操作,就需要使用分布式锁。

使用分布式锁的主要目的是在分布式环境中确保多个节点之间的协同操作,避免由于并发访问而导致的数据不一致、竞态条件等问题。以下是使用分布式锁的一些常见原因:

  1. 避免并发问题: 在分布式系统中,多个节点可能同时对共享资源进行访问。使用分布式锁可以确保对关键资源的访问在同一时刻只有一个节点拥有,避免并发问题,如数据不一致、丢失更新等。

  2. 保护共享资源: 分布式系统中的共享资源,例如数据库、缓存、文件等,可能同时被多个节点访问。通过使用分布式锁,可以保护这些共享资源,确保在任何时刻只有一个节点能够修改它们。

  3. 防止死锁: 在分布式系统中,由于网络分区、节点故障等原因,可能发生死锁。通过使用分布式锁,可以避免因为多节点间的协同操作导致的死锁问题。

  4. 控制访问顺序: 在某些场景下,需要对共享资源的访问进行有序控制,确保一些操作的执行顺序。分布式锁可以用于实现对资源的顺序访问。

  5. 实现分布式协调: 分布式锁是实现分布式协调和同步的一种重要机制。例如,在分布式任务调度、分布式事务等场景中,分布式锁可以用于协调不同节点的操作。

  6. 防止重复执行: 在一些需要幂等性操作的场景下,分布式锁可以用于防止同一操作被重复执行。

  7. 避免“多写”问题: 当多个节点同时写入同一数据时,可能导致“多写”问题,即最后写入的值覆盖了之前的写入。分布式锁可以用于保护写入操作,确保只有一个节点能够写入。

分布式锁的工作流程

Redis实现分布式锁

Redis实现分布式锁主要利用的是Redis的setnx命令。setnc是Set if no exists的简写。

CenOs7:0>setnx lock 1 # 首次设置lock值1
"1"  # 设置成功返回1
CenOs7:0>setnx lock 1 # lock已存在,给lock赋值
"0"  # 设置失败返回0,不做任何操作
CenOs7:0>get lock # 获取lock的值
"1"  # lock值为1
CenOs7:0>del lock # 删除lock,释放锁
"1"  # 删除成功,返回1
CenOs7:0>get lock # 获取lock的值
null # lock为空
CenOs7:0>setnx lock 1 # 设置lock值为1
"1"  # 设置成功

需要注意的是,setnx的方式是不支持重入锁的。而且锁的持有时间很难控制。单纯地依赖expire设置过期时间是不现实的。

Redission的watch dog

Redission引入了“看门狗”的机制,目的是处理锁的续期问题。

代码示例:

import org.redisson.Redisson;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
​
import java.util.concurrent.TimeUnit;
​
public class RedissonWatchdogExample {
​
    public static void main(String[] args) throws InterruptedException {
        // 创建 Redisson 客户端
        Config config = new Config();
        config.useSingleServer().setAddress("redis://127.0.0.1:6379");
        RedissonClient redisson = Redisson.create(config);
​
        // 获取分布式锁
        RLock lock = redisson.getLock("myLock");
​
        try {
            // 尝试获取锁并设置锁的过期时间为10秒
            // boolean isLocked = lock.tryLock(10, 30, TimeUnit.SECONDS);
            // 如果设置了第二个参数[锁的持续时间]就默认不使用watchdog
            // redission中的lock是依赖了底层lua脚本的原子性实现的
            boolean isLocked = lock.tryLock(10, TimeUnit.SECONDS);
​
            if (isLocked) {
                // 获取锁成功,执行业务逻辑
                System.out.println("Lock acquired. Executing business logic...");
​
                // 模拟业务逻辑执行时间
                Thread.sleep(5000);
​
                // 业务逻辑执行完毕,不需要手动释放锁,Watchdog会自动续期或者释放锁
​
            } else {
                System.out.println("Failed to acquire the lock within the specified time");
            }
​
        } finally {
            // 关闭 Redisson 客户端
            redisson.shutdown();
        }
    }
}

创建了一个名为"myLock"的分布式锁,并使用tryLock方法尝试获取锁,设置锁的过期时间为10秒。在获取锁成功后,执行了一段模拟的业务逻辑,并且无需手动释放锁,因为Watchdog会在锁过期时自动续期或释放锁。

需要注意的是,Redisson Watchdog是默认开启的,你不需要额外的配置。在正式的生产环境中,建议你根据实际需求进行更详细的配置,比如设置Watchdog的检查间隔、锁的失效时间等参数。

Redis分布式锁的合理应用

Redis分布式锁是在多个节点之间实现互斥访问共享资源的一种机制。它可以应用于各种场景,以下是一些合理的应用场景:

  1. 分布式任务调度: 当有多个节点需要执行定时任务或者周期性任务时,可以使用分布式锁确保同一时刻只有一个节点在执行任务,避免重复执行或者竞态条件。

  2. 分布式缓存更新: 当多个节点需要同时更新某个缓存或者共享的数据时,可以使用分布式锁确保只有一个节点能够进行更新操作,防止并发问题。

  3. 分布式事务: 在分布式事务场景下,可能需要对一些关键资源进行加锁,以确保在事务执行期间,其他事务不会修改这些资源,从而保证事务的隔离性。

  4. 防止重复操作: 在一些场景下,可能需要防止某个操作被重复执行。通过使用分布式锁,可以确保同一时刻只有一个节点能够执行这个操作,防止重复操作。

  5. 分布式限流: 在某些情况下,需要对请求进行限流,确保系统不被过度请求。通过使用分布式锁,可以控制某个时间窗口内只有一个节点能够处理请求,实现简单的限流效果。

  6. 分布式协同: 当多个节点需要协同工作时,可以使用分布式锁确保各个节点之间的操作按照规定的顺序进行,防止不一致或混乱的情况发生。

  7. 分布式任务队列: 在分布式环境中,多个节点可能需要消费同一个任务队列。通过使用分布式锁,可以确保只有一个节点能够成功获取并消费队列中的任务,避免重复消费。

  8. 资源竞争: 当多个节点需要竞争某个资源时,可以使用分布式锁来进行竞争,确保只有一个节点能够成功占用资源,如分布式锁用于实现分布式秒杀场景。

需要注意的是,在使用分布式锁时,要注意锁的超时策略、锁的释放等问题,以确保系统的稳定性和性能。此外,选择成熟的分布式锁实现库,如Redisson、Curator等,可以减少潜在的问题,提高开发效率。

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

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

相关文章

第90步 深度学习图像分割:U-Net建模

基于WIN10的64位系统演示 一、写在前面 从这一期开始,我们杀个回马枪,继续学习深度学习图像分割系列,以为4090上岗了。 图像分割是计算机视觉的一个重要任务,目的是将数字图像分割成多个部分或区域,这些部分通常对应…

goroutine调度模型 调度策略

文章目录 背景 协程线程与协程的对比线程(Thread)协程(Coroutine) 运作线程模型 goroutine调度模型与演进过程G-M模型G-P-M模型抢占式调度器其他优化 调度策略队列轮转系统调用工作量窃取抢占式调度GOMAXPROCS 对性能的影响 Go在语…

multilinear多项式承诺方案benchmark对比

1. 引言 前序博客有: Lasso、Jolt 以及 Lookup Singularity——Part 1Lasso、Jolt 以及 Lookup Singularity——Part 2深入了解LassoJolt Lasso lookup中,multilinear多项式承诺方案的高效性至关重要。 本文重点关注4种multilinear多项式承诺方案的实…

【Python基础】try-finally语句和with语句

📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍…

Springboot+vue的毕业生实习与就业管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频: Springbootvue的毕业生实习与就业管理系统(有报告)。Javaee项目,springboot vue前后端分离项目 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点…

logback异步日志打印阻塞工作线程

前言 最新做项目,发现一些历史遗留问题,典型的是日志打印的配置问题,其实都是些简单问题,但是往往简单问题引起严重的事故,比如日志打印阻塞工作线程,以logback和log4j2为例。logback实际上是springboot的…

Smart Link 和 Monitor Link应用

定义 Smart Link常用于双上行链路组网,提高接入的可靠性。 Monitor Link通过监视上行接口,使下行接口同步上行接口状态,起到传递故障信息的作用。 Smart Link,又叫做备份链路。一个Smart Link由两个接口组成,其中一个…

2016年408计网

这一年,计算机网络部分的全部考题都围绕该网络拓扑图进行。 第33题 在 OSI 参考模型中, R1、Switch、Hub 实现的最高功能层分别是() A. 2、2、1 B. 2、2、2 C. 3、2、1 D. 3、2、2 本题考察路由器、以太网交换机、集线器各自实现的最高功能层是什么题目给定R1是…

链表OJ题【环形链表】(3)

目录 环形问题的思考 ❓Q1 ❓Q2 🙂Q2 ❓Q3 ❓Q4 8.环形链表 9.环形链表Ⅱ 今天接着链表的经典问题环形问题。大家一定要自己动手多写写。🙂 快慢指针(保持相对距离/保持相对速度)野指针考虑为NULL的情况带环链表&#x…

Java14新增特性

前言 前面的文章,我们对Java9、Java10、Java11、Java12 、Java13的特性进行了介绍,对应的文章如下 Java9新增特性 Java10新增特性 Java11新增特性 Java12新增特性 Java13新增特性 今天我们来一起看一下Java14这个版本的一些重要信息 版本介绍 Java 14…

No180.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

【图像处理:OpenCV-Python基础操作】

【图像处理:OpenCV-Python基础操作】 1 读取图像2 显示图像3 保存图像4 图像二值化、灰度图、彩色图,像素替换5 通道处理(通道拆分、合并)6 调整尺寸大小7 提取感兴趣区域、掩膜8 乘法、逻辑运算9 HSV色彩空间,获取特定…

【算法每日一练]-单调队列,滑动窗口(保姆级教程 篇1) #滑动窗口 #求m区间的最小值 #理想的正方形 #切蛋糕

今天讲单调队列 目录 题目:滑动窗口 思路: 题目:求m区间的最小值​ 思路: 题目:理想的正方形 思路: 题目:切蛋糕 思路: 一共两种类型:一种是区间中的最值&…

游戏制作:猜数字(1~100),不会也可以先试着玩玩

目录 1 2代码如下:可以试着先玩玩 3运行结果:嘿嘿嘿 4程序分析:想学的看 5总结: 1 猜数范围为1~100,猜大输出猜大了,猜小输出猜小了,游戏可以无限玩。 首先先做一个简单的菜单界面&#xf…

RK3588平台 WIFI的基本概念

一.安卓WIFI框架 Android WIFI系统引入了wpa_supplicant,它的整个WIFI系统以wpa_supplicant为核心来定义上层接口和下层驱动接口。Android WIFI主要分为六大层,分别是WiFi Settings层,Wifi Framework层,Wifi JNI 层, W…

WorkPlus Meet:局域网内部使用的高效视频会议系统

随着全球化和远程办公的趋势,视频会议已成为现代企业和机构不可或缺的沟通工具。而现在,大多数政企单位或者涉密强的企业,都会使用局域网部署的音视频会议系统,提供更高的安全性和隐私保护。因为音视频会议中可能涉及到公司机密和…

Torch Hub 系列#2:VGG 和 ResNet

一、说明 在上一篇教程中,我们了解了 Torch Hub 背后的本质及其概念。然后,我们使用 Torch Hub 的复杂性发布了我们的模型,并通过相同的方式访问它。但是,当我们的工作要求我们利用 Torch Hub 上提供的众多全能模型之一时,会发生什么? 在本教程中,我们将学习如何利用称为…

自动泊车轨迹规划学习

1.基于6次多项式的自动泊车轨迹算法研究 针对常见的自动泊车系统无法躲避障碍物,以及轨迹的曲率不连续等问题进行了泊车轨迹算法的研究以及跟踪算法的设计。 针对低速自动泊车场景进行分析,建立符合对应场景下的车辆运动学模型以及能够泊车的最小车位大…

华为dns mapping配置案例

解决内网PC用公网的dns用域名方法访问公司内网的web服务器: 原理是用DNS mapping方式解决 配置过程:域名——出口公网IP地址——公网端口——协议类型 公司内网client用户填公网dns, 公网上的dns上面已注册有公司对外映射的web服务器的公网…

山西电力市场日前价格预测【2023-11-13】

日前价格预测 预测说明: 如上图所示,预测明日(2023-11-13)山西电力市场全天平均日前电价为428.16元/MWh。其中,最高日前电价为751.89元/MWh,预计出现在18: 30。最低日前电价为289.03元/MWh,预计…