redis+lua+锁 解决一定程度的并发和分布式处理数据冲突

不管是什么程序,都讲究原子性
原子性,通俗来说,就是处理数据时不会被任何操作插队
具体的可以看一下这篇文章,个人觉得通俗易懂

如何优雅地用Redis实现分布式锁?
https://baijiahao.baidu.com/s?id=1623086259657780069&wfr=spider&for=pc

主要还是了解一下redis中如何使用lua脚本(不想用linux命令的兄贵,可以用redis中eval()函数)

# script:     你的lua脚本
# numkeys:     key的个数
# key:         redis中各种数据结构的替代符号
# arg:         你的自定义参数
# scriptsha:   加密串

# linux执行脚本命令
redis-cli --eval script key1 key2 , arg1 arg2

# 将脚本内容加载到Redis内存中,可节省资源,会得到一个sha加密串
redis-cli script load “$(cat script)”

# 用上面的加密串来执行脚本
redis-cli --evalsha scriptsha key1 key2 , arg1 arg2

以下是我写了一下最基本的类
首先安装一下redis公共类

composer require predis/predis

至于lua脚本,看一下语法,都能上手最基础的,这里就不多说了
https://www.cnblogs.com/yanghuahui/p/3697996.html

_redis = new Client(['host' => $host,'port' => $port]);
    }

    /**
     * @param $key
     * @param int $sec
     * @param int $val
     */
    public function lock($key, $sec = 2, $val = 1)
    {
        $this->_redis->setex($key, $sec, $val);
    }

    /**
     * @param $key
     * @param $value
     * @param string $lua           | lua脚本地址(可绝对可相对)
     * @param string $scriptsha     | 加密sha
     * @return bool
     */
    public function unlock($key, $val, $lua = '', $scriptsha = '')
    {
        if(!$lua && !$scriptsha)
            return false;
        $command = $scriptsha
            ? 'redis-cli --evalsha '.$scriptsha.' '.$key.' , '.$val
            : 'redis-cli --eval '.$lua.' '.$key.' , '.$val;
        !$this->_redis->get($key) ? $res = false : exec($command, $res);
        return $res;
    }

    /**
     * 将脚本内容加载到Redis内存中,调用速度快,会返回SHA1 校验,之后就用这个校验码执行
     * @param $lua   | lua脚本地址(可绝对可相对)
     */
    public function load($lua)
    {
        exec('redis-cli  script load "$(cat '.$lua.')"', $res);
        return $res;
    }
}

调用方式

$redisLock = new xxx\RedisLock();

$redisLock->lock($key);
$redisLock->unlock($key, $value, $lua);
$redisLock->load($lua);

你可能感兴趣的:(记录一下)