zoukankan      html  css  js  c++  java
  • Redis处理高并发 加锁

    背景说明

    在程序开发过程中,通常会遇到需要独占式的访问一些资源的情形,比如商品秒杀时扣减库存。这时就需要对资源加锁。实现锁的方式有很多,比如数据库锁、文件锁等等。本文简单介绍PHP中使用redis来实现加锁和解锁。实现方式参考了redis官方文档。

    示例代码

    代码环境:单redis实例,PHP5.6及以上,且需开启redis扩展

        $redis = new \Redis();
        $redis->connect('127.0.0.1');
    
        $lockKey = 'lock_key';
        $randValue = rand(10000, 99999);
    
        //lock
        $lock = $redis->set($lockKey, $randValue, ['NX', 'EX'=>1]);
        if($lock) {
            //do something
    
    
            //unlock
            $script = '
                if redis.call("get",KEYS[1]) == ARGV[1] then
                    return redis.call("del",KEYS[1])
                else
                    return 0
                end
            ';
            $redis->eval($script, [$lockKey, $randValue], 1);
        }

    代码说明

    这段代码会在资源未被锁定(NX选项)时获取锁,同时设定了1s的过期时间(EX)选项,可在代码出错或超时情况下自动释放锁。值被设定为一个随机数,且执行lua脚本来解锁,就不会误释放其它用户加的锁。

    更多参考:

    https://www.php.cn/redis/452685.html

    https://learnku.com/articles/4211/unlock-the-correct-position-of-the-redis-lock

    通往牛逼的路上,在意的只有远方!
  • 相关阅读:
    c++引用(reference)
    c++ 三目运算符功能增强
    C++ “新增”bool类型关键字
    C++ struct
    C++命名空间(namespace)
    基于python 实现KNN 算法
    Chrome 快捷键使用
    WOE(weight of evidence, 证据权重)
    python 命令运行环境下 ModuleNotFoundError: No module named 'Test'
    基于python 信用卡评分系统 的数据分析
  • 原文地址:https://www.cnblogs.com/ccdr/p/15689550.html
Copyright © 2011-2022 走看看