2014-05-08 59 views
0

在Redis的,我们可以使用通配符一样,删除哈希属性通配符

KEYS foo* - >寻找钥匙。

现在我想使用通配符删除hashmap的特定字段。考虑如下。 创建的HashMap

HMSET myhash f "g" field1 "Hello" field2 "World" 

现在我想删除使用通配符键像

DEL myha* 

这可能吗?

此外,我想使用通配符从集中删除特定领域像

DEL myhash field* 

这也可能吗?

Thanx提前。

+0

对于DEL myha *,你可以参考http://stackoverflow.com/questions/4006324/how-to-atomically-delete-keys-matching- a-pattern-using-redis。但对于DEL myhash字段*,恐怕你需要一个脚本来做到这一点。 –

+0

@BrandonGao thnx男子感兴趣。所以这是可能的。你可以给任何例子或资源链接? – userx

+1

您可以参考原始的redis文档来编写脚本。但我认为你需要使用HDEL来解决第二个问题。 –

回答

1

要使用通配符您可以使用此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模式匹配功能。

使用示例中PHPphpredis

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