自定义命令

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

脚本命令

可用于执行 Redis 脚本等。

1. EVAL 执行 Lua 脚本

调用形式:

  1. $res = $redis->rawCommand([
  2. 'EVAL',
  3. "lua script", # lua 脚本
  4. 'keyNums', # 指定脚本中键名参数的个数
  5. // 在脚本中所用到的那些 Redis 键(key) 值
  6. 'key1', # 第 1 个 key 对应的值
  7. 'key2', # 第 2 个 key 对应的值
  8. 'key3', # 第 3 个 key 对应的值
  9. ... # 多个 key 依次添加即可
  10. // 在 Lua 中通过全局变量 ARGV 数组访问,
  11. 'arg1', # 第 1 个附加 arg 参数对应的值
  12. 'arg2', # 第 2 个附加 arg 参数对应的值
  13. 'arg3', # 第 3 个附加 arg 参数对应的值
  14. ... # 多个 arg 参数依次添加即可
  15. ]);
  16. // 获取执行 `Lua` 脚本的调用结果
  17. var_dump($res->getData());

使用示例:

  1. $res = $redis->rawCommand([
  2. 'EVAL',
  3. "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}",
  4. '2',
  5. 'key1',
  6. 'key2',
  7. 'first',
  8. 'second'
  9. ]);
  10. // 获取执行 `Lua` 脚本的调用结果
  11. var_dump($res->getData());

2. EVALSHA 执行 Lua 脚本

  1. $res = $redis->rawCommand([
  2. 'SCRIPT',
  3. 'LOAD',
  4. "return 'hello moto'" # lua 脚本
  5. ]);
  6. $sha1 = $res->getData(); # SHA1 校验和
  7. var_dump($sha1);
  8. $res = $redis->rawCommand([
  9. 'EVALSHA',
  10. $sha1,
  11. '0'
  12. ]);
  13. var_dump($res->getData());

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

  1. // 载入一个脚本
  2. $res = $redis->rawCommand([
  3. 'SCRIPT',
  4. 'LOAD',
  5. "return 'hello moto'" # lua 脚本
  6. ]);
  7. $sha1 = $res->getData(); # SHA1 校验和
  8. var_dump($sha1);
  9. // 查看脚本是否被缓存
  10. $res = $redis->rawCommand([
  11. 'SCRIPT',
  12. 'EXISTS',
  13. $sha1,
  14. '0'
  15. ]);
  16. var_dump($res->getData()[0]);
  17. // 清空缓存
  18. $res = $redis->rawCommand([
  19. 'SCRIPT',
  20. 'FLUSH'
  21. ]);
  22. var_dump($res->getData());
  23. // 再次查看脚本是否被缓存
  24. $res = $redis->rawCommand([
  25. 'SCRIPT',
  26. 'EXISTS',
  27. $sha1
  28. ]);
  29. var_dump($res->getData()[0]);

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

  1. // 清空缓存
  2. $res = $redis->rawCommand([
  3. 'SCRIPT',
  4. 'FLUSH'
  5. ]);
  6. var_dump($res->getData());

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

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

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

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

基本使用

  1. $data = $redis->rawCommand(['set', 'a', '1']);
  2. var_dump($data);
  3. $data = $redis->rawCommand(['get', 'a']);
  4. var_dump($data);
  5. $redis->del('a');

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

  1. object(EasySwoole\Redis\Response)#8 (4) {
  2. ["status":protected]=>
  3. int(0)
  4. ["data":protected]=>
  5. string(2) "OK"
  6. ["msg":protected]=>
  7. NULL
  8. ["errorType":protected]=>
  9. NULL
  10. }
  11. object(EasySwoole\Redis\Response)#9 (4) {
  12. ["status":protected]=>
  13. int(0)
  14. ["data":protected]=>
  15. string(1) "1"
  16. ["msg":protected]=>
  17. NULL
  18. ["errorType":protected]=>
  19. NULL
  20. }