redis 学习-11 lua脚本及php中的lua脚本

简介

用于高效地处理 CAS (check-and-set)命令,整个脚本会以原子性的方式执行

关于lua语言相关的就不说了,这里记录下再php中怎么使用lua,注意这里使用的是predis

/**
 * 定义命令类,需继承 ScriptCommand 类
 * Class MyMultipleSetNx
 */
class MyMultipleSetNx extends Predis\Command\ScriptCommand
{
    /**
     * key的数量
     * @return int
     */
    public function getKeysCount()
    {
        // 参数个数,等于-1则代表最后一个参数,其他的全部是key
        return 3;
    }

    /**
     * 脚本代码
     * @return string
     */
    public function getScript()
    {
        return <<<LUA
local result = {}
for key,value in pairs(KEYS) do
    if redis.call('exists', value) == 1 then
        result[key] = 0
    else
        result[key] = 1
        redis.call('set', value, ARGV[key])
    end
end
return result
LUA;
    }
}

$redisClient = new \Predis\Client('tcp://127.0.0.1:6379');
// 定义命令
$redisClient->getProfile()->defineCommand('myMsetNx', 'MyMultipleSetNx');
// 调用
$result = call_user_func_array([$redisClient, 'myMsetNx'], ['myMultipleNxKey1', 'myMultipleNxKey2', 'myMultipleNxKey3', 'myMultipleNxValue1', 'myMultipleNxValue2', 'myMultipleNxValue3']);

var_dump($result);

输出

[root@jin redis-test]# php-5.6.13 tes-redis.php 
/www_new/redis-test/tes-redis.php:42:
array(3) {
  [0] =>
  int(0)
  [1] =>
  int(0)
  [2] =>
  int(0)
}

标签: redis

添加新评论