iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >如何使用Redis的SETNX实现锁机制
  • 455
分享到

如何使用Redis的SETNX实现锁机制

2024-04-02 19:04:59 455人浏览 薄情痞子
摘要

这篇文章给大家分享的是有关如何使用Redis的SETNX实现锁机制的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。setNX,是set if not exists 的缩写,也就是只

这篇文章给大家分享的是有关如何使用Redis的SETNX实现机制的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。

setNX,是set if not exists 的缩写,也就是只有不存在的时候才设置, 设置成功时返回 1 , 设置失败时返回 0 。可以利用它来实现锁的效果,但是很多人在使用的过程中都有一些问题没有考虑到。

例如某个查询数据库的接口因为请求量比较大所以加了缓存,并设定缓存过期后刷新。当并发量比较大并且缓存过期的瞬间,大量并发请求会直接查询数据库导致雪崩。如果使用锁机制来控制只有一个请求去更新缓存就能避免雪崩的问题。下面是很多人下意识想到的加锁方法

$rs = $redis->setNX($key, $value);
if ($rs) {
    //处理更新缓存逻辑
    // ......
    //删除锁
    $redis->del($key);
}

通过 setNX 获取锁,如果成功了则更新缓存然后删除锁。其实这里有一个严重的问题:如果更新缓存的时候因为某些原因意外退出了,那么这个锁就不会被删除而一直存在,以至于缓存再也得不到更新。为了解决这个问题有人可能会想到给锁设置一个过期时间,如下

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

因为 setNX 不具备设置过期时间的功能,所以要借助 Expire 来设置,同时需要使用 Multi/Exec 来确保请求的原子性,以免 setNX 成功了 Expire 却失败了。这样还有问题:当多个请求到达时,虽然只有一个请求的 setNX 可以成功,但是任何一个请求的 Expire 却都可以成功,这就意味着即便获取不到锁也可以刷新过期时间,导致锁一直有效,还是解决不了上面的问题。显然 setNX 满足不了需求,Redis从 2.6.12 起,SET 涵盖了 SETEX 的功能, SET 本身又包含了设置过期时间的功能,所以使用 SET 就可以解决上面遇到的问题

$rs = $redis->set($key, $value, array('nx', 'ex' => $ttl));
if ($rs) {
    //处理更新缓存逻辑
    // ......
    //删除锁
    $redis->del($key);
}

到这一步其实还是有问题的,如果一个请求更新缓存的时间比锁的有效期还要长,导致在缓存更新过程中锁就失效了,此时另一个请求就会获取到锁,但前一个请求在缓存更新完毕的时候,直接删除锁的话就会出现误删其它请求创建的锁的情况。所以要避免这种问题,可以在创建锁的时候需要引入一个随机值并在删除锁的时候加以判断

$rs = $redis->set($key, $random, array('nx', 'ex' => $ttl));
if ($rs) {
     //处理更新缓存逻辑
    // ......
    //先判断随机数,是同一个则删除锁
    if ($redis->get($key) == $random) {
        $redis->del($key);
    }
}

感谢各位的阅读!关于如何使用Redis的SETNX实现锁机制就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到吧!

您可能感兴趣的文档:

--结束END--

本文标题: 如何使用Redis的SETNX实现锁机制

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

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

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

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

下载Word文档
猜你喜欢
  • 如何使用Redis的SETNX实现锁机制
    这篇文章给大家分享的是有关如何使用Redis的SETNX实现锁机制的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。setNX,是set if not exists 的缩写,也就是只...
    99+
    2024-04-02
  • 如何用redis setNX命令来加锁
    目录用Redis setNX命令来加锁redis几种加锁的实现1. redis加锁分类2. 第一种锁命令INCR3. 第二种锁SETNX4. 第三种锁SET5. 其它问题6. 解决办法7. 另外一个锁总结用redis s...
    99+
    2023-01-09
    redis加锁 setNX命令来加锁 redissetNX命令
  • Redis实现分布式锁(setnx、getset、incr)以及如何处理超时情况
    目录一、通过setnx实现1、setnx key value2、get key3、getset key value小明提出了方案一:小宏说:小明的思想不严谨网上看还有一种方式(B):...
    99+
    2024-04-02
  • 如何使用Redis实现分布式锁
    这篇文章将为大家详细讲解有关如何使用Redis实现分布式锁,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。加锁部分解锁部分主要原理是使用了 redis 的 s...
    99+
    2024-04-02
  • 使用Redis如何实现分布式锁
    这篇文章主要介绍了使用Redis如何实现分布式锁的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇使用Redis如何实现分布式锁文章都会有所收获,下面我们一起来看看吧。 ...
    99+
    2024-04-02
  • redis锁机制的实现方式有哪些
    Redis锁的实现方式主要有以下几种:1. 设置过期时间:通过设置一个键值对,并给定一个过期时间,利用Redis的SETNX(SET...
    99+
    2023-08-12
    redis
  • redis锁如何实现
    redis锁使用redis数据库实现互斥锁:通过setnx命令原子性设置键,若键存在则不操作。使用expire命令设置键过期时间。获取锁后删除键即可释放锁。 Redis锁的实现机制 R...
    99+
    2024-04-20
    redis
  • Mysql锁机制中行锁、表锁、死锁如何实现
    这篇文章主要介绍了Mysql锁机制中行锁、表锁、死锁如何实现,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、Mysql锁是什么?锁有哪些类别?锁定义:  ...
    99+
    2023-06-29
  • 如何在Redis中实现分布式锁的阻塞等待机制
    在Redis中实现分布式锁的阻塞等待机制可以使用Redis的BLPOP命令和SETNX命令结合实现。下面是一种基本的实现方式: 使...
    99+
    2024-04-09
    Redis
  • 如何在Redis中实现分布式锁的自动续期机制
    实现分布式锁的自动续期机制可以通过以下步骤在Redis中实现: 获取锁时设置一个过期时间,确保锁在一定时间内会自动释放。 使用一个...
    99+
    2024-03-14
    Redis
  • 如何实现Redis的LRU缓存机制
    这篇文章给大家分享的是有关如何实现Redis的LRU缓存机制的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。前言最近在逛博客的时候看到了有关Redis方面的面试题,其中提到了Redis在内存达到最大限制的时候会使用...
    99+
    2023-06-14
  • SpringBoot之如何使用Redis实现分布式锁
    小编给大家分享一下SpringBoot之如何使用Redis实现分布式锁,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!springboot是什么springboot一种全新的编程规范,其设计目的是用来简化新Spring应用的...
    99+
    2023-06-14
  • Redis中如何使用Watch命令实现乐观锁
    在Redis中使用Watch命令实现乐观锁的步骤如下: 使用MULTI命令开启事务。 使用WATCH命令监视一个或多个指定的键。 ...
    99+
    2024-05-07
    Redis
  • Mysql锁机制之行锁、表锁、死锁的实现
    目录一、Mysql锁是什么?锁有哪些类别?二、行锁和表锁的区别三、InnoDB死锁概念和死锁案例死锁场景一之select for update:死锁场景二之两个update...
    99+
    2024-04-02
  • Redis分布式锁如何实现
    这篇文章将为大家详细讲解有关Redis分布式锁如何实现,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。什么是分布式锁?要介绍分布式锁,首先要提到与分布式锁相对应的是线程锁、...
    99+
    2024-04-02
  • 如何使用注解方式实现 Redis 分布式锁
    目录引入 Redisson初始化 Redisson编写 Redisson 分布式锁工具类声明注解 @Lock注解解析类引入 Redisson <dependency> ...
    99+
    2024-04-02
  • Redis如何实现分布式锁
    目录一、前言二、正文今天我们来聊一聊分布式锁的那些事。 相信大家对锁已经不陌生了,我们在多线程环境中,如果需要对同一个资源进行操作,为了避免数据不一致,我们需要在操作共享资源之前进行...
    99+
    2024-04-02
  • Redis分布式锁是如何实现的
    Redis分布式锁是通过在Redis中使用SETNX命令来实现的。SETNX命令用于将一个键的值设置为指定的字符串,只有当键不存在时...
    99+
    2024-04-02
  • java如何使用redis加锁
    目录java使用redis加锁redis锁用法java代码总结java使用redis加锁 1.编写LockUtil工具类 import org.springframework.bea...
    99+
    2023-01-09
    java使用redis加锁 java redis加锁 redis加锁
  • redis中RedissonLock如何实现等待锁的
    目录前言问题方案tryLockunlockInnerAsync思考前言 经常会有到这样的需求,就是在一个查询接口,第一次查询的时候,如果没有查询到就要执行初始化方法,初始化数据出来...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作