Redis主从架构的分布式锁失效问题 & 高并发量下性能优化

[本文转自](https://blog.csdn.net/SHU15121856/article/details/117373966

1 Redis主从架构的分布式锁失效问题

1.1 问题描述

在Redis主从架构中,写入都是写入主Redis实例,主实例会向从实例同步key。

一个业务线程A通过向主Redis实例中写入来实现加分布式锁,加锁后开始执行业务代码。这时如果主Redis实例挂掉了,会选举出一个从Redis实例成为主的,如果刚刚加锁的key还没有来得及同步到从Redis中,那么选举出来的新的主Redis实例中就没有这个key,这个时候业务线程B就能加锁来获取分布式锁,执行业务代码了,而这个时候A还没有执行结束,所以就会出现并发安全问题,这就是Redis主从架构的分布式锁失效问题。


image.png

1.2 使用Zookeeper代替Redis解决分布式锁失效问题

Zookeeper(以后简称ZK)也是一种k-v形式的存储中间件,只是它的内部结构是树形的,在ZK的集群里也有主从的概念,主结点叫Leader,从结点叫Follower,如果使用ZK就能解决这种主从同步引起的分布式锁失效问题。

这是因为CAP理论说明,一致性、可用性和分区容错性最多只能保持三个中的两个(其中分区容错性一定要保持),Redis集群倾向AP(也就是更关注可用性),ZP集群则倾向CP(也就是更关注一致性)。

在向Redis集群里的主结点写入数据时,写入主节点就立刻告诉客户端写入成功。而在向ZK的主结点写入数据时,并不是立刻告诉客户端写入成功,而是先同步给从结点,至少半数的节点同步成功才能返回“写入成功”给客户端。

这个时候如果ZK的主节点挂了,ZK的ZAB分布式一致性协议能保证一定是数据同步完成的结点被选举为主节点,所以就不会发生分布式锁的失效问题。

1.3 使用RedLock解决分布式锁失效问题

如果不改用ZK,就是要用Redis来解决主从架构的分布式锁失效问题,那么可以使用RedLock,RedLock底层逻辑和ZK很类似。

首先要有多个(最好是奇数个)对等的(没有主从关系)Redis结点。当进行加锁时(比如是用SETNX命令),则这个设置key-value的命令会发给每个Redis结点执行,当且仅当客户端收到超过半数的结点写成功的消息时,才认为加锁成功,才开始执行后面的业务代码。


image.png

下图中,Client 1向Redis 1/2/3三个结点去写key-value,假设当前处在Redis 1和Redis 2写入成功了,Redis 3还没有写入成功的状态,这个时候Client 1就已经认为加锁成功了,实际上已经可以执行业务代码了。

此时,假设有一个Redis结点挂了(最坏的情况就是已经写入了key的一个结点挂了,如下图所示Redis 1挂了),这个时候假设Client 2也要尝试加锁,此时Redis 2由于已经被Client 1写过了,没法写入成功,但是Redis 3可以写入成功。此时只有1个结点能写入成功,所以认为加锁不成功,这样Client 2就不会开始错误的执行业务代码,也就不会出现并发安全问题。


image.png

RedLock目前还有一些争议,所以很多时候可能不会用这种解决方案。下面是老师上课时展示的一块用Redisson实现RedLock的伪代码。在使用的时候,大体就是对不同的Redis实例,用Redisson获取RLock对象,然后用这些RLock对象来构造RedissonRedLock对象,然后用它来实现加锁解锁的逻辑即可。


image.png

2 Redis分布式锁高并发量下性能优化

2.1 问题描述

“分布式锁”这个东西从概念上就和“高并发”是背道而驰的,只是为了解决高并发量下的程序并发安全问题,用一把锁实际上把所有控制的代码(线程)变成了顺序执行,这样其实会损失很多性能,但是在并发量不是太高的场景下一般也就直接这样用就够了。

2.2 分段锁思想提升并发量

ConcurrentHashMap是并发安全的集合,而且在高并发的场景下性能表现也很不错,可以参考下它的底层实现——分段锁。利用这种思想就可以从业务角度出发,对操作的业务实体进行分段,来优化分布式锁。

比如在秒杀场景下,iPhone这个商品有200个,要做秒杀,那么可以每20个分成一段,让它变成10个物品:


image.png

iPhone_1(20个), iPhone_2(20个), ..., iPhone_10(20个)
1
这个时候如果要做秒杀,则不同段的“商品”iPhone_x可以并行执行,在上面这种方式下并发量就提升到了10倍。

如果某个段的“商品”库存不够减了,比如iPhone_2只剩1个了,但是这个时候要一次性减掉3个,这个时候就可以合并其他段位的“商品”,然后再去减库存。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 207,113评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,644评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,340评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,449评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,445评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,166评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,442评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,105评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,601评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,066评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,161评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,792评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,351评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,352评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,584评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,618评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,916评论 2 344

推荐阅读更多精彩内容