phpredis使用lua脚本操作hmset命令

redis使用lua脚本的形式进行操作这样的好处可以保证多条命令的原子性,而且也会提升程序的执行效率。

接下来我们先模拟一组数据来进行创建数据以及保存过期时间的原子性操作:

$configs = [
    "key1" => [
        "value1" => "this is key1->value1",
        "value2" => "this is key1->value2",
        "value3" => "this is key1->value3"
    ],
    "key2" => [
        "value1" => "this is key2->value1",
        "value2" => "this is key2->value2",
        "value3" => "this is key2->value3"
    ],
    "key3" => [
        "value1" => "this is key3->value1",
        "value2" => "this is key3->value2",
        "value3" => "this is key3->value3"
    ]
];

此时我们要将这个$configs数组的每个下标(key1、key2、key3)作为redisHash值的key,value1...value3作为每一个redisHash的field和value。

示例代码演示:

public function redisSave() {

        $configs = [
            "key1" => [
                "value1" => "this is key1->value1",
                "value2" => "this is key1->value2",
                "value3" => "this is key1->value3"
            ],
            "key2" => [
                "value1" => "this is key2->value1",
                "value2" => "this is key2->value2",
                "value3" => "this is key2->value3"
            ],
            "key3" => [
                "value1" => "this is key3->value1",
                "value2" => "this is key3->value2",
                "value3" => "this is key3->value3"
            ]
        ];

        $redis = Redis::connection("syslog_server_original");

        $lua_script = <<<LUA
            local cache_key = "cache_key:"
            local configs = cjson.decode(KEYS[1])
            for router, config in pairs(configs) do
                local payload = {}
                for k, v in pairs(config) do
                    table.insert(payload, k)
                    table.insert(payload, v)
                end
                redis.pcall('hmset', cache_key .. router, unpack(payload))
                redis.pcall('expire', cache_key .. router, 60)
            end
            return 1
LUA;
        $redis->command('eval', [$lua_script, [json_encode($configs)], 1]);

    }

查看储存状态:

 

 

lua脚本中需要用到的几个关键内置函数(for、redis.pcall、cjson.decode、unpack)

本人实际工作中遇到类似需求,所以在此记录共享一下,大家共勉。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值