iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >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://www.lsjlt.com/news/351006.html(转载时请注明来源链接)

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 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乐观锁实现的方式有哪些
    在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 SETredis常见的加锁命令分别是INCR、SETNX、SET 1 INCR 这种锁的加锁思路是:key不存在,那么key的值会先被初始化为0,然...
    99+
    2023-01-04
    redis 加锁
  • redis加锁的几种方式汇总
    目录1、INCR2、SETNX3、SET总结redis常见的加锁命令分别是INCR、SETNX、SET 1、INCR 这种锁的加锁思路是: key不存在,那么key的值会先被初始化为...
    99+
    2023-03-07
    redis加锁 redis加锁方式 redis加锁汇总
  • 搭建redis的方式有哪些
    搭建Redis的方式有以下几种:1. 从官方网站下载和编译安装:可以从Redis官方网站下载Redis的源代码,然后进行编译安装。这...
    99+
    2023-08-30
    redis
  • redis的应用方式有哪些
    redis的应用方式有哪些?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!1、取最新N个数据的操作比如典型的取你网站的最新文...
    99+
    2024-04-02
  • redis加锁的常用方式是什么
    这篇文章主要介绍了redis加锁的常用方式是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。常用的加锁方式有:一、incr加锁<ph...
    99+
    2024-04-02
  • java实现锁的方式有哪些
    Java实现锁的方式有以下几种: synchronized关键字:使用synchronized关键字可以在方法或者代码块上加锁,...
    99+
    2023-10-24
    java
  • zk和redis分布式锁有哪些区别
    这篇文章给大家分享的是有关zk和redis分布式锁有哪些区别的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。 Redis实现分布式锁根据lockKey区进行setnx(s...
    99+
    2024-04-02
  • redis有哪些启动方式
    小编给大家分享一下redis有哪些启动方式,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!redis的启动方式1.直接启动进入redis根目录,执行命令:#加上‘&’号使redis以后台...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作