美文网首页
Redis应用-分布式锁

Redis应用-分布式锁

作者: zhchenxin | 来源:发表于2018-12-02 13:58 被阅读0次

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

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

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

  • 原子性:获取锁和删除锁必须满足原子性,即在这两个过程中,不能出现中间失败的情况。
  • 超时时间:如果一个客户端获取到锁之后挂掉了,就会造成死锁。因此,需要在获取锁中添加超时时间,在超时时间过了之后,自动释放锁。
  • 客户端标识:这是由超时时间引起的,如果没有客户端标识,可能会出现某个超时的进程将其他进程获取到的锁删除的情况。

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实现分布式锁

相关文章

网友评论

      本文标题:Redis应用-分布式锁

      本文链接:https://www.haomeiwen.com/subject/wvejcqtx.html