2017.12.25 Redis分布式锁

来源:互联网 发布:刚柔流空手道 知乎 编辑:程序博客网 时间:2024/06/05 08:07

一、Redis分布式锁
1.连接
通过jedis来取得和Redis的连接。

2.语法
①setnx key value
当且仅当 key 不存在,将 key 的值设为 value ,并返回1;若给定的 key 已经存在,则 SETNX 不做任何动作,并返回0。
②getset key value
将给定 key 的值设为 value ,并返回 key 的旧值,当 key 存在但不是字符串类型时,返回一个错误,当key不存在时,返回nil。
③get key
返回 key 所关联的字符串值,如果 key 不存在那么返回特殊值 nil 。
④del key
删除给定的一个或多个 key ,不存在的 key 会被忽略。

3.用setnx加锁,死锁或超时直接用del解锁(存在问题)
用时间戳作为value存入

C1获取锁,并崩溃。C2和C3调用SETNX上锁返回0后,获得foo.lock的时间戳,通过比对时间戳,发现锁超时。
C2 向foo.lock发送DEL命令。
C2 向foo.lock发送SETNX获取锁。
C3 向foo.lock发送DEL命令,此时C3发送DEL时,其实DEL掉的是C2的锁。
C3 向foo.lock发送SETNX获取锁。

即C2、C3都获取了锁,产生竞争条件。

4.优化
用getset方法,更新value并返回旧值,通过返回的旧值和get获得的值比较判断是否能拿到锁。

C1获取锁,并崩溃。C2和C3调用setnx上锁返回0后,调用get命令获得当前锁的时间戳T1,通过比对时间戳,发现锁超时。
C4 发送getset命令,并得到老的时间戳T2。
如果T1=T2,说明C4获得时间戳。
如果T1!=T2,说明C4之前有另外一个客户端C5通过调用GETSET方式获取了时间戳,C4未获得锁。只能sleep下,进入下次循环中。

现在唯一的问题是,C4设置的新时间戳,是否会对锁产生影响。C4和C5执行的时间差值极小,并且写入的都是有效时间错,所以对锁并没有影响。

这里写图片描述

http://blog.csdn.net/ugg/article/details/41894947

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 汽车尾灯罩多少钱 什么样的汽车罩好 汽车档位防尘罩 汽车清凉罩 汽车车衣车罩多少钱 汽车遮阳罩有用吗 汽车自动防晒罩 汽车罩有用吗 汽车发动机罩 汽车遮阳罩厂家 汽车座椅罩 汽车用防尘罩 汽车挡雨罩 汽车自动遮阳罩代理 汽车罩 防晒 防雨 汽车防雨罩 自动汽车防晒罩 汽车防晒遮阳罩 汽车车罩多少钱一个 汽车需要车罩吗 汽车外衣罩套 清凉汽车罩 车罩对车好吗 汽车罩车衣好吗 小车车罩多少钱 全自动汽车遮阳罩 自动遮阳汽车罩 汽车遮阳罩怎么折叠 轿车罩 汽车自动罩 汽车轮罩 轿车车罩多少钱 汽车车罩什么材质的好 汽车布罩 车凉爽汽车清凉罩 汽车坐罩 汽车座罩 汽车遮阳罩图片 汽车罩多少钱一个 汽车的车罩 全自动汽车防晒罩价格