如何在redis中清除与某个字符串域相关联的所有哈希?

时间:2015-03-01 17:22:45

标签: redis

例如,我有User:1User:2User:3 ... User:2000。我想删除所有User,以便我可以重新开始。有没有办法在不知道确切密钥的情况下执行此操作,只是因为我要删除User域中的所有密钥?我有兴趣将此作为应用程序服务器启动任务的一部分。

1 个答案:

答案 0 :(得分:0)

比使用'更好的方法'扫描所有密钥并通过正则表达式匹配删除,将使用标记机制,在服务器中维护Redis SET,其中包含Tag-Keys关系,如此帖子中的那个:http://stackify.com/implementing-cache-tagging-redis/

我使用类似的方法,这是我最终用来设置与一个或多个标签相关的键值的Lua脚本:

local tagcount = 0
local cacheKey = KEYS[1]
local exp = ARGV[2]
local setValue = ARGV[1]

-- For each Tag, add the reference to the TagKey Set
for i=2,#KEYS do
    local tag = ':tag:' .. KEYS[i]
    local tagTtl = redis.call('ttl', tag)
    tagcount = tagcount + redis.call('sadd', tag, cacheKey)
    if(exp ~= nil and tagTtl ~= -1) then
        -- Tag is volatile or was not found. Expiration provided. Set the Expiration.
        redis.call('expire', tag, math.max(tagTtl, exp))
    else
        -- Tag is not volatile or the key to add is not volatile, mark the tag SET as not volatile
        redis.call('persist', tag)
    end
end

-- Set the cache key-value
if(setValue) then
    if(exp ~= nil) then
            redis.call('setex', cacheKey, exp, setValue)
    else
            redis.call('set', cacheKey, setValue)
    end
end
return tagcount

请注意前缀":标记:"到表示标签SET的键。

如果您不需要以原子方式按标记删除密钥,则可以在两个操作中使用Redis客户端执行此操作,例如通过获取标记的成员" user"使用SMEMBERS :tag:user并使用DEL key1 key2 ..命令删除密钥。