PHP中使用redis执行lua脚本例子

$redis = new Redis();  //实例化redis类
$redis->connect('127.0.0.1');  #链接服务器

$lua = <<<SCRIPT
     return   {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}
SCRIPT;

//对应的redis命令如下  eval  "return  {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}"  2  key1  key2  first  second

$s = $redis->eval($lua, array('key1', 'key2', 'first', 'second'), 2);
var_dump($s);

//解锁
$redis->del('lockkey');
$redis->set('lockkey', '123');
$lock = ['key' => 'lockkey', 'token'=>'123'];
var_dump(unlock($redis, $lock));

//批量获取hash的值
$redis->del('user:1', 'user:2', 'errKey');

$redis->hmset('user:1', ["age"=>21, "name"=>'jack']);
$redis->hset('user:2', "age", "22");
$redis->hset('user:2', "name", "tom");

$pipe = $redis->multi(Redis::PIPELINE);
$pipe->hgetAll('user:1');
$pipe->lpop('errKey');
$pipe->set('a', 100);
$pipe->hgetAll('user:2');
$pipeResult = $pipe->exec();
var_dump('PIPELINE-----', $pipeResult);
var_dump($result->get('a'));

$pipe = $redis->multi(Redis::MULTI);
$pipe->hgetAll('user:1');
$pipe->lpop('errKey');
$pipe->set('a', 200);
$pipe->hgetAll('user:2');
$pipeResult = $pipe->exec();
var_dump('MULTI---', $pipeResult);
var_dump($redis->get('a'));

$script = "local  rst={}; for  i,v pairs(KEYS)  do  rst[i]=redis.call('hgetall', v) end; return  rst";
var_dump('LUA---', $redis->eval($script, ['user:1', "user:2"], 2));
$redis->close(); #关闭连接

function unlock($redis, array  $lock)
{
    $key = $lock['key'];
    $token = $lock['token'];
    $script = '
               if   redis.call("GET", KEYS[1]) == ARGV[1]  then
                    return  redis.call("DEL",  KEYS[1])
               else
                    return 0
               end    
    ';
    return  $redis->eval($script,  [$key, $token], 1);
}
lua

$redis->eval($lua, array('key1','key2', 'first', 'second'), 2) 执行的命令如下:
eval "return {KEYS[1], KEYS[2], ARGV[1], ARGV[2]}" 2 key1 key2 first second
解释:
"return {KEYS[1], KEYS[2], ARGV[1], ARGV[2]}" 是被求值的Lua脚本,数字2指定了键名参数的数量,key1key2 是键名参数,分别使用KEYS[1]KEYS[2]访问,而最后的firstsecond则是附加参数,可以通过ARGV[1]ARGV[2]访问他们。

PHP中使用redis扩展执行脚本时,eval方法的参数 3个,第一个是脚本代码,第二个是一个数组,参数数组,第三个参数是个整数,表示第二个参数中的前几个键名,剩余的都是附加参数

multi与pipeline

Redis::MULTI方式会将命令逐条发给redis服务端,服务端缓冲。只有在需要使用实物时才选择Redis::MULTI方式,它可以保证发给redis的一系列命令以原子方式执行。但效率相应也是最低的。(不如连续发送多个执行快)

Redis::PIPELINE方式,可以将一系列命令打包发给redis服务端,客户端缓冲,不保证这些命令原子执行。如果只是为了一下执行多条redis命令,无需事务和原子性,那么应该选用Redis::PIPELINE方式。代码的性能会有大幅度提升!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值