自定义命令

Redis 客户端提供了 rawCommand 方法以供使用自定义命令,可以实现 eval 等脚本命令执行的支持

脚本命令

可用于执行 Redis 脚本等。

1. EVAL 执行 Lua 脚本

调用形式:

$res = $redis->rawCommand([
    'EVAL', 
    "lua script", # lua 脚本
    'keyNums',    # 指定脚本中键名参数的个数
    // 在脚本中所用到的那些 Redis 键(key) 值
    'key1',       # 第 1 个 key 对应的值
    'key2',       # 第 2 个 key 对应的值
    'key3',       # 第 3 个 key 对应的值
    ...           # 多个 key 依次添加即可
    // 在 Lua 中通过全局变量 ARGV 数组访问,
    'arg1',       # 第 1 个附加 arg 参数对应的值
    'arg2',       # 第 2 个附加 arg 参数对应的值
    'arg3',       # 第 3 个附加 arg 参数对应的值
    ...           # 多个 arg 参数依次添加即可
]);

// 获取执行 `Lua` 脚本的调用结果
var_dump($res->getData());

使用示例:

$res = $redis->rawCommand([
    'EVAL', 
    "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}",
    '2',
    'key1',
    'key2',
    'first',
    'second'
]);

// 获取执行 `Lua` 脚本的调用结果
var_dump($res->getData());

2. EVALSHA 执行 Lua 脚本

$res = $redis->rawCommand([
    'SCRIPT',
    'LOAD',
    "return 'hello moto'" # lua 脚本
]);

$sha1 = $res->getData(); # SHA1 校验和
var_dump($sha1);

$res = $redis->rawCommand([
    'EVALSHA',
    $sha1,
    '0'
]);
var_dump($res->getData());

3. SCRIPT 查看脚本是否被缓存

// 载入一个脚本
$res = $redis->rawCommand([
    'SCRIPT',
    'LOAD',
    "return 'hello moto'" # lua 脚本
]);
$sha1 = $res->getData(); # SHA1 校验和
var_dump($sha1);

// 查看脚本是否被缓存
$res = $redis->rawCommand([
    'SCRIPT',
    'EXISTS',
    $sha1,
    '0'
]);
var_dump($res->getData()[0]);

// 清空缓存
$res = $redis->rawCommand([
    'SCRIPT',
    'FLUSH'
]);
var_dump($res->getData());

// 再次查看脚本是否被缓存
$res = $redis->rawCommand([
    'SCRIPT',
    'EXISTS',
    $sha1
]);
var_dump($res->getData()[0]);

4. EVAL 从缓存中移除所有脚本

// 清空缓存
$res = $redis->rawCommand([
    'SCRIPT',
    'FLUSH'
]);
var_dump($res->getData());

5. EVAL 杀死当前正在运行的 Lua 脚本

// 杀死当前正在运行的 `Lua` 脚本
$res = $redis->rawCommand([
    'SCRIPT',
    'KILL'
]);
var_dump($res->getData());

6. EVAL 将脚本 script 添加到脚本缓存中,但并不立即执行这个脚本。

// 将脚本 `script` 添加到脚本缓存中,但并不立即执行这个脚本
$res = $redis->rawCommand([
    'SCRIPT',
    'LOAD',
    "return 'hello moto'" # lua 脚本
]);
$sha1 = $res->getData(); # SHA1 校验和
var_dump($sha1);

基本使用

$data = $redis->rawCommand(['set', 'a', '1']);
var_dump($data);

$data = $redis->rawCommand(['get', 'a']);
var_dump($data);

$redis->del('a');

rawCommand将返回一个EasySwoole\Redis\Response对象

object(EasySwoole\Redis\Response)#8 (4) {
  ["status":protected]=>
  int(0)
  ["data":protected]=>
  string(2) "OK"
  ["msg":protected]=>
  NULL
  ["errorType":protected]=>
  NULL
}
object(EasySwoole\Redis\Response)#9 (4) {
  ["status":protected]=>
  int(0)
  ["data":protected]=>
  string(1) "1"
  ["msg":protected]=>
  NULL
  ["errorType":protected]=>
  NULL
}