首页 > 数据库 >redis实现分布式锁

redis实现分布式锁

时间:2023-04-24 10:11:06浏览次数:31  
标签:加锁 实现 Redis redis 实例 操作 分布式 客户端

分布式锁是由共享存储系统维护的变量,多个客户端可以向共享存储系统发送命令进行加锁或释放锁操作。Redis 作为一个共享存储系统,可以用来实现分布式锁。

在基于单个 Redis 实例实现分布式锁时,对于加锁操作,我们需要满足三个条件。
1.加锁包括了读取锁变量、检查锁变量值和设置锁变量值三个操作,但需要以原子操作的方式完成,所以,我们使用 SET 命令带上 NX 选项来实现加锁;
2.锁变量需要设置过期时间,以免客户端拿到锁后发生异常,导致锁一直无法释放,所以,我们在 SET 命令执行时加上 EX/PX 选项,设置其过期时间;
3.锁变量的值需要能区分来自不同客户端的加锁操作,以免在释放锁时,出现误释放操作,所以,我们使用 SET 命令设置锁变量值时,每个客户端设置的值是一个唯一值,用于标识客户端。

和加锁类似,释放锁也包含了读取锁变量值、判断锁变量值和删除锁变量三个操作,不过,我们无法使用单个命令来实现,所以,我们可以采用 Lua 脚本执行释放锁操作,通过 Redis 原子性地执行 Lua 脚本,来保证释放锁操作的原子性。

不过,基于单个 Redis 实例实现分布式锁时,会面临实例异常或崩溃的情况,这会导致实例无法提供锁操作,正因为此,Redis 也提供了 Redlock 算法,用来实现基于多个实例的分布式锁。这样一来,锁变量由多个实例维护,即使有实例发生了故障,锁变量仍然是存在的,客户端还是可以完成锁操作。Redlock 算法是实现高可靠分布式锁的一种有效解决方案,你可以在实际应用中把它用起来。

标签:加锁,实现,Redis,redis,实例,操作,分布式,客户端
From: https://www.cnblogs.com/yangyixin/p/17348578.html

相关文章

  • Hystrix 如何在不引入 Archaius 的前提下实现动态配置更新
    Hystrix简介Hystrix是Netflix开源的一个限流熔断降级组件,防止依赖服务发生错误后,将调用方的服务拖垮。这里对Hystrix本身不做过多介绍。Hystrix目前处于维护状态(不再更新),但是还有大量项目对它进行了使用,因此仍然非常重要。基本用法在Hystrix中,HystrixCommand是非常......
  • .net使用nacos配置,手把手教你分布式配置中心
    .net使用nacos配置,手把手教你分布式配置中心Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。这么优秀的分布式服务管理平台,怎么能不接入呢?nacos的安装和使用这里就不细说了,可以参考网上教程和官方文档。https://nacos.io/zh-cn/docs/quick-start.htm......
  • 吃透Redis面试八股文
    Redis连环40问,绝对够全!Redis是什么?Redis(RemoteDictionaryServer)是一个使用C语言编写的,高性能非关系型的键值对数据库。与传统数据库不同的是,Redis的数据是存在内存中的,所以读写速度非常快,被广泛应用于缓存方向。Redis可以将数据写入磁盘中,保证了数据的安全不丢失,而且Redis......
  • .NET CORE开源 DDD微服务 支持 多租户 单点登录 多级缓存、自动任务、分布式、日志、
    源代码地址https://github.com/junkai-li/NetCoreKevin基于NET6搭建跨平台DDD思想WebApi架构、IDS4单点登录、多缓存、自动任务、分布式、多租户、日志、授权和鉴权、CAP、SignalR、docker部署 如需简约项目可直接去除项目引用解耦设计都可以单独引用架构默认全部引用并启动......
  • 13、c++使用单例模式实现命名空间函数
    本案例实现一个test命名空间,此命名空间内有两个函数,分别为getName()和getNameSpace();声明命名空间及函数namespacetest{conststd::string&getName()和();conststd::string&getNameSpace();}命名空间内实现单例类实现一个单例类,构造函数要为private,自身对......
  • A stop job is running for LSB:start and stop redis_6379
     修改/etc/init.d/redis_6379(stop下红框中内容,格式:$CLIEXEC-a"password" -p$REDISPORTshutdown)  ......
  • [ Docker ] 部署 nps 和 npc 实现内网穿透
    https://www.cnblogs.com/yeungchie/云主机上运行nps创建映射目录mkdir-p~/docker/nps/config拉取镜像dockerpulloldiy/nps-server运行容器创建容器dockerrun-d--namenps--net=host-v/root/docker/nps/config:/nps/confoldiy/nps-server现在nps已经开......
  • 4月23日AVL树的插入实现
    在计算机的使用中查找是个很重要的算法,但是一般的简单查找算法效率都不高,其中比较显著的方法是二分查找,但是二分查找的局限性很大,他只能在有序的数组中进行查找,所以想要用二分查找就必须先要对查找的数据进行排序,但是排序的时间复杂度又是一个问题。所以就提出了用树形的储存方式......
  • Golang实现TCP端口扫描器
    简易版packagemainfuncworker(ports,resultschanint){forp:=rangeports{address:=fmt.Sprintf("bilibili.com:%d",p)conn,err:=net.Dial("tcp",address)iferr!=nil{result<-0conti......
  • redis之哈希类型-列表类型-集合类型-有序集合-慢查询-pipeline-发布订阅-Bitmap位图-H
    目录redis之哈希类型-列表类型-集合类型-有序集合-慢查询-pipeline-发布订阅-Bitmap位图-HyperLogLog-GEO地理位置昨日内容回顾今日内容详细1哈希类型2列表类型3集合类型4有序集合5慢查询6pipeline与事务7发布订阅8Bitmap位图9HyperLogLog10GEO地理位置redis之哈希类型......