百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

Redis实现的分布式锁服务红锁(RedLock)

mhr18 2024-10-22 12:36 19 浏览 0 评论

我们前面文章《分布式锁服务的思考》中已经提出来为什么要加锁,以及对什么资源加锁,大家最好先过去简单看一下。今天我们继续学习一下如何结合Redis实现一个分布式锁服务。我们先实现一个简单的分布式锁服务,然后分析单节点锁存在的问题,再由问题引入Redis的分布式锁服务红锁的设计。

目录:

  1. redis简单介绍

  2. 简单的分布式锁服务

  3. 可靠的分布式锁服务

  4. 代码示例

1. Redis简单介绍

Redis本身是内存数据库,适合用来对热点数据、瞬时数据(expire)、近似统计数据做存储,不小心丢失了部分数据也不要紧。例如我们用来统计每个IP的访问频率,用来做限流或者防止爬虫,同时也记录IP和对应的登录用户ID,防止恶意接口检测。同时Redis具有一个特征:结合Lua脚本可以实现原子性操作,我们可以利用Redis的这个特点,来实现一个锁服务。

2.使用Redis实现一个不可靠的分布式锁服务

主要的指令:

SET resource random_value NX PX 3000

该指令对key = resource的资源加过期时间为3000ms的锁,如果该资源已经被加锁了,说明key存在,本次加锁失败。

需要注意的是:设置的value在本资源锁的请求中一定是不可重复的,因为在锁释放的过程中需要key和value都对应了才可以删除的,防止删除了其他客户端加的锁。例如:A获得了锁,并承诺3秒内释放锁。可结果A执行了大于3秒,此时A的锁是被Redis被动释放的,锁释放后B获得了该资源锁,A终于执行完毕,然后删除key执行锁释放,会把B的锁误删的。因此释放锁需要结合key和value才行。

释放锁的Lua脚本如下:

我们使用Java代码结合上面的Lua脚本实现一个简单的锁,如下:

头条代码没格式化,贴图吧

思考:

既然单节点存在单点故障,我们添加一个slave可以吗?不可以,因为redis的主备是异步复制。

  1. 客户端A在master上获得锁,之后master在没有同步到slave就崩溃了。

  2. slave提升为master,客户端B在新的master上获得了A已经获得的资源锁。

非分布式或集群的系统本身就没有可靠性可言,所以上面我们讨论的锁在非分布式系统中可以应用良好。下面带大家认识下Redis的分布式锁服务——红锁。

3.利用Redis实现可靠的分布式锁服务——红锁

Redis把分布式锁的算法称之为红锁,Redis + Lock = RedLock。红锁需要N个(>=3)Redis独立节点,这些节点相互之间不需要有信息交流,保持独立即可。红锁基本的思路是:客户端在每个Redis实例上获得锁(就是上面讲过的指令),只要大多数实例上成功获得锁就算加锁成功。红锁的算法已经有很多实现版本,JAVA对应的实现版本是Redisson,我们可以在业务中直接引入并使用。虽然不需要我们自己去实现算法,但是有必要了解一下红锁的算法,下面我们描述一下客户端获得锁的流程:

  1. 客户端首先记录当前时间,用于后面计算总耗时。

  2. 客户端使用相同的key和随机value,从所有的Redis节点上获得锁。客户端在每个实例上设置锁的过程中,需要设超时时间(5-50ms),不成功就换下一个实例继续设置锁,用来防止客户端阻塞在一个down掉都实例上。

  3. 客户端需要计算获得锁的总耗时。客户端从至少N/2 + 1个节点上成功获得锁,且总耗时小于锁过期时间才能成功获得锁。

  4. 客户端获得锁之后,该锁的有效期不再是最初的过期时间,因为客户端要从多个节点上获得锁,需要去掉这些过程耗时。

  5. 如果客户端最终获得锁失败,必须在所有节点上执行锁释放。

以上算法保证了:

  • 锁互斥性,同一时间只能有一个锁

  • 不会死锁,使用锁过期时间。

  • 多节点容错,只要大多数节点获取了锁就可以认为成功获取锁。

4.Redisson实现的分布式锁

Redisson是基于Netty、Redis、JDK实现的更上层的应用工具,它提供了分布式对象和服务。Redisson命令的发送可以支持同步方式,异步方式,Redisson可以支持多种Redis的实际部署方式,例如:单节点、集群、主备、热备、哨兵、云服务。可参考下面官方的架构图:

我们使用Redisson的分布式锁服务,因为Redisson支持Redis的集群部署、热备部署、哨兵部署、主备部署多种方式,而今天我们重点不在Redis的部署,所以我们就简单部署3个独立的Redis节点就可以实验了。

使用编码的方式获得Redisson实例

通过3个实例,获得红锁

加锁和释放锁

我们通过上面的代码片段,简单写一个工具类:

贴图保格式

总结

  1. Redis的应用场景简介。这里大家先思考redis开发模式和规范,强调下,仅仅使用key->value是很恐怖的事情。

  2. 我们分析了单节点Redis的锁不可靠,引入了红锁算法。

  3. 带领大家认识了功能丰富的Redisson,我们仅介绍了红锁功能。

希望本文章能带给大家一点收获,能理解到锁的重要,保证业务一致性才是锁的使命。谢谢大家阅读,不足之处评论指出。

相关推荐

使用 Docker 部署 Java 项目(通俗易懂)

前言:搜索镜像的网站(推荐):DockerDocs1、下载与配置Docker1.1docker下载(这里使用的是Ubuntu,Centos命令可能有不同)以下命令,默认不是root用户操作,...

Spring Boot 3.3.5 + CRaC:从冷启动到秒级响应的架构实践与踩坑实录

去年,我们团队负责的电商订单系统因扩容需求需在10分钟内启动200个Pod实例。当运维组按下扩容按钮时,传统SpringBoot应用的冷启动耗时(平均8.7秒)直接导致流量洪峰期出现30%的请求超时...

《github精选系列》——SpringBoot 全家桶

1简单总结1SpringBoot全家桶简介2项目简介3子项目列表4环境5运行6后续计划7问题反馈gitee地址:https://gitee.com/yidao620/springbo...

Nacos简介—1.Nacos使用简介

大纲1.Nacos的在服务注册中心+配置中心中的应用2.Nacos2.x最新版本下载与目录结构3.Nacos2.x的数据库存储与日志存储4.Nacos2.x服务端的startup.sh启动脚...

spring-ai ollama小试牛刀

序本文主要展示下spring-aiollama的使用示例pom.xml<dependency><groupId>org.springframework.ai<...

SpringCloud系列——10Spring Cloud Gateway网关

学习目标Gateway是什么?它有什么作用?Gateway中的断言使用Gateway中的过滤器使用Gateway中的路由使用第1章网关1.1网关的概念简单来说,网关就是一个网络连接到另外一个网络的...

Spring Boot 自动装配原理剖析

前言在这瞬息万变的技术领域,比了解技术的使用方法更重要的是了解其原理及应用背景。以往我们使用SpringMVC来构建一个项目需要很多基础操作:添加很多jar,配置web.xml,配置Spr...

疯了!Spring 再官宣惊天大漏洞

Spring官宣高危漏洞大家好,我是栈长。前几天爆出来的Spring漏洞,刚修复完又来?今天愚人节来了,这是和大家开玩笑吗?不是的,我也是猝不及防!这个玩笑也开的太大了!!你之前看到的这个漏洞已...

「架构师必备」基于SpringCloud的SaaS型微服务脚手架

简介基于SpringCloud(Hoxton.SR1)+SpringBoot(2.2.4.RELEASE)的SaaS型微服务脚手架,具备用户管理、资源权限管理、网关统一鉴权、Xss防跨站攻击、...

SpringCloud分布式框架&amp;分布式事务&amp;分布式锁

总结本文承接上一篇SpringCloud分布式框架实践之后,进一步实践分布式事务与分布式锁,其中分布式事务主要是基于Seata的AT模式进行强一致性,基于RocketMQ事务消息进行最终一致性,分布式...

SpringBoot全家桶:23篇博客加23个可运行项目让你对它了如指掌

SpringBoot现在已经成为Java开发领域的一颗璀璨明珠,它本身是包容万象的,可以跟各种技术集成。本项目对目前Web开发中常用的各个技术,通过和SpringBoot的集成,并且对各种技术通...

开发好物推荐12之分布式锁redisson-sb

前言springboot开发现在基本都是分布式环境,分布式环境下分布式锁的使用必不可少,主流分布式锁主要包括数据库锁,redis锁,还有zookepper实现的分布式锁,其中最实用的还是Redis分...

拥抱Kubernetes,再见了Spring Cloud

相信很多开发者在熟悉微服务工作后,才发现:以为用SpringCloud已经成功打造了微服务架构帝国,殊不知引入了k8s后,却和CloudNative的生态发展脱轨。从2013年的...

Zabbix/J监控框架和Spring框架的整合方法

Zabbix/J是一个Java版本的系统监控框架,它可以完美地兼容于Zabbix监控系统,使得开发、运维等技术人员能够对整个业务系统的基础设施、应用软件/中间件和业务逻辑进行全方位的分层监控。Spri...

SpringBoot+JWT+Shiro+Mybatis实现Restful快速开发后端脚手架

作者:lywJee来源:cnblogs.com/lywJ/p/11252064.html一、背景前后端分离已经成为互联网项目开发标准,它会为以后的大型分布式架构打下基础。SpringBoot使编码配置...

取消回复欢迎 发表评论: