Redis 如何实现分布式锁?

锁是多线程编程中的一个重要概念,它是保证多线程并发时顺利执行的关键。我们通常所说的“锁”是指程序中的锁,也就是单机锁,例如 Java 中的 Lock 和 ReadWriteLock 等,而所谓的分布式锁是指可以使用在多机集群环境中的锁。

我们本文的面试题是,使用 Redis 如何实现分布式锁?

## 典型回答

首先来说 Redis 作为一个独立的三方系统(通常被作为缓存中间件使用),其天生的优势就是可以作为一个分布式系统来使用,因此使用 Redis 实现的锁都是分布式锁,理解了这个概念才能看懂本文所说的内容。

分布式锁的示意图,如下所示: image.png

使用 Redis 实现分布式锁可以通过以下两种手段来实现:

  • 使用 incr 方式实现;
  • 使用 setnx 方式实现。

有人可能会奇怪 incr 不是用来实现数值 +1 操作的吗?用它怎么来实现分布式锁呢?

我们下来看 incr 的使用示例:

127.0.0.1:6379> set key 1 # 新增一个键值
OK
127.0.0.1:6379> incr key # 执行加 1 操作
(integer) 2
127.0.0.1:6379> get key # 查询键值
"2"

从以上代码可以看出使用 incr 可以实现数值 +1,那怎么用它来实现分布式锁呢?

其实原理也很简单,我们每次的加锁(上锁)都使用 incr 命令,如果执行的结果为 1 的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/545310.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

scala 函数中嵌套函数_如何在Scala中将函数转换为部分函数?

scala 函数中嵌套函数First, lets see what is a function and a partial function, and then we will see their conversion process. 首先,让我们看看什么是函数和部分函数,​​然后看它们的转换过程。 Function in Scala is a block of code that i…

英语笔记:台词

Memories are too important. 记忆弥足珍贵。 You won’t be sad forever, Elena. 悲伤不会相伴一生,艾琳娜。 When you lose someone it stays with you. 当你失去了某个人,那种感觉如影随行。 Always reminding you of how easy it is toget hurt. …

第二章关系数据库

第二章关系数据库2.1 关系模型概述(略)2.2 关系操作2.2.1_基本关系操作2.2.2_关系数据库语言的分类2.3 关系的完整性2.3.1_关系的三类完整性约束2.3.2_实体完整性2.3.3_参照完整性2.3.4_用户定义的完整性2.4 关系代数2.4.1_传统的集合运算2.4.2_专门的关…

线程----Monitor(互斥锁)类设置超时值

Monitor类与Lock语句相比,Monitor类的主要优点是:可以添加一个等待被锁定的超时值。缺点:开销非常大using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.T…

常用的 Redis 优化手段有哪些?

每个软件的常规操作有两种,一种是使用,另一种就是调优,对于 Redis 来说也是一样。关于 Redis 调优的问题一般会出现在 Redis 面试的后期,以此来考察面试者对于 Redis 的实际应用掌握,以及对于 Redis 高性能的追求与理解,因此本文就来重点的聊一聊关于 Redis 调优的相关问…

英语笔记:词组句子:1112

Survey 调查 Reveals 显示 show indicate Submits 呈送、提交 Launches 发动、发起 Generates 产生、创造 Staff 员工 Audience 观众、听众 Officials 官员、高级职员 Partners 合伙人、配偶 Shortage 短缺 Exits 出口 Departures 离开、离职 Absences 不在、缺席 …

Java RandomAccessFile writeLong()方法与示例

RandomAccessFile类writeLong()方法 (RandomAccessFile Class writeLong() method) writeLong() method is available in java.io package. writeLong()方法在java.io包中可用。 writeLong() method is used to write the long value to the file as 8 bytes directly without …

第三章关系数据库标准语言SQL

第三章关系数据库标准语言SQL3.1_SQL的特点3.3_数据定义3.3.1_基本表的定义、删除与修改3.3.3_索引的建立与删除3.4_数据查询3.4.1_查询时消除重复行3.4.2_涉及空值的查询3.4.3_BETWEEN AND的使用3.4.4_字符匹配3.4.5_聚集函数3.5_数据更新3.5.1_插入数据3.5.2_修改数据3.5.3_删…

使用 Redis 如何实现延迟队列?

延迟消息队列在我们的日常工作中经常会被用到,比如支付系统中超过 30 分钟未支付的订单,将会被取消,这样就可以保证此商品库存可以释放给其他人购买,还有外卖系统如果商家超过 5 分钟未接单的订单,将会被自动取消&…

适用响应式 Web UI 框架

1. BootstrapBootstrap是快速开发Web应用程序的前端工具包。它是一个CSS和HTML的集合,它使用了最新的浏览器技术,给你的Web开发提供了时尚的版式,表单,buttons,表格,网格系统等等。官方网站: http://twitte…

VC 忽略警告的方法

在vs2003, vs2005中用sprintf 会出现warning C4996: sprintf was declared deprecated或warning C4996: strcpy was declared deprecated或warning C4996: strcat was declared deprecated的警告。这里给出解决问题的一些方法。方法一:调用VS2005鼓吹的那些带“_s”…

第四章数据库安全性

第四章数据库安全性4.1_自主存取控制方法4.1.1_授权与回收4.2_数据库角色4.2.1_角色的创建4.2.2_给角色授权4.2.3_将一个角色授予其他的角色或用户4.2.4_角色权限的收回4.1_自主存取控制方法 4.1.1_授权与回收 1.GRANT: GRANT <权限>[,<权限>]… [ON <对象类型…

observable_Java Observable notifyObservers()方法与示例

observable可观察的类notifyObservers()方法 (Observable Class notifyObservers() method) Syntax: 句法&#xff1a; public void notifyObservers();public void notifyObservers(Object o);notifyObservers() method is available in java.util package. notifyObservers(…

Redis 面试题补充与汇总

前面的 12 个章节对 Redis 的面试题做了一个系统的讲解,那么本文将对 Redis 的热门面试题再做一个补充,力求覆盖到更多的 Redis 面试点。 Redis 持久化 Redis 持久化总共有以下三种方式: 快照方式(RDB, Redis DataBase)将某一个时刻的内存数据,以二进制的方式写入磁盘;…

第五章数据库完整性

第五章数据库完整性5.1_数据库完整性概述5.2_实体完整性5.2_参照完整性5.3_用户定义的完整性5.1_数据库完整性概述 1.数据库的完整性&#xff1a; 数据的正确性和相容性 2.数据的完整性和安全性的区别&#xff1a; 数据的完整性&#xff1a;防止数据库中存在不符合语义的数据&a…

KVC/KVO实现原理分析

2019独角兽企业重金招聘Python工程师标准>>> 1. 函数调用&#xff08;消息&#xff09;实现分析&#xff1a; 我们看这条语句&#xff1a; [代码]c#/cpp/oc代码&#xff1a; 1 [self.person setValue:"Vincent"forKey:"name"]; 就会被编译器…

英语笔记:写作:Nothing succeeds without a strong will

Nothing succeeds without a strong will 没有坚强的意志将一事无成 There is a widespread humorous saying that “Quitting smoking is theeasiest thing in the world. I’ve done it for hundreds of times.” 1. Funny as itis, the saying ironically reflects the fac…

filterreader_Java FilterReader markSupported()方法与示例

filterreaderFilterReader类markSupported()方法 (FilterReader Class markSupported() method) markSupported() method is available in java.io package. markSupported()方法在java.io包中可用。 markSupported() method is used to check whether this FilterReader strea…

如何设计不宕机的 Redis 高可用服务?

随着业务的不断发展和扩张我们需要更加稳定和高效的 Redis 服务,这是业务发展的必然趋势也是个人能力进阶的最高境界,我们需要一个高可用的 Redis 服务,来支撑和保证业务的正常运行。 我们本文的面试题是,如何设计一个不宕机的 Redis 高可用服务? 典型回答 想要设计一个…

第十章数据库恢复技术

第十章数据库恢复技术 10.1_事务 事务的四个特性&#xff1a;原子性、一致性、隔离性、持续性 10.2_故障的种类 事务内部的故障系统故障介质故障计算机病毒 10.3_恢复的实现技术 转储&#xff1a;动态和静态登记日志文件 10.4_恢复策略 事务故障的恢复&#xff1a;直接…