Redis 实现锁

栏目: 数据库 · 发布时间: 5年前

内容简介:需求就不细说了,想必都遇到过要用数据锁的场景。看了一些资料以及其他的代码,修改记录下。基本原理就是使用 Redis 的 SETNX 命令来实现。设置失败时,说明这个锁正在使用中。在一定时间内,循环请求,直到当前锁释放,然后获得锁

导语

需求就不细说了,想必都遇到过要用数据锁的场景。看了一些资料以及其他的代码,修改记录下。

SETNX

基本原理就是使用 Redis 的 SETNX 命令来实现。

key 的值设为 value ,当且仅当 key

不存在。

若给定的 key 已经存在,则 SETNX 不做任何动作。

SETNX 是『SET if Not eXists』(如果不存在,则 SET)的简写。

返回值:

设置成功,返回 1

设置失败,返回 0

设置失败时,说明这个锁正在使用中。在一定时间内,循环请求,直到当前锁释放,然后获得锁

实例

<?php
include 'redis.php';// 前文中连接 Redis 的方法

$redis = getRedis();

function redisLock()
{
    $redis = getRedis();
    $redisKey = 'redisKey';
    $redisValue = time();

    for ($i = 0; $i < 150; $i++) {

        $flag = $redis->setnx($redisKey, $redisValue);
        if (!$flag) {
            // 获取锁失败
            usleep(200000);
            continue;
        }

        // 此处进行操作,操作完成后释放锁
        $redis->del($redisKey);
        return true;
    }

    // 防止死锁,超过 5 分钟删除
    if (time() - $redis->get($redisKey) > (60 * 5)) {
        $redis->del($redisKey);
    }
    return false;
}

参考资料: SETNX


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Writing Apache Modules with Perl and C

Writing Apache Modules with Perl and C

Lincoln Stein、Doug MacEachern / O'Reilly Media, Inc. / 1999-03 / USD 39.95

Apache is the most popular Web server on the Internet because it is free, reliable, and extensible. The availability of the source code and the modular design of Apache makes it possible to extend Web......一起来看看 《Writing Apache Modules with Perl and C》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具