在我的 Redis 数据库中,我有许多 prefix:<numeric_id>
哈希。
有时候我想要原子性地清除它们所有。如何在不使用任何分布式锁机制的情况下实现这一点?
在我的 Redis 数据库中,我有许多 prefix:<numeric_id>
哈希。
有时候我想要原子性地清除它们所有。如何在不使用任何分布式锁机制的情况下实现这一点?
在bash中执行:
redis-cli KEYS "prefix:*" | xargs redis-cli DEL
更新
好的,我明白了。你可以这样做:储存当前的额外增量前缀并将其添加到所有的键中。例如:
你有以下这些值:
prefix_prefix_actuall = 2
prefix:2:1 = 4
prefix:2:2 = 10
在清除数据时,您首先更改prefix_actuall(例如将prefix_prefix_actuall设置为3),这样您的应用程序将向键prefix:3:1和prefix:3:2写入新数据。然后,您可以安全地从prefix:2:1和prefix:2:2中获取旧值并清除旧键。
redis-cli KEYS "prefix:*" | xargs --delim='\n' redis-cli DEL
- overthinkEVAL "local keys = redis.call('keys', ARGV[1]) \n for i=1,#keys,5000 do \n redis.call('del', unpack(keys, i, math.min(i+4999, #keys))) \n end \n return keys" 0 prefix:*
。 - sheerundel prefix:*
应该成为一项基本操作 :/ - RayEVAL "return redis.call('del', 'defaultKey', unpack(redis.call('keys', ARGV[1])))" 0 prefix:*
。 - manuelmhtrredis-cli -n [some_db] -h [some_host_name] EVAL "return redis.call('DEL', unpack(redis.call('KEYS', ARGV[1] .. '*')))" 0 prefix:
这是@mcdizzle在回答这个问题中提出的想法的工作版本。完全归功于他。
编辑:根据Kikito在下面的评论中所说,如果你要删除的键比Redis服务器上的可用内存还多,你会遇到“太多元素无法解包”错误。在这种情况下,请执行:
for _,k in ipairs(redis.call('keys', ARGV[1])) do
redis.call('del', k)
end
for _,k in ipairs(redis.call('keys', KEYS[1])) do redis.call('del', k) end
。 - kikitounpack
函数将一个表转换为“独立变量列表”(其他语言称之为explode
),但其最大数量不受系统内存影响。在Lua中,它通过LUAI_MAXSTACK
常量进行固定。在Lua 5.1和LuaJIT中,它是8000,在Lua 5.2中是100000。在我看来,建议使用for循环选项。 - kikitoEVAL
命令的语义,因为它不预先指定要操作的键。它应该可以在单个实例上运行,但不能保证在 Redis 集群中工作。 - Kevin Christopher Henry免责声明:以下解决方案不提供原子性。
从v2.8开始,你确实想要使用SCAN命令代替KEYS[1]。以下Bash脚本演示了通过模式删除键:
#!/bin/bash
if [ $# -ne 3 ]
then
echo "Delete keys from Redis matching a pattern using SCAN & DEL"
echo "Usage: $0 <host> <port> <pattern>"
exit 1
fi
cursor=-1
keys=""
while [ $cursor -ne 0 ]; do
if [ $cursor -eq -1 ]
then
cursor=0
fi
reply=`redis-cli -h $1 -p $2 SCAN $cursor MATCH $3`
cursor=`expr "$reply" : '\([0-9]*[0-9 ]\)'`
keys=${reply##[0-9]*[0-9 ]}
redis-cli -h $1 -p $2 DEL $keys
done
[1] KEYS 是一个可能会导致 DoS 的危险命令。以下是它的文档页面上的引用:
警告: 将 KEYS 视为一条应该极度谨慎使用的命令,仅在生产环境中使用。当执行大型数据库时,它可能会破坏性能。此命令旨在进行调试和特殊操作,例如更改键空间布局。不要在常规应用程序代码中使用 KEYS。如果您正在寻找在键空间子集中查找键的方法,请考虑使用 sets。
更新: 相同基本效果的单行代码 -
$ redis-cli --scan --pattern "*:foo:bar:*" | xargs -L 100 redis-cli DEL
redis-cli
调用中添加-n 1
:redis-cli -n 1 --scan --pattern“*:foo:bar:*”| xargs -L 100 redis-cli -n 1 DEL
。 - Rob Johansen对于那些阅读其他答案有困难的人:
eval "for _,k in ipairs(redis.call('keys','key:*:pattern')) do redis.call('del',k) end" 0
将 key:*:pattern
替换为你自己的模式,然后输入到 redis-cli
中,你就可以开始了。
感谢来自 lisco 的贡献:http://redis.io/commands/del
我正在使用Redis 3.2.8中的以下命令
redis-cli KEYS *YOUR_KEY_PREFIX* | xargs redis-cli DEL
你可以从这里获取更多有关键模式搜索的帮助:-https://redis.io/commands/keys。根据您的需求使用方便的 glob 样式,例如*YOUR_KEY_PREFIX*
或YOUR_KEY_PREFIX??
或任何其他样式。flushRedisMultipleHashKeyUsingPattern("*YOUR_KEY_PATTERN*"); //function call
function flushRedisMultipleHashKeyUsingPattern($pattern='')
{
if($pattern==''){
return true;
}
$redisObj = $this->redis;
$getHashes = $redisObj->keys($pattern);
if(!empty($getHashes)){
$response = call_user_func_array(array(&$redisObj, 'del'), $getHashes); //setting all keys as parameter of "del" function. Using this we can achieve $redisObj->del("key1","key2);
}
}
谢谢你 :)
redis-cli keys '*'|xargs redis-cli del
运行正常。 - Ismail您也可以使用此命令删除键:
假设您的 Redis 中有许多类型的键,例如:
例如 'xyz_category_fpc',这里的 xyz 是一个站点名称,这些键与电子商务网站的产品和类别相关,并由 FPC 生成。
如果您像下面这样使用此命令-
redis-cli --scan --pattern 'key*' | xargs redis-cli del
或者
redis-cli --scan --pattern 'xyz_category_fpc*' | xargs redis-cli del
它删除所有类似'xyz_category_fpc'的键(删除1、2和3个键)。要删除其他4、5和6号键,请在上面的命令中使用'xyz_product_fpc'。
如果您想要删除Redis中的全部内容,请按照以下命令执行:
使用redis-cli:
例如:在您的shell中:
redis-cli flushall
redis-cli flushdb
redis-cli del
不是原子性的。 - Alexander Gladyshredis-cli --scan --pattern 'xyz_category_fpc*' | xargs -I{} redis-cli del '{}'
- RazaEVAL "for i, name in ipairs(redis.call('KEYS', ARGV[1])) do redis.call('DEL', name); end" 0 prefix*
注意:您应该将“prefix”替换为您的键前缀...
EVAL "return redis.call('del', unpack(redis.call('keys', 'my_pattern_here*')))" 0
在这里,我用我的值替换了my_pattern_here
。
EVAL "return redis.call('del', unpack(redis.call('keys', 'my_pattern_here*')))" 0
- Andy如果你的键名中含有空格,你可以在bash中使用以下方法:
redis-cli keys "pattern: *" | xargs -L1 -I '$' echo '"$"' | xargs redis-cli del