当前位置 : 主页 > 数据库 > redis >

什么是redis分布式锁

来源:互联网 收集:自由互联 发布时间:2021-09-09
分布式锁其实可以理解为:控制分布式系统有序的去对共享资源进行操作,通过互斥来保持一致性。 举个不太恰当的例子: (推荐学习:Redis视频教程) 假设共享的资源就是一个房子,
分布式锁其实可以理解为:控制分布式系统有序的去对共享资源进行操作,通过互斥来保持一致性。

举个不太恰当的例子:(推荐学习: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相关技术文章,请访问Redis数据库使用入门教程栏目进行学习!

以上就是什么是redis分布式锁的详细内容,更多请关注自由互联其它相关文章!

网友评论