Redis应用-分布式锁

2018-12-02  本文已影响0人  zhchenxin

锁是多线程编程的一个重要功能,它主要用于防止多个线程同时访问一个资源,从而造成资源出问题的情况。

传统的锁是在单机范围之内的,在同一台机器上,如果是分布式应用,则我们必须保证多台机器访问一个资源的串行。这时就需要使用分布式锁来实现。

分布式锁主要有两个步骤组成,获取锁和删除锁,并且这两个步骤必须考虑一下几个条件:

Laravel 框架的实现方案

<?php

namespace App\Utils;


use Illuminate\Support\Facades\Redis;

class RedisLock
{
    public static function lock($key, $requestId, $expire)
    {
        $res = Redis::command('set', [$key, $requestId,'EX', $expire, 'NX']);
        return strtoupper($res) === 'OK';
    }

    public static function unlock($key, $requestId)
    {
        $res = Redis::eval("if redis.call('get', KEYS[1]) == KEYS[2] then return redis.call('del', KEYS[1]) else return 0 end", 2, $key, $requestId);
        return strtoupper($res) === 'OK';
    }
}

参考资料

  1. SET — Redis 命令参考
  2. EVAL — Redis 命令参考
  3. 如何优雅地用Redis实现分布式锁
上一篇 下一篇

猜你喜欢

热点阅读