您当前的位置:首页 > 电脑百科 > 硬件技术 > 硬件技术

用过Redis分布式锁,但是了解它的背后原理吗?

时间:2020-03-27 17:38:50  来源:  作者:
 

以前在学校做小项目的时候,用到redis,基本也只是用来当作缓存。现在博主在某金融平台实习,发现Redis在生产中并不只是当作缓存这么简单。在我接触到的项目中,Redis起到了一个分布式锁的作用,具体情况是这样的:

该项目在金融平台中负责某块业务,是一个分布式系统,线上大概跑着10个左右的实例。其中有一个步骤需要用户支付一定的费用,Redis分布式锁在其中大概处于这么一个位置:

 

用过Redis分布式锁,但是了解它的背后原理吗?

 

可以看到在上分布式锁之后,系统做了两个查询校验,然后向数据库中插入了一条订单记录,接着才解锁进入支付流程。

从业务的角度考虑分布式锁是好理解的,它保证了查询及插入数据整个流程的原子性,防止查询校验的时候查到脏数据,使得支付前订单信息落表的操作串行化执行。

尽管从业务上来说很好理解,但使用Redis作为分布式锁对我来说是个新知识,我打算结合项目中的代码,深挖一下这个知识点。

正文

1. 为什么要使用分布式锁

在实际项目中见过分布式锁后,就不难理解为什么要使用分布式锁了:总结来说就是分布式系统要访问共享资源,为了避免并发访问资源带来错误,我们为共享资源添加一把锁,让各个访问互斥,保证并发访问的安全性,这就是使用分布式锁的原因。

2. Redis中分布式锁的实现

redis中使用分布式锁很简单,只要使用setnx指令对某个key上锁就行:

setnx lock test //上锁
del lock test   //解锁

当某个key没有被占用的时候,setnx指令会返回1,否则返回0,这就是Redis中分布式锁的使用原理。

当然我们还可以在上锁之后使用expire指令给锁设置过期时间。

看到这里你可能会有疑问,如果我们的程序流程不使用指令解锁,靠redis设置时间过期来解锁,貌似会出问题。假如我们的服务进程在执行setnx之后和执行expire指令之前挂掉了,那这个锁岂不是永远都不能被释放?

没错,这确实是个问题,当时人们在Redis的开源社区提出了一堆解决方案专门来解决这个问题,可实现方式都极为复杂。后来Redis的作者在Redis 2.8版本中加入了set指令的扩展参数,使得setnx指令和expire指令能够同时执行,具体使用像下面这个样子:

set lock test ex 5 nx
ex:设置键的过期时间
nx:只在键不存在时,才对键进行设置操作

从此以后,Redis成为了分布式锁的宠儿。

3. 分布式锁在Redis集群中遇到的麻烦

在学习了Redis中分布式锁的使用后,很快我们便发现了新的问题。在企业中,Redis基本上都是集群部署的,集群部署避免不了要面对某个节点宕机的问题。

我们考虑这么一种情况:假设我们在redis的主节点上添加了一把分布式锁,不幸的是主节点挂掉了,而且主节点上的锁还没有同步到从节点上,如果此时有客户端来请求获得同一把锁,那么它将顺利地获得锁,之前那把锁会被无情地忽视掉,这就是分布式锁在Redis集群中遇到的麻烦。

Redis的作者为了解决这个问题提出了一个叫Redlock的算法,它的原理是这样的:当上锁的时候,把set指令发送给过半的节点,只要过半的锁set成功,就认为这次加锁成功;当解锁的时候,会向所有的节点发送del指令。

从这个算法的原理可以看出,由于Redlock需要同时对多个节点进行读写,因此使用Redlock加分布式锁的性能要比单机Redis低很多。因为主从复制出纰漏的概率极低,所以如果对分布式加锁过程有一定的容错率的话,可以考虑直接使用set指令;如果追求高可用性,可以考虑使用Redlock算法。

当然,高可用性的分布式锁不只有Redis的Redlock,我们还可以用zookeeper或者支持事务的数据库做分布式锁。

简述zookeeper的分布式锁原理:假设zk用某个节点作为分布式锁,当不同的客户端到zk竞争这把锁的时候,zk会按顺序给不同的客户端创建一个子节点,挂在作为分布式锁的节点下面。假设第一个来到的客户端为A,第二个来到的是B,分布式节点下挂的第一个节点就是A,B紧跟着A,且B会监听着A的生命状态,当A释放锁后A会被删除,这时B监听到A被删除,B接能上位获得分布式锁了。

公司的项目中,虽然Redis是以集群的方式部署的,但还是使用最基本的set指令获取分布式锁,因为这种方式的性能远远高于Redlock算法,也高于zk,数据库等分布式锁实现方式。

虽然在高性能与低概率的错误中选择了高性能,但项目中还是做了其他工作对错误情况进行兜底的,比如在公司的项目中对主从复制时的错误情况会抛出异常,然后根据异常会进行一些重试的操作。

总结

这次对Redis分布式锁的探索算是加深了自己对Redis的理解,但我知道Redis的用处还远远不止分布式锁和缓存,留着后面继续探索吧。



Tags:Redis   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
来源: my.oschina.net/xiaomu0082/blog/2990388首先说下问题现象:内网sandbox环境API持续1周出现应用卡死,所有api无响应现象刚开始当测试抱怨环境响应慢的时候 ,我们重启一下应...【详细内容】
2021-12-08  Tags: Redis  点击:(18)  评论:(0)  加入收藏
我不知道为什么你会选择对特定数量的“错误”(或警告)如此具体。听起来您正在寻找将要发布到 Yahoo! 的某些文章的内容。 Insider (N Foos to Blah for the BlahBlah)。那说:...【详细内容】
2021-12-07  Tags: Redis  点击:(14)  评论:(0)  加入收藏
目录 一、背景 二、步骤 0.理论支持 1、获取数据 2、结果 3、分析数据并评估大小 三、关于repl-backlog-size 一、背景 repl-backlog-size控制这个环形缓冲区. ​ 主从断...【详细内容】
2021-11-05  Tags: Redis  点击:(41)  评论:(0)  加入收藏
Redis 性能测试是通过同时执行多个命令实现的。1,Redis-benchmarkRedis性能命令:redis性能命令格式: redis-benchmark [option] [option value] redis 性能测试工具可选参数如...【详细内容】
2021-11-02  Tags: Redis  点击:(41)  评论:(0)  加入收藏
1 概述数据结构和内部编码 无传统关系型数据库的 Table 模型schema 所对应的db仅以编号区分。同一 db 内,key 作为顶层模型,它的值是扁平化的。即 db 就是key的命名空间。 key...【详细内容】
2021-11-01  Tags: Redis  点击:(28)  评论:(0)  加入收藏
普通java中使用引用Java redis 驱动,即可连接:import redis.clients.jedis.Jedis; public class RedisTestJava { public static void main(String[] args) { //连...【详细内容】
2021-10-13  Tags: Redis  点击:(34)  评论:(0)  加入收藏
Redis常用的数据结构有 string list set zset hashstringstring 是 Redis 的基本的数据类型,一个 key 对应一个 value。string 类型是二进制安全的,Redis的string可以包含任...【详细内容】
2021-10-12  Tags: Redis  点击:(36)  评论:(0)  加入收藏
列表类型可以存储一组按插入顺序排序的字符串,它非常灵活,支持在两端插入、弹出数据,可以充当栈和队列的角色。> LPUSH fruit apple(integer) 1> RPUSH fruit banana(integer)...【详细内容】
2021-09-17  Tags: Redis  点击:(54)  评论:(0)  加入收藏
Redis持久化意义 是做灾难恢复,数据恢复,也可以归类到高可用的一个环节里面去,比如你的redis整个挂了,然后redis就不可用了,你要做的事情是让redis变得可用,尽快变得可用 大量的请...【详细内容】
2021-08-12  Tags: Redis  点击:(77)  评论:(0)  加入收藏
Nginx来限制访问控制的方法有多种,nginx主要有2个模块控制,但是那些不支持自定义,非常死,在大多数场景下并不实用。今天分享一个:利用openresty+lua+redis 实现封杀频繁恶意访问I...【详细内容】
2021-08-12  Tags: Redis  点击:(119)  评论:(0)  加入收藏
▌简易百科推荐
要想将电脑显示屏变成电视机观看电视节目,必须要买一个HDMI转VGA转换器,买来转换器将相对应的接口接到电 脑显示屏处,另一端的HDMI接口插上HDMI线的一端,另一端插到机顶盒接口上...【详细内容】
2021-12-15  勿遮柱2019    Tags:显示屏   点击:(14)  评论:(0)  加入收藏
DIY装机难点在于跳线,掌握了跳线知识,也就算真正入门了DIY,本文将为萌新装机用户科普跳线知识,给大家讲解常见主板跳线技巧。开关跳线通常在主板右下角,不管是什么板型,基本都在这...【详细内容】
2021-09-22    中关村在线  Tags:   点击:(62)  评论:(0)  加入收藏
随着人们生活水平的不断提高,如今智能电视的普及率已经非常高。然而大家在使用智能电视的时候经常会遇到“无法安装第三方应用”的情况。为了解决这个问题,今天我以市场占有率...【详细内容】
2021-09-15  电脑手机那些事儿    Tags:智能电视   点击:(81)  评论:(0)  加入收藏
近年来,HDMI高清视频线已经逐渐成为当前视频设备连接的默认标准接口,机顶盒、电视机、显示屏、投影仪等都采用了HDMI接口进行连接,HDMI线有着很多优点,例如4K分辨率和18Gbps传输...【详细内容】
2021-09-13  SAMZHE山泽    Tags:HDMI线   点击:(42)  评论:(0)  加入收藏
家里有台dell的服务器powerEdge SC440, 标配内存512M(667Ghz),CPU:奔腾E2180。用了10多年了,还很稳定。就是配置相对偏低。 在闲鱼买了二手的奔腾E6700,发来的是酷睿2 E7400,结果点...【详细内容】
2021-08-24  灰格先生    Tags:电脑升级   点击:(53)  评论:(0)  加入收藏
笔记本电脑的便携性是被大家认可的。现在,几乎每个上过大学的人都有一台属于自己的笔记本电脑。大家在购买的时候,大多都是大一或大二,买的时候,大多数人都考虑到经济问题,没有...【详细内容】
2021-08-18  电影新视界222    Tags:电脑升级   点击:(64)  评论:(0)  加入收藏
喷墨打印机价格低,打印质量高,是目前市场上广泛使用的一款打印机,非常适合家用!那么今天小绘就来分享一下,喷墨打印机的几种常见故障以及解决方法吧。 一、新墨盒装上后打印没有...【详细内容】
2021-08-10  绘威打印    Tags:喷墨打印机   点击:(91)  评论:(0)  加入收藏
为响应国家节能减排,低碳发展的号召,越来越多的企业和公司实施了绿色办公,要求办公节水节电节纸,倡导无纸化办公和双面打印。那么我们应该如何设置双面打印呢? 首先:目前市场上型...【详细内容】
2021-07-30  绘威打印    Tags:打印机   点击:(863)  评论:(0)  加入收藏
No.1前言随着科技日新月异的发展,电脑已逐渐成为人们不可或缺的工具,很多硬件都可以自己 DIY 了。作为电脑DIY爱好者来说,我们的最终目的肯定是追求性价比,在保证性价比的基础...【详细内容】
2021-07-26  软件测评说    Tags:电脑硬件   点击:(75)  评论:(0)  加入收藏
个人电脑小白一个,平时自己对电脑要求不高,仅限于办公,偶尔打打2k14(主要是电脑配置跟不上,自从2015年接触过2k14所以一直都只玩这个游戏),2016年上大学买了戴尔 Ins14C-4528B 笔记...【详细内容】
2021-07-26  Ekhals    Tags:升级电脑   点击:(68)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条