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)
本人实际工作中遇到类似需求,所以在此记录共享一下,大家共勉。