2014-05-08 60 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.+']));