• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
车车大人
博客园    首页    新随笔    联系   管理     

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

 

通往牛逼的路上,在意的只有远方!
posted @ 2021-12-14 19:10  车车大人  阅读(321)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3