返回顶部
首页 > 资讯 > 精选 >redis加锁的方式有哪些
  • 178
分享到

redis加锁的方式有哪些

2023-07-05 09:07:14 178人浏览 薄情痞子
摘要

这篇文章主要讲解了“redis加锁的方式有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Redis加锁的方式有哪些”吧!redis常见的加锁命令分别是INCR、SETNX、SET1、IN

这篇文章主要讲解了“redis的方式有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Redis加锁的方式有哪些”吧!

redis常见的加锁命令分别是INCR、SETNX、SET

1、INCR

这种锁的加锁思路是:

key不存在,那么key的值会先被初始化为0,然后再执行INCR操作进行加一。

然后其它用户在执行INCR操作进行加一时,如果返回的数值大于1,说明这个key正在被锁定使用。

客户端A请求服务器获取key的值为1表示获取了锁    

客户端B也去请求服务器获取key的值为2表示获取锁失败    

客户端A执行代码完成,删除锁    

客户端B在等待一段时间后在去请求的时候获取key的值为1表示获取锁成功    

客户端B执行代码完成,删除锁 

$redis->incr($key);$redis->expire($key, $ttl); //设置生成时间为1秒

具体使用命令:

127.0.0.1:6379>INCR keyName

2、SETNX

这种加锁的思路是,如果key不存在,将key设置为value,如果key存在,则SETNX不做任何动作。

SETNX是SET if Not eXists的缩写。

客户端A请求服务器设置key的值,如果设置成功就表示加锁成功

客户端B也去请求服务器设置key的值,如果返回失败,那么就代表加锁失败

客户端A执行代码完成,删除锁

客户端B在等待一段时间后在去请求设置key的值,设置成功

客户端B执行代码完成,删除锁

$redis->setNX($key, $value);$redis->expire($key, $ttl);

具体使用命令:

redis> SETNX keyName value(integer) 1

设置成功,返回1;设置失败,返回0

3、SET

上面两种方法都有一个问题,会发现,都需要设置 key 过期。

那么为什么要设置key过期呢?

如果请求执行因为某些原因意外退出了,导致创建了锁但是没有删除锁,那么这个锁将一直存在,以至于以后缓存再也得不到更新。

于是乎我们需要给锁加一个过期时间以防不测。

但是借助 Expire 来设置就不是原子性操作了。

所以还可以通过事务来确保原子性,但是还是有些问题,所以官方就引用了另外一个,使用 SET 命令本身已经从版本 2.6.12 开始包含了设置过期时间的功能。

客户端A请求服务器设置key的值,如果设置成功就表示加锁成功

客户端B也去请求服务器设置key的值,如果返回失败,那么就代表加锁失败    

客户端A执行代码完成,删除锁    

客户端B在等待一段时间后在去请求设置key的值,设置成功

客户端B执行代码完成,删除锁

$redis->set($key, $value, array('nx', 'ex' => $ttl));  //ex表示秒

具体使用:

redis>set key value NX EX max-lock-time 实现加锁

命令解释:

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

  • max-lock-time:通过max-lock-time设置过期时间保证不会出现死锁【避免死锁】

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

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

加锁代码: 

 Jedis jedis = new Jedis("127.0.0.1", 6379); private static final String SUCCESS = "OK";    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 jedis = new Jedis("127.0.0.1", 6379);  private static final Long UNLOCK_SUCCESS = 1L;    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加锁的方式有哪些这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: redis加锁的方式有哪些

本文链接: https://lsjlt.com/news/351006.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • redis加锁的方式有哪些
    这篇文章主要讲解了“redis加锁的方式有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“redis加锁的方式有哪些”吧!redis常见的加锁命令分别是INCR、SETNX、SET1、IN...
    99+
    2023-07-05
  • redis加锁的方法有哪些
    Redis提供了多种加锁的方法,可以根据具体的场景选择合适的方法。以下是常用的几种方法:1. SETNX:使用SETNX命令可以在R...
    99+
    2023-08-31
    redis
  • java加锁的方式有哪些
    在Java中,有以下几种加锁的方式:1. synchronized关键字:使用synchronized关键字来修饰方法或代码块,实现...
    99+
    2023-08-16
    java
  • redis执行加锁的方法有哪些
    Redis执行加锁的方法有以下几种:1. SETNX命令:使用SETNX命令设置一个带有过期时间的键值对,只有在键不存在时才能设置成...
    99+
    2023-08-24
    redis
  • Redis分布式锁的实现方式有哪些
    分布式锁是控制分布式系统之间同步访问共享资源的一种方式。在分布式系统中,常常需要协调他们的动作。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要互斥来防止彼此...
    99+
    2024-04-02
  • redis乐观锁实现的方式有哪些
    在Redis中实现乐观锁的方式有以下几种:1. 使用WATCH命令:使用WATCH命令可以监视一个或多个键,当这些键的值发生变化时,...
    99+
    2023-08-12
    redis
  • redis锁机制的实现方式有哪些
    Redis锁的实现方式主要有以下几种:1. 设置过期时间:通过设置一个键值对,并给定一个过期时间,利用Redis的SETNX(SET...
    99+
    2023-08-12
    redis
  • Redis分布式锁有哪些
    Redis分布式锁有哪些?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!我们通常使用的synchronized或者Lock都...
    99+
    2024-04-02
  • Redis实现分布式锁的方法有哪些
    今天小编给大家分享一下Redis实现分布式锁的方法有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1. 单机数据一致性单...
    99+
    2023-07-02
  • redis分布式锁的坑有哪些
    这篇“redis分布式锁的坑有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“redis分布式锁的坑有哪些”文章吧。1 非...
    99+
    2023-07-02
  • redis锁有哪些
    redis 提供 6 种锁类型:setnx、redis、redlock、lua 脚本、watch + multi + exec 和可重入锁,用于在分布式环境中协调访问共享资源。 Red...
    99+
    2024-04-08
  • redis分布式锁的作用有哪些
    防止多个客户端同时操作同一个资源,保证数据的一致性和完整性。 避免资源的并发访问导致的竞态条件和错误。 控制对共享资源的...
    99+
    2024-04-09
    redis
  • redis中的分布式锁有哪些特点
    本篇内容主要讲解“redis中的分布式锁有哪些特点”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“redis中的分布式锁有哪些特点”吧! ...
    99+
    2023-04-14
    redis
  • redis加锁的几种方式汇总
    目录1、INCR2、SETNX3、SET总结redis常见的加锁命令分别是INCR、SETNX、SET 1、INCR 这种锁的加锁思路是: key不存在,那么key的值会先被初始化为...
    99+
    2023-03-07
    redis加锁 redis加锁方式 redis加锁汇总
  • redis加锁的三种方式小结
    目录1 INCR2 SETNX3 SETredis常见的加锁命令分别是INCR、SETNX、SET 1 INCR 这种锁的加锁思路是:key不存在,那么key的值会先被初始化为0,然...
    99+
    2023-01-04
    redis 加锁
  • redis的启动方式有哪些?
    redis的三种启动方式1.直接启动进入redis根目录,执行命令:#加上‘&’号使redis以后台程序方式运行./redis-server &2.通过指定配置文件启动可以为redis服务启...
    99+
    2024-04-02
  • redis的应用方式有哪些
    redis的应用方式有哪些?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!1、取最新N个数据的操作比如典型的取你网站的最新文...
    99+
    2024-04-02
  • 搭建redis的方式有哪些
    搭建Redis的方式有以下几种:1. 从官方网站下载和编译安装:可以从Redis官方网站下载Redis的源代码,然后进行编译安装。这...
    99+
    2023-08-30
    redis
  • java实现锁的方式有哪些
    Java实现锁的方式有以下几种: synchronized关键字:使用synchronized关键字可以在方法或者代码块上加锁,...
    99+
    2023-10-24
    java
  • zk和redis分布式锁有哪些区别
    这篇文章给大家分享的是有关zk和redis分布式锁有哪些区别的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。 Redis实现分布式锁根据lockKey区进行setnx(s...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作