首页 > 数据库 >Redis分布式锁

Redis分布式锁

时间:2024-09-09 13:51:27浏览次数:13  
标签:加锁 Redis 解锁 redis key 服务器 执行 分布式

线程安全->锁,多线程并发执行的时候,执行先后的顺序,不确定,随机性->需要保证程序在任意执行顺序下,执行逻辑都是ok的,之前学过的锁,mutex,synchronized本质上只能在一个进程内部生效,分布式系统中,是有很多进程的(每个服务器,都是独立的进程)

因此,之前的锁,就难以对现在的分布式系统中的多个进程之间产生制约,因此,分布式系统中,多个进程之间的执行顺序也是不确定的,引入分布式锁解决上述问题。

买票服务器,再进行买票操作过程中,就需要先加锁(往redis上设置一个特殊的key-value

完成上述操作,再把这个key-value删除掉)

其他服务器也想买票,也去redis上尝试设置key-value,如果发现了key-value已经存在,就认为加锁失败(放弃/阻塞,就看具体的实现策略了)就可以保证第一个服务器执行"查询->更新"过程中,第二个服务器不会执行查询,也就解决了上述超卖的问题。)

当然你用mysql事务也可以,但是分布式系统中,要共享的不一定是mysql又可能是其他存储介质(数据库)可能没有事务这个操作。

setnx -不存在就设置,存在就出错

解锁,del命令来完成

极端情况,某个服务器加锁成功,然后后续逻辑的过程中,程序崩了,没有解锁(JAVA中是为了保证解锁能够执行到,把解锁放到finally里面)->分布式系统中无效,进程内部才有效,又可以服务器掉电,无法执行finally,或者进程异常终止,这样的情况,导致redis设置的key,无人删除,导致其他服务器无法获取到这个锁

由此我们引入了过期时间,可以给set的keys设置过期时间的,一旦时间到,key就会被自动删除掉,set ex nx 比如设置key的过期时间为1000ms,意味着即使出现极端情况,某个服务器挂了,没有正确释放锁,这个锁最多保存1000ms,也就会自动释放了

setnx

expire这样分着设置可以吗? 注意⚠️这样设置不可以,redis无法保证原子性,不如一条命令稳妥

所谓的加锁:就是给redis上设置一个key-value

所谓的解锁,就是给redis上这个key-value删除掉

是否会出现,服务器1执行加锁,服务器2执行了解锁?

为了解决上述问题-引入校验机制

1.给服务器编号,每个服务器有自己的身份标识

2.进行加锁的时候,设置key-value-key对应着要对哪个资源加锁(比如车次),value就可以存储刚才服务器的编号,标识出当前这个锁是哪个服务器加上的

后续解锁的时候,就可以进行校验了,先查询一下这个锁对应的服务器编号,然后判定一下这个编号是否就是当前执行解锁的服务器编号,如果是,才真正执行del,如果不是就失败,服务器这边要完成的逻辑,通过上述校验,就可以有效避免误解锁,

在解锁的时候,先查询判定,再进行del->此处是两个操作,可能会出现问题,一个服务器内部,也可能是多线程的,可能同一个服务器,两个线程都在执行上述解锁操作(他是不针对某某,指定某某解锁,而是单纯的解锁,一定解开一个)。

实现中,更好的方案:lua脚本

lua是一个编程语言,作为redis内嵌的脚本,lua语言特别轻量,占用的体积小,可以使用lu a编写一定逻辑,把这个脚本上传到redis服务器上然后就可以让客户端来执行redis上述脚本了,(redis明确说明lua就是事务的替代方案)

过期时间的续约问题:加锁时候给key设置过期时间,那么设置多少合适呢?

时间短:业务逻辑没有执行完,就释放锁了,设置的不长,锁释放不及时的问题

更好的方式"动态续约"->往往也需要服务器有一个专门的线程,负责续约这个事情(看门狗

标签:加锁,Redis,解锁,redis,key,服务器,执行,分布式
From: https://blog.csdn.net/weixin_72953218/article/details/138707199

相关文章

  • 【Redis】redis5种数据类型(哈希)
    目录基本介绍命令HSETHGETHEXISTSHKEYSHVALSHGETALLHMGETHLENHSETNXHINCRBYHINCRBYFLOATHSTRLEN内部编码原生字符串类型、哈希类型、序列化字符串json作缓存的区别基本介绍哈希类型中的映射关系是field-value,用于区分redis整体的键值对(key-value)命令H......
  • 2025秋招NLP算法面试真题(十九)-大模型分布式训练题目
    分布式训练题目1.理论篇1.1训练大语言模型存在问题?计算资源需求**:**训练大型语言模型需要大量的计算资源,包括高端GPU、大量的内存和高速存储器。这可能限制了许多研究人员和组织的训练能力,因为这些资源通常很昂贵。数据需求**:**训练大型语言模型需要大规模的数......
  • Redis缓存和Mysql数据一致性问题
            在高并发环境下,保持Redis缓存和MySQL数据库的数据一致性是一个复杂但至关重要的任务。下面是对这一问题的详细讲解,并结合PHP代码示例来展示如何解决这些一致性问题。问题背景Redis缓存和MySQL数据库的主要挑战在于:缓存和数据库之间的延迟:在缓存更......
  • Redis分布式锁查看机制与实现解析
    分布式系统中,锁的使用是保证资源一致性与并发控制的重要手段。Redis作为一个高效的内存存储工具,通过其简单的命令操作和快速响应机制,被广泛用于实现分布式锁。本文将深入探讨Redis中查看分布式锁的机制,包括如何查询锁的状态、使用何种命令进行锁操作,以及如何确保锁的有效性和正确性......
  • redis入门
    redis入门Nosql与sqlNosql是什么NoSQL,指的是非关系型的数据库。NoSQL有时也称作NotOnlySQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。sql是什么sql指的是关系型数据库。关系型数据库要满足4大特征,也就是我们常提的ACID原则(A原子性、C一致性、I独立性、D......
  • redis订阅者和进阶
    Redis进阶redis订阅者模式简介redis存在订阅者模式。就像是一个广播系统。存在三种角色:订阅者、发布者、频道。在redis当中,它们表示为subscriber(订阅者)、publisher(发布者)、channel(频道)其中的行为大抵是:订阅者订阅频道-->发布者针对于特定频道发布信息-->特定订阅者......
  • redis主从备份
    redis主从备份主从复制介绍redis主从复制原理:从服务器向主服务器发送SYNC命令。接到SYNC命令的主服务器会调用BGSAVE命令,创建一个RDB文件,并使用缓冲区记录接下来执行的所有写命令。当主服务器执行完BGSAVE命令时,它会向从服务器发送RDB文件,而从服务器则会接收并载......
  • redis集群
    redis集群配置为什么要使用集群redis官方生成可以达到10万/每秒,每秒执行10万条命令,假如业务需要每秒100万的命令执行呢。该怎么处理呢一台服务器内存正常是16~256G,假如你的业务需要500G内存,又该如何解决集群的核心思想是将数据分片(sharding)储存于多个redis实例当中。集群......
  • Rest 构建分布式微服务架构
    开发环境要求jdk1.8(SpringBoot推荐jdk1.8及以上):javaversion"1.8.0_151"Maven3.x(maven3.2以上版本):ApacheMaven3.3.9IntelliJIDEA:IntelliJIDEA2018.2.1x64SpringBoot:SpringBoot2.0.7SpringCloud使用当前最新稳......
  • Redis 分布式锁:实现与应用
    在分布式系统中,为了保证数据的一致性和并发控制,常常需要使用分布式锁。Redis作为一种高性能的内存数据库,提供了一些特性可以方便地实现分布式锁。今天,我们就来探讨一下如何用Redis实现分布式锁。一、分布式锁的基本概念分布式锁是一种用于在分布式系统中协调多个进程或线程对......