首页
首页 教程 派聪明
  • 首页
  • 教程
  • 派聪明
  • 登录
登录技术派畅享更多权益

用户名密码登录

其他登录:
icon_GitHubCreated with sketchtool.
绑定星球,畅享VIP服务

微信扫码/长按识别登录

输入验证码
有效期五分钟 👉 手动刷新

登录即同意 用户协议 和 隐私政策

绑定二哥编程星球,畅享 VIP 尊享服务!

戳我了解如何获取星球编号,新窗口打开

添加二哥微信 itwanger 审核更快

记得备注 星球编号
我会根据星球编号进行审核
1
如何学习技术派?
更新时间: 2023年11月28日
星球
2
技术派的架构设计是什么样的?
更新时间: 2023年03月22日
星球
3
如何整合本地缓存 Caffeine?
更新时间: 2023年03月15日
星球
4
整合 RabbitMQ
更新时间: 2023年05月15日
星球
5
给 RabbitMQ 添加连接池
更新时间: 2023年05月23日
星球
6
如何保证缓存一致性?
更新时间: 2023年05月15日
星球
7
如何实现在线人数统计?
更新时间: 2023年03月25日
星球
8
MySQL同步ES
更新时间: 2023年06月09日
星球
9
redis实现活跃排行榜
更新时间: 2023年08月21日
星球
10
实例演示如何实现性能优化
更新时间: 2023年08月30日
星球
11
十二种性能优化方案实战
更新时间: 2023年11月21日
星球
12
配置 SSL 证书
更新时间: 2023年11月21日
星球
13
ngrok内网穿透访问本地服务
更新时间: 2023年12月01日
星球
14
上传图片至 OSS
更新时间: 2023年12月04日
星球
15
如何渲染 markdown
更新时间: 2023年12月20日
星球
16
如何将技术派写到简历上?
更新时间: 2023年11月10日
星球
17
技术派的 Redis 分布式锁
更新时间: 2024年10月22日
星球
18
Linux 一键源码部署技术派
更新时间: 2024年11月12日
星球
19
如何接入微信支付?
更新时间: 2024年12月11日
星球
20
整合FastExcel导出500万条数据
更新时间: 2024年12月19日
星球
21
接入 deepseek API
更新时间: 2025年02月07日
星球
关注公众号
原创
四种方法实现 Redis 分布式锁,图文并茂来解释清楚

1、前言

1.1、本地锁和分布式锁区别

锁我想对大家都不陌生,在我们刚学习 Java 的时候,肯定知道synchronized和Lock锁;这两者都是本地锁。

何为本地锁呢?本地锁就是该锁只针对当前节点有效,也就是当 node A 获取锁时,那么 node B 同样还可以获取锁,这种情况就是本地锁。

如果服务只部署了一个节点的话,用这种本地锁是没有问题的。

现现在很多系统为了抗高并发、高可用和高性能,会部署多节点(集群部署),那么此时如果还用本地锁的话就会出现问题,因此分布式锁就诞生了。

分布式锁就是当有一个节点获取到锁后,其它节点是不可以获取锁的。

1.2、Redis 分布式锁和 Zookeeper 分布式锁区别

谈起分布式集群,就绕不开CAP理论,也就是强一致性、可用性和分区容错性。三者只能选其二,不可兼容。这里我就不具体分析其原因之类了,直接步入两把分布式锁区别。

Redis分布式锁:它追求的高可用性和分区容错性。Redis 在追求高可用性时会在 Redis 写入主节点数据后,立即返回成功,不关心异步主节点同步从节点数据是否成功。Redis 是基于内存的,性能极高,官方给的指标是每秒可达到 10W 的吞吐量。

Zookeeper分布式锁:它追求的是强一致性和分区容错性。Zookeeper 在写入主节点数据后会等到从节点同步完数据成后才会返回成功。为了数据的强一致性牺牲了一部分可用性。

两者综合对比下来,技术派为了追求用户体验度,就采用了 Redis 分布式锁来实现。

2、使用 Redis 分布式锁背景

技术派使用 Redis 分布式锁的背景是,用户根据 articleId 查询文章详情,查询出结果后返回。

查询文章详情流程图如下所示:

如果并发量不是特别高的情况下没有问题,但就怕并发量高;会出现什么问题呢?什么时候出现呢?

当缓存中没有数据,需要到 MySQL 中查询这一步。

问题出现点如下所示:

因为当高并发时,如果查询缓存中没有数据,大量的用户会同时去访问 DB 层 MySQL,MySQL 的资源是非常珍贵的,并且性能没有 Redis 好,很容易将我们的 MySQL 打宕机,进而影响整个服务。

针对这种问题,该怎么解决呢?

当大量用户同时访问同一篇文章时,只允许一个用户去 MySQL 中获取数据。由于服务是集群化部署,就需要用到 Redis 分布式锁。

逻辑如下所示:

采用加锁的方式就能很好地保护 DB 层数据库,进而保证系统的高可用性。

3、Redis 分布式锁几种实现方式

其实可以直接给大家讲最终的实现方式,这样我也比较省事;但是心里总感觉少点什么,所以接下来我就用几种方式由简到繁一点一点的推出最佳的实现方式。

3.1、Redis 实现分布式锁

代码如下图所示:

3.1.1、第一种 setIfAbsent(key,value,time)

redisTemplate.opsForValue().setIfAbsent(key, value, time, TimeUnit.SECONDS)对应的 Redis 命令是set key value EX time NX。

set key value EX time NX是一个复合操作,setNx + setEx,底层采用的是 lua 脚本来保证其原子性,要么全部成功,否则加锁失败。

redisTemplate.opsForValue().setIfAbsent(key, value, time, TimeUnit.SECONDS)含义就是:如果key不存在则加锁成功,返回true;否则加锁失败,返回false。

第一种加锁逻辑如下图所示:

主要逻辑就是:当缓存中没有数据时,开始加锁,加锁成功则允许访问数据库,加锁失败则自旋重新访问。

主要代码如下所示:

/**
 * Redis分布式锁第一种方法
 *
 * @param articleI

已加入二哥编程星球,即刻绑定星球编号解锁🔐

该文档仅「二哥编程星球」的VIP用户可见

二哥的编程星球内容包括:

1. 付费文档: 技术派、MYDB 等项目配套的 120+篇教程查看权限

2. 面试指南: 校招、社招的 40 万+字面试求职攻略

3. 智能助手: 无限期使用派聪明 AI 助手,已对接讯飞星火和 ChatGPT双通道,不用花 1 分钱

4. 专属问答: 向二哥 1v1 发起提问,内容不限于 offer 选择、学习路线、职业规划等

5. 简历修改: 提供简历修改服务,附赠星球 100+优质简历模板可供参考

6. 学习环境: 打造一个沉浸式的学习环境,有一种高考冲刺、大学考研的氛围


二哥的星球

》步骤①:微信扫描上方二维码,点击「加入知识星球」按钮

》步骤②:访问星球置顶帖球友必看: https://t.zsxq.com/11rEo9Pdu,获取项目配套文档的语雀访问地址和密码

已加入星球,绑定星球编号
删除提醒

确定删除《四种方法实现 Redis 分布式锁,图文并茂来解释清楚》吗

5人已点赞

回复