如何使用redis来实现分布式锁


本文摘自PHP中文网,作者(*-*)浩,侵删。

分布式锁其实可以理解为:控制分布式系统有序的去对共享资源进行操作,通过互斥来保持一致性。

举个不太恰当的例子:假设共享的资源就是一个房子,里面有各种书,分布式系统就是要进屋看书的人,分布式锁就是保证这个房子只有一个门并且一次只有一个人可以进,而且门只有一把钥匙。 (推荐学习:Redis视频教程)

使用redis实现分布式锁

使用redis命令 set key value NX EX max-lock-time 实现加锁

使用redis命令 EVAL 实现解锁

加锁:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

Jedis jedis = new Jedis("127.0.0.1", 6379);

  

 private static final String SUCCESS = "OK";

  

 /**

  

  * 加锁操作

  

  * @param key 锁标识

  

  * @param value 客户端标识

  

  * @param timeOut 过期时间

  

  */

  

 public Boolean lock(String key,String value,Long timeOut){

  

     String var1 = jedis.set(key,value,"NX","EX",timeOut);

  

     if(LOCK_SUCCESS.equals(var1)){

  

         return true;

  

     }

  

     return false;

  

 }

解读:

加锁操作:jedis.set(key,value,"NX","EX",timeOut)【保证加锁的原子操作】

key就是redis的key值作为锁的标识,value在这里作为客户端的标识,只有key-value都比配才有删除锁的权利【保证安全性】

通过timeOut设置过期时间保证不会出现死锁【避免死锁】

NX,EX什么意思?

NX:只有这个key不存才的时候才会进行操作,if not exists;

EX:设置key的过期时间为秒,具体时间由第5个参数决定

解锁

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

Jedis jedis = new Jedis("127.0.0.1", 6379);

  

 private static final Long UNLOCK_SUCCESS = 1L;

  

 /**

  

  * 解锁操作

  

  * @param key 锁标识

  

  * @param value 客户端标识

  

  * @return

  

  */

  

 public static Boolean unLock(String key,String value){

  

     String luaScript = "if redis.call(\"get\",KEYS[1]) == ARGV[1] then return redis.call(\"del\",KEYS[1]) else  return 0 end";

  

     Object var2 = jedis.eval(luaScript,Collections.singletonList(key), Collections.singletonList(value));

  

     if (UNLOCK_SUCCESS == var2) {

  

         return true;

  

     }

    return false;

 }

解读:

luaScript 这个字符串是个lua脚本,代表的意思是如果根据key拿到的value跟传入的value相同就执行del,否则就返回0【保证安全性】

jedis.eval(String,list,list);这个命令就是去执行lua脚本,KEYS的集合就是第二个参数,ARGV的集合就是第三参数【保证解锁的原子操作】

上述就实现了怎么使用redis去正确的实现分布式锁,但是有个小缺陷就是锁过期时间要设置为多少合适,这个其实还是需要去根据业务场景考量一下的。

更多Redis相关技术文章,请访问Redis入门教程栏目进行学习!

以上就是如何使用redis来实现分布式锁的详细内容,更多文章请关注木庄网络博客

相关阅读 >>

Redis要点分析

Redis怎么做缓存

zk和Redis分布式锁区别

Redis是如何持久化的

Redis报错windows error 0x70的解决方法

Redis error什么意思

Redis英语怎么读

Redis过期策略是指什么

Redis是什么?有哪些应用场景?

Redis是什么语言开发的

更多相关阅读请进入《Redis》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...