Redis-实现分布式锁

单节点分布式锁

本地的锁操作非常常见,无非就是申请一个锁变量lock, 加锁时,判断锁变量是否被持有,如果被持有中,则加锁失败,如果不被持有,则加锁成功,将锁的状态改为持有锁的这个线程信息。加锁成功,执行完相应操作后,再释放锁,即将锁状态该线程的信息抹掉。

而在分布式系统中,如果需要加锁,那么锁资源必须在一个可以被各个实例访问的共享资源里。Redis就可以作为这个共享资源。在加锁的过程中,需要注意的地方是,

  1. 加锁,需要判断锁变量的值(也就是本地锁的锁状态),如果可以被加锁,则设置为加锁后的值,这一系列的操作需要是 原子的。
  2. 释放锁,不能由于某个客户端挂了,该锁就一直不能释放,影响其他客户端加锁。

针对以上第一点,单节点的Redis加锁,可以使用 setnx命令, set lock_key unique_value nx px 1000,即设置lock_key这个键的值,如果该键存在(已经被其他客户端设置,且处于持有中,未释放)就不操作,如果该键不存在,就设置值,该值为此客户端的信息。而且,Redis的单命令操作可以保证原子性。

释放锁的时候,可以用 DEL该键的方法来释放,为了避免出现不同客户端错误释放共享的情况,我们需要比较键的值为此客户端信息时,才释放,Redis也可以用Lua脚本保证操作原子性,如下:

if redis.call("get", lock_key) == unique_value then
  return redis.call("del", lock_key)
else
  return 0
end

多节点分布式锁

单节点的分布式锁,简单清晰也很方便,缺点就是如果节点挂了,那么所有加锁操作都会失败。所以为了提高分布式锁的高可靠,Redis开发者提供了一个Redlock的锁算法。算法的思路为:客户端与多个实例节点依次加锁,如果能够在半数以上加锁成功且获取锁过程的耗时小于锁的有效时间,那么认为客户端成功地获取了分布式锁,否则即为失败。

Original: https://www.cnblogs.com/rachel-aoao/p/redis_distributed_lock.html
Author: rachel_aoao
Title: Redis-实现分布式锁

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/601476/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Ubuntu 安装 Docker 环境

    警告:切勿在没有配置 Docker APT 源的情况下直接使用 apt 命令安装 Docker. 准备工作 Docker 支持以下版本的 Ubuntu 操作系统: Ubuntu H…

    数据库 2023年6月14日
    086
  • JUC学习笔记(六)

    JUC 中提供了三种常用的辅助类,通过这些辅助类可以很好的解决线程数量过多时 Lock 锁的频繁操作。这三种辅助类为: CountDownLatch: 减少计数 CyclicBar…

    数据库 2023年6月6日
    097
  • 存储过程procedure、触发器trigger

    一、存储过程procedure MySQL 5.0 版本开始支持存储过程。 存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对…

    数据库 2023年6月9日
    083
  • innoDB对MVCC的实现

    InnoDB存储引擎在 RR 级别下通过 MVCC和 Next-key Lock 来解决幻读问题: 1、执行普通 select,此时会以 MVCC 快照读的方式读取数据 在快照读的…

    数据库 2023年6月16日
    088
  • 详谈 MySQL 8.0 原子 DDL 原理

    柯煜昌 青云科技研发顾问级工程师 目前从事 RadonDB 容器化研发,华中科技大学研究生毕业,有多年的数据库内核开发经验。 文章字数 3800+,阅读时间 15 分钟 背景 My…

    数据库 2023年6月11日
    0141
  • Docker安装Mysql

    1、在docker hub 上查看要下载的mysql镜像名称 dockerHub官网地址 在上方搜索栏里输入mysql 找到要拉取的镜像版本,在tag下找到版本 回到虚拟机界面,执…

    数据库 2023年6月16日
    087
  • 新的开始

    今天,我正式开始我的博客分享,java人加油 posted @2022-03-05 21:25 小小羊儿 阅读(10 ) 评论() 编辑 Original: https://www…

    数据库 2023年6月11日
    095
  • Mysql数据库存取原理及性能优化

    一、Mysql的系统架构图 二、Mysql存储引擎 Mysql中的数据是通过一定的方式存储在文件或者内存中的,任何方式都有不同的存储、查找和更新机制,这意味着选择不同的方式对于数据…

    数据库 2023年5月24日
    058
  • mysql使用存储过程批量给表加字段

    背景:在一个项目中,您需要将相同的字段添加到数百个表中,这很难手动添加,因此您计划使用存储过程来实现。 [En] Background: in a project, you nee…

    数据库 2023年5月24日
    0118
  • IDEA 常用插件

    插件使用参考:Idea插件系列 插件名称 说明 IDE Eval Reset 破解软件 Alibaba Java Coding Guidelines 阿里巴巴开发规范 tabnin…

    数据库 2023年6月6日
    087
  • 升级JDK8的坎坷之路

    为更好的适应JAVA技术的发展,使用更先进及前沿的技术。所以推出将我们现在使用的JDK1.6(1.7)及tomcat6(7)升级至JDK1.8及tomcat8,使我们的系统获得更好…

    数据库 2023年6月6日
    092
  • MySQL学习(2)—MySQL数据类型

    ps:此随笔基于mysql 5.7.*版本。 补充: UNSIGNED:所有整数类型都可以有一个可选(非标准)UNSIGNED属性。无符号类型可用于在列中仅允许非负数存在,或者当开…

    数据库 2023年6月14日
    082
  • SQL Server中STATISTICS IO物理读和逻辑读的误区

    SQL Server中STATISTICS IO物理读和逻辑读的误区 大家知道,SQL Server中可以利用下面命令查看某个语句读写IO的情况 SET STATISTICS IO…

    数据库 2023年6月9日
    076
  • MySQL之存储引擎、基本数据类型及约束条件

    一、存储引擎 数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,…

    数据库 2023年5月24日
    072
  • JUC学习笔记(五)

    创建线程的方法-一种是通过创建 Thread 类,另一种是通过使用 Runnable 创建线程。但是,Runnable 缺少的一项功能是,当线程终止时(即 run()完成时),我们…

    数据库 2023年6月6日
    0127
  • 查看PostgreSQL监听端口

    如何查看PostgreSQL的监听端口呢?下面总结一下查看PostgreSQL监听端口的方法。 方法1:netstat命令查看 或者sudo netstat -plunt |gre…

    数据库 2023年6月11日
    079
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球