在我的Redis DB中,我有一些前缀:<numeric_id>哈希值。

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


当前回答

再加上这个答案:

要找到前1000个键:

EVAL "return redis.call('scan', 0, 'COUNT', 1000, 'MATCH', ARGV[1])" 0 find_me_*

删除它们:

EVAL "return redis.call('del', unpack(redis.call('SCAN', 0, 'COUNT', 1000, 'MATCH', ARGV[1])[2]))" 0 delete_me_*

其他回答

如果我们想要确保原子操作,我们可以尝试编写一个Lua脚本。

如果你的Redis版本支持SCAN和UNLINK(高于4.0.0),我更喜欢在生产环境中使用SCAN和UNLINK而不是Key和DEL,因为Key和DEL命令可能会阻塞

它们可以在生产环境中使用,而没有KEYS或members等命令的缺点,这些命令在针对大量键或元素集合调用时可能会阻塞服务器很长时间(甚至几秒钟)。

EVAL "local cursor = 0 repeat local result = redis.call('SCAN', cursor, 'MATCH', ARGV[1])    for _,key in ipairs(result[2]) do  redis.call('UNLINK', key)   end  cursor = tonumber(result[1]) until cursor == 0 " 0 prefix:*

我们可以随意更改前缀:*。

如果你使用windows环境,请遵循以下步骤,它一定会工作:

Download GOW from here - https://github.com/bmatzelle/gow/wiki (because xargs command doesn't works in windows) Download redis-cli for Windows (detailed explanation is here - https://medium.com/@binary10111010/redis-cli-installation-on-windows-684fb6b6ac6b) Run cmd and open directory where redis-cli stores (example: D:\Redis\Redis-x64-3.2.100) if you want to delete all keys which start with "Global:ProviderInfo" execute this query (it's require to change bold parameters (host, port, password, key) and write yours, because of this is only example): redis-cli -h redis.test.com -p 6379 -a redispassword --raw keys "Global:ProviderInfo*" | xargs redis-cli -h redis.test.com -p 6379 -a redispassword del

这是不用任何xargs魔法就能想到的最简单的方法

纯bash !

redis-cli DEL $(redis-cli KEYS *pattern*)

我尝试了上面提到的大部分方法,但对我来说都不奏效,经过一些搜索,我发现了以下几点:

如果你在redis上有多个数据库,你应该使用-n [number]来确定数据库。 如果你有几个键使用del,但如果有成千上万或数百万个键,最好使用unlink,因为unlink是非阻塞的,而del是阻塞的,更多信息请访问这个页面unlink vs del 键也像del和is blocking

所以我用这段代码按模式删除键:

 redis-cli -n 2 --scan --pattern '[your pattern]' | xargs redis-cli -n 2 unlink 

如果您的键包含特殊字符(例如Guide$CLASSMETADATA][1]),则其他答案可能无法工作。将每个键包装成引号将确保它们被正确删除:

redis-cli --scan --pattern sf_* | awk '{print $1}' | sed "s/^/'/;s/$/'/" | xargs redis-cli del