使用通配符在Redis中移除哈希属性

1 投票
1 回答
1952 浏览
提问于 2025-04-18 05:50

在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.+']));

撰写回答