要使用通配符您可以使用此Lua中删除SET特定领域:
-- 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)。脚本返回与给定模式匹配的已删除字段。看看string.match tutorial来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.+']));
对于DEL myha *,你可以参考http://stackoverflow.com/questions/4006324/how-to-atomically-delete-keys-matching- a-pattern-using-redis。但对于DEL myhash字段*,恐怕你需要一个脚本来做到这一点。 –
@BrandonGao thnx男子感兴趣。所以这是可能的。你可以给任何例子或资源链接? – userx
您可以参考原始的redis文档来编写脚本。但我认为你需要使用HDEL来解决第二个问题。 –