phpredis 执行LUA脚本的例子

时间:2025-02-09 11:40:33
$lua = <<<EOT
    local kws = {}
    local lrkws = {}
        local nkws = {}
        local kw_ids = {}
        local lr_ids = {}
        local n_ids = {}

        for kw in (KEYS[1], "[^|]+") do
            (kws, "kw:"..kw)
        end
        for kw in (KEYS[2], "[^|]+") do
            (lrkws, "lrkw:"..kw)
        end
        for kw in (KEYS[3], "[^|]+") do
            (nkws, "nkw:"..kw)
        end

        if #kws > 0 then
            kw_ids = ('sinter', unpack(kws))
        end
        if #lrkws > 0 then
            lr_ids = ('sinter', unpack(lrkws))
        end
        if #nkws > 0 then
            n_ids = ('sinter', unpack(nkws))
        end
        local cache_key = ARGV[1]

        for _, v in ipairs(kw_ids) do
            ('sadd', cache_key, v)
        end
        for _, v in ipairs(lr_ids) do
            ('sadd', cache_key, v)
        end
        for _, v in ipairs(n_ids) do
            ('sadd', cache_key, v)
        end
        ('expire', cache_key, 600)
        return ('scard', cache_key)
EOT;

    $ret = $redis->eval($lua, array("你好|谢谢", "", "hello", "cache_key"), 3);
    echo $ret;

例子中传入3个KEYS参数,1个ARGV参数。 KEYS参数是字符串,单词之间用 | 分割。
lua脚本最后将查询结果存入 ARGV参数指定的key中,并返回结果set的成员个数。

需要注意的是, eval函数的第3个参数为KEYS个数。 phpredis依据此值将KEYS和ARGV做区分。

参考网页: /phpredis/phpredis/blob/develop/tests/