phpredis 执行LUA脚本的例子

$lua = <<<EOT
    local kws = {}
    local lrkws = {}
        local nkws = {}
        local kw_ids = {}
        local lr_ids = {}
        local n_ids = {}

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

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

        for _, v in ipairs(kw_ids) do
            redis.call('sadd', cache_key, v)
        end
        for _, v in ipairs(lr_ids) do
            redis.call('sadd', cache_key, v)
        end
        for _, v in ipairs(n_ids) do
            redis.call('sadd', cache_key, v)
        end
        redis.call('expire', cache_key, 600)
        return redis.call('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做区分。

参考网页: https://github.com/phpredis/phpredis/blob/develop/tests/RedisTest.php

©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值