使用通配符在Redis中移除哈希属性
在Redis中,我们可以使用通配符,比如:
KEYS foo*
-> 用来查找键。
现在我想用通配符删除哈希表中特定的字段。考虑以下例子,创建一个哈希表:
HMSET myhash f "g" field1 "Hello" field2 "World"
现在我想用通配符删除键,像这样:
DEL myha*
这样做可以吗?
另外,我还想用通配符从集合中删除特定的字段,像这样:
DEL myhash field*
这样也可以吗?
提前谢谢你。
1 个回答
2
要从SET中删除特定字段并使用通配符,你可以使用这个LUA脚本:
-- ARGV[1] - hash key
-- ARGV[1] - lua pattern
local fields = redis.call("HKEYS", ARGV[1]);
local retVal = {};
for key, value in pairs(fields) do
if (string.match(value, ARGV[2])) then
table.insert(retVal, value);
redis.call("HDEL", ARGV[1], value);
end
end
return retVal;
这个脚本的复杂度是O(n),意思是它的运行时间和你要处理的数据量成正比。脚本会返回根据给定模式删除的字段。你可以查看这个字符串匹配教程,了解LUA的模式匹配功能。
下面是一个在PHP
中使用phpredis
的示例:
$r = new Redis();
$r->connect('127.0.0.1');
for ($i = 1; $i < 1000; $i++) {
$r->hSet('myhash', 'aaa' . mt_rand(0, PHP_INT_MAX), 1);
}
$r->hSet('myhash', 'bad', 1);
$script = <<< SCR
local fields = redis.call("HKEYS", ARGV[1]);
local retVal = {};
for key, value in pairs(fields) do
if (string.match(value, ARGV[2])) then
table.insert(retVal, value);
redis.call("HDEL", ARGV[1], value);
end
end
return retVal;
SCR;
var_dump($r->eval($script, ['myhash', '^b.+']));