phpredis

php 中操作 redis 一般使用 phpredis 这个扩展,redis 中是可以执行 lua 脚本,今天接触的一个分布式锁框架正是利用了 lua 脚本操作 redis 可以保持原子性。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
    public function unLock() : bool
{
$lua = <<<LUA
local hashVal = redis.call("GET", KEYS[1]);
if (hashVal ~= ARGV[1]) then
return 0;
end;

return redis.call("DEL", KEYS[1]);
LUA;

try {
$eval = $this->getConnection()->eval($lua, [$this->key, $this->value], 1);

if ($eval) {
CLog::debug(
'worker[%s] co[%s]successful release unlock',
$this->getWorkId(),
Co::tid()
);
}

return (bool) $eval;
} catch (Throwable $e) {
CLog::error($e->getMessage());
throw $e;
}
}

eval 正是执行 lua 脚本的方法,第一个参数为 lua 脚本,第二个参数是传进 lua 中的kv 参数,第三个参数表示有几对参数

参考文档

坚持原创技术分享,您的支持将鼓励我继续创作!