如何自动删除使用Redis匹配模式的密钥

在我的Redis DB中,我有一些prefix:<numeric_id>散列。

有时候我想以原子的方式清除它们。 如何在不使用分布式锁定机制的情况下做到这一点?


从redis 2.6.0开始,您可以运行原子执行的lua脚本。 我从来没有写过,但我认为它会看起来像这样

EVAL "return redis.call('del', unpack(redis.call('keys', ARGV[1])))" 0 prefix:*

请参阅EVAL文档。


在bash中执行:

redis-cli KEYS "prefix:*" | xargs redis-cli DEL

UPDATE

好,我明白了。 这样的方式:存储当前额外的增量前缀,并将其添加到您的所有密钥。 例如:

你有这样的价值观:

prefix_prefix_actuall = 2
prefix:2:1 = 4
prefix:2:2 = 10

当您需要清除数据时,首先更改prefix_actuall(例如设置prefix_prefix_actuall = 3),以便您的应用程序将新密钥写入前缀:3:1和前缀:3:2。 然后,您可以安全地从前缀:2:1和前缀:2:2中取出旧值并清除旧密钥。


这是一个在Lua中实现的通配符删除的完整工作原子版本。 它会因少得多网络备份和来回跑的比xargs的版本快得多,而且完全原子,阻止任何其他请求对Redis的,直到它完成。 如果你想以原子方式删除Redis 2.6.0或更高版本的密钥,这绝对是一种方式:

redis-cli -n [some_db] -h [some_host_name] EVAL "return redis.call('DEL', unpack(redis.call('KEYS', ARGV[1] .. '*')))" 0 prefix:

这是@ mcdizzle在回答这个问题时的想法的工作版本。 这个想法100%归功于他。

编辑:按照下面Kikito的评论,如果你有多个键,删除不是在您的Redis服务器的可用内存,你会碰到了“太多的元素,以解包”的错误。 在这种情况下,请执行:

for _,k in ipairs(redis.call('keys', ARGV[1])) do 
    redis.call('del', k) 
end

正如Kikito所建议的那样。

链接地址: http://www.djcxy.com/p/34151.html

上一篇: How to atomically delete keys matching a pattern using Redis

下一篇: DDS vs AMQP vs ZeroMQ