Redis分布式锁到底安全吗?

article/2025/9/14 8:12:12

ee7a0df96b7464bb4bc97f3059125cd4.png

若有收获,请记得分享和转发哦

这篇文章我想和你聊一聊,关于 Redis 分布式锁的「安全性」问题。

Redis 分布式锁的话题,很多文章已经写烂了,我为什么还要写这篇文章呢?

因为我发现网上 99% 的文章,并没有把这个问题真正讲清楚。导致很多读者看了很多文章,依旧云里雾里。例如下面这些问题,你能清晰地回答上来吗?

  • 基于 Redis 如何实现一个分布式锁?

  • Redis 分布式锁真的安全吗?

  • Redis 的 Redlock 有什么问题?一定安全吗?

  • 业界争论 Redlock,到底在争论什么?哪种观点是对的?

  • 分布式锁到底用 Redis 还是 Zookeeper?

  • 实现一个有「容错性」的分布式锁,都需要考虑哪些问题?

这篇文章,我就来把这些问题彻底讲清楚。

读完这篇文章,你不仅可以彻底了解分布式锁,还会对「分布式系统」有更加深刻的理解。

文章有点长,但干货很多,希望你可以耐心读完。

13be27de44c6573ee43c0cc0aa4599bb.png

为什么需要分布式锁?

在开始讲分布式锁之前,有必要简单介绍一下,为什么需要分布式锁?

与分布式锁相对应的是「单机锁」,我们在写多线程程序时,避免同时操作一个共享变量产生数据问题,通常会使用一把锁来「互斥」,以保证共享变量的正确性,其使用范围是在「同一个进程」中。

如果换做是多个进程,需要同时操作一个共享资源,如何互斥呢?

例如,现在的业务应用通常都是微服务架构,这也意味着一个应用会部署多个进程,那这多个进程如果需要修改 MySQL 中的同一行记录时,为了避免操作乱序导致数据错误,此时,我们就需要引入「分布式锁」来解决这个问题了。

78bf4c2571fa7133c47bbd7fd07c26cd.png

96cbe791b3f165ebdf516dc2a21589cd.png

405b3d3292102eabce21af9a93bff7dc.png

385cc2e5ebdb8fbb352a7fda58a63d1e.png

dc3a4255d09b4d3209fc2f688c8cfd74.png

b7e332dde39e279e2e84244b31b69c66.png

7fbf830924a97512a7c4049e6eda26ff.png

de8bdcbc769690052c5edba4717980ef.png

22297cfe41bf50404244841e584bb640.png

7b47aefcf23ec14838e0bbf74e6bf706.png

e19a7a6d2f956cf76f8e65bd42980a2c.png

b6a8b4567b95886a485fa31cd1b9a470.png

dbdd64927313ad1ea0080a0751804382.png

2c7975b2823a3d796d79fd7e7616b6a9.png

4f3668c5a1d0520603bd2408e911c74f.png

fb292804c571c9bc40f4a5026f2f53ab.png

b2585bdc4696f14ee1fb71a682ccd2ca.png

8de61b0021575a6a95cea35921053b0c.png

a1b7fac0f53c7095dbfb40bfeb7e38b0.png

e2713f401c28cce01b648cf8435c03dd.png

1c65aa6d3cd63be9a8469d6ea9259b64.png

42bf48ef1923e06e72ff69fe3ae6f99d.png

de45392fea9223b2a531719a97c5865c.png

db352c6073fdad515e4199eb33cc5820.png

92addb743863e41e63023bc2e4fda1e9.png

34833fe2afdccf539f9b2aeb8d7563ee.png

280421531342cf804c92feb78d42c973.png

22011c15de1f792462ceeba0ebd99e9d.png

b3eeeb468f37a5078d7c7b66f2ef56ce.png

ace512994141454d0e0a7656d93ec9c3.png

feec60b6035d7840b5d7ed78a35e5960.png

728416b94ef2fb711e7cc788a08e9f70.png

08e32b5a898f0c44528c50495f81ad17.png

aff58daa94982e98fe0972c24e1392d0.png

7077973bcdddda2a0f0c8823a248f151.png

c73390abd99a5a3afd1d446b32b8cff9.png

84971a398355d15403bdf34f01074a7e.png

cd64bee9e2e206d46197783021f2467b.png

001569de6d40c39a79151e14641d89ba.png

b9f65832a8331e1e6068d9ad0a3fcffb.png

c79cb927a43abe3119263f381ae2f367.png

b30a0b2da6cf9ac79872abb7867483aa.png


http://chatgpt.dhexx.cn/article/MeHDXRxS.shtml

相关文章

Java线程安全

前段时间有测试一个后端对账单和话单采集服务,在测试过程中有涉及到数据库读写逻辑和并发的场景,所以结合经验针对系统技术架构设计了部分并发场景结合数据库读写时可能出现的一些问题的用例,也确实出现了一些测试环境容易忽视,线上环境确确实实可能出现的问题,当然最后还是得到…

线程安全之 - ThreadLocal

ThreadLocal的底层原理 ThreadLocal是Java中所提供的线程本地存储机制(线程内共享),可以利⽤该机制将数据缓存在某个线程内部, 该线程可以在任意时刻、任意⽅法中获取缓存的数据;ThreadLocal底层是通过ThreadLocalMap…

线程锁(ReentrantLock、synchronized)为何不能用作分布式锁

为什么使用分布式锁 分布式锁实现目前有三种: 数据库乐观锁;ZooKeeper的分布式锁;Redis的分布式锁; 在以前单体架构Web应用场景下,我们可以使用ReentrantLock或synchronized进行上锁,保证资源安全,现如今大…

Redis分布式锁真的安全吗?

大家好,今天我们来聊一聊Redis分布式锁。 首先大家可以先思考一个简单的问题,为什么要使用分布式锁?普通的jvm锁为什么不可以? 这个时候,大家肯定会吧啦吧啦想到一堆,例如java应用属于进程级,…

ThreadLocal能解决线程安全问题?胡扯!本文教你正确的使用姿势【享学Java】

跟对领导很重要:愿意教你的,并且放手让你做的领导要珍惜。 目录 前言正文ThreadLocal是什么?ThreadLocal怎么用?局限性InheritableThreadLocal向子线程传递数据开源框架使用示例 ThreadLocal不能解决共享变量的线程安全问题Thread…

Java线程安全详细总结

以下是我的PPT文档,不知道怎么复制到博客,只能一个一个插入图片发上来了。感觉总结的不错,分享一下。 文档地址:http://download.csdn.net/detail/csujiangyu/9526641

分布式系统详解--基础知识(线程)

分布式系统详解--基础知识(线程) 一、导读 前面跟大家讲了一下 分布式系统详解--基础知识(概论) ,可以稍微了解一下大体上分布式是怎么一回事了。这片篇文章主要是讲述一下线程的问题分别介绍一下,什么线…

分布式项目线程安全问题(电商扣减库存的安全问题1)

电商减库存存在的安全问题 Override public void deductStock(Map<Long, Integer> skuMap) {for (Map.Entry<Long, Integer> entry : skuMap.entrySet()) {Long skuId entry.getKey();Integer num entry.getValue();// 查询skuSku sku getById(skuId);// 判断…

分布式项目中 如何保证线程安全问题?-------ZooKeeper

前沿&#xff1a; 上篇文章我们聊到了在解决分布式项目中线程安全问题&#xff0c;提到解决方案还有其他的&#xff0c;那么在此提出 基于 zookeeper 解决分布式项目中的线程安全问题 也是目前市面上比较流行的。做为一个高级开发工程师也是必须要学习的。 ZooKeeper是什么东…

分布式线程安全(redis、zookeeper、数据库)

https://blog.csdn.net/u010963948/article/details/79006572 Q:一个业务服务器&#xff0c;一个数据库&#xff0c;操作&#xff1a;查询用户当前余额&#xff0c;扣除当前余额的3%作为手续费 synchronized lock db lock Q&#xff1a;两个业务服务器&#xff0c;一个数据库&…

分布式集群中如何保证线程安全?

目录 分布式集群中的线程安全问题 解决方法 串行化 分布式锁 Redis如何实现呢&#xff1f; 问题&#xff1a;setnx刚好获取到锁&#xff0c;业务逻辑出现异常&#xff0c;导致锁无法释放 问题&#xff1a;可能会释放其他服务器的锁。 问题&#xff1a;删除操作缺乏原子…

java outlook 发送邮件_基于java使用JavaMail发送邮件

一、邮件的相关概念 邮件协议。主要包括&#xff1a; SMTP协议&#xff1a;Simple Mail Transfer Protocol&#xff0c;即简单邮件传输协议&#xff0c;用于发送电子邮件 POP3协议&#xff1a;Post Office Protocol 3&#xff0c;即邮局协议的第三个版本&#xff0c;用于接收邮…

java 发邮件(有正文,有图片,有附件)

一 需求: 1 java实现邮件发送 2 发送内容: ① 正文: 图片说明和图片 ② 附件一: 图片作为附件发送 ③ 附件二: Excel表格 二 思路: 1首先创建一个 Java 工程&#xff0c;把下载好的 javax.mail.jar 作为类库加入工程 2邮件创建步骤: 配置连接邮件服务器的参数( 邮件服务器SM…

java接收邮件_Java实现邮件收发

一. 准备工作 1. 传输协议 SMTP协议-->发送邮件: 我们通常把处理用户smtp请求(邮件发送请求)的服务器称之为SMTP服务器(邮件发送服务器) POP3协议-->接收邮件: 我们通常把处理用户pop3请求(邮件接收请求)的服务器称之为POP3服务器(邮件接收服务器) 2. 邮件收发原理 闪电…

java发送邮件工具类

1. 普通java实现邮件发送 1.1 创建maven项目&#xff0c;配置pom.xml文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance&qu…

java发送邮件带附件

一、 开启SMTP服务 1.基本都在邮箱设置里&#xff0c;开启后会获得神秘代码&#xff0c;后面有用。 2.记得添加依赖&#xff0c;或者自己添加jar包。 <dependency><groupId>javax.mail</groupId><artifactId>mail</artifactId><version>…

java 邮件模板

邮件发送代码可参照 java 发送邮件 1.情形 邮件发送代码可参照上述&#xff0c;本例只说明如果读取模板文件。公司定义模板较为复杂的情况&#xff0c;可采用此类发送方式 2. 模板 2.1 resource 建立模板 2.2 ftl 模板如下 <p>您好&#xff0c;${name}&#xff0c;您…

使用JAVA实现邮件发送功能

一、准备工作 小编今天以 QQ邮箱 进行演示操作。 想要使用代码操作邮箱发送邮件&#xff0c;需要在邮箱设置中申请开通 POP3/SMTP 服务。 接下来跟着小编的图文一步一步的操作开通吧&#xff01; 1.1 登录网页QQ邮箱&#xff0c;点击页面顶部设置按钮。 1.2 点击后会打开邮箱…

java发送qq邮件

1.登录qq邮箱 1&#xff09;点击设置 2&#xff09;点击账户 3&#xff09;开启第一个服务&#xff0c;我已经开过了 4&#xff09;开启验证&#xff08;让你发送指定内容到某个号码&#xff09;&#xff0c;完成后点击我已发送&#xff0c;就会出现授权码&#xff0c;授权码很…

java实现邮件发送

一.第一步:导入两个jar包。 activation.jar 和 mail.jar, 一定要添加到构建路径(不然找不到包) 两个用于Java发送邮件的jar包-Java文档类资源-CSDN下载 二、创建邮箱工具类:Mail.java import java.util.*; import java.io.*; import javax.mail.*; import javax.m…