共计 1288 个字符,预计需要花费 4 分钟才能阅读完成。
自动写代码机器人,免费开通
丸趣 TV 小编给大家分享一下 redis 分布式锁的实现原理,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!
分布式锁其实可以理解为:控制分布式系统有序的去对共享资源进行操作,通过互斥来保持一致性。
举个不太恰当的例子:
假设共享的资源就是一个房子,里面有各种书,分布式系统就是要进屋看书的人,分布式锁就是保证这个房子只有一个门并且一次只有一个人可以进,而且门只有一把钥匙。然后许多人要去看书,可以,排队,第一个人拿着钥匙把门打开进屋看书并且把门锁上,然后第二个人没有钥匙,那就等着,等第一个出来,然后你在拿着钥匙进去,然后就是以此类推
实现原理
互斥性
保证同一时间只有一个客户端可以拿到锁,也就是可以对共享资源进行操作
安全性
只有加锁的服务才能有解锁权限,也就是不能让 a 加的锁,bcd 都可以解锁,如果都能解锁那分布式锁就没啥意义了
可能出现的情况就是 a 去查询发现持有锁,就在准备解锁,这时候忽然 a 持有的锁过期了,然后 b 去获得锁,因为 a 锁过期,b 拿到锁,这时候 a 继续执行第二步进行解锁如果不加校验,就将 b 持有的锁就给删除了
避免死锁
出现死锁就会导致后续的任何服务都拿不到锁, 不能再对共享资源进行任何操作了
保证加锁与解锁操作是原子性操作
这个其实属于是实现分布式锁的问题,假设 a 用 redis 实现分布式锁
假设加锁操作,操作步骤分为两步:
1,设置 key set(key,value)2,给 key 设置过期时间
假设现在 a 刚实现 set 后,程序崩了就导致了没给 key 设置过期时间就导致 key 一直存在就发生了死锁
如何实现分布式锁
实现分布式锁的方式有很多,只要满足上述条件的都可以实现分布式锁,比如数据库,redis,zookeeper,在这里就先讲一下如何使用 redis 实现分布式锁
分布式锁实现的关键是在分布式的应用服务器外,搭建一个存储服务器,存储锁信息,这时候我们很容易就想到了 Redis。首先我们要搭建一个 Redis 服务器,用 Redis 服务器来存储锁信息。
使用 redis 实现分布式锁
使用 redis 命令 set key value NX EX max-lock-time 实现加锁
使用 redis 命令 EVAL 实现解锁
在实现的时候要注意的几个关键点:
1、锁信息必须是会过期超时的,不能让一个线程长期占有一个锁而导致死锁;
2、同一时刻只能有一个线程获取到锁。
几个要用到的 redis 命令:
setnx(key, value):“set if not exits”,若该 key-value 不存在,则成功加入缓存并且返回 1,否则返回 0。
get(key):获得 key 对应的 value 值,若不存在则返回 nil。
getset(key, value):先获取 key 对应的 value 值,若不存在则返回 nil,然后将旧的 value 更新为新的 value。
expire(key, seconds):设置 key-value 的有效期为 seconds 秒。
看完了这篇文章,相信你对 redis 分布式锁的实现原理有了一定的了解,想了解更多相关知识,欢迎关注丸趣 TV 行业资讯频道,感谢各位的阅读!
向 AI 问一下细节
丸趣 TV 网 – 提供最优质的资源集合!