要使用通配符您可以使用此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來解決第二個問題。 –