在我的Redis DB中,我有一些前缀:<numeric_id>哈希值。
有时我想把它们都原子地清除掉。如何在不使用分布式锁定机制的情况下做到这一点呢?
在我的Redis DB中,我有一些前缀:<numeric_id>哈希值。
有时我想把它们都原子地清除掉。如何在不使用分布式锁定机制的情况下做到这一点呢?
当前回答
这是不用任何xargs魔法就能想到的最简单的方法
纯bash !
redis-cli DEL $(redis-cli KEYS *pattern*)
其他回答
再加上这个答案:
要找到前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_*
使用SCAN而不是KEYS(推荐用于生产服务器)和——pipe而不是xargs的版本。
与xargs相比,我更喜欢pipe,因为它更有效,并且在键包含引号或shell尝试和解释的其他特殊字符时也能工作。本例中的regex替换用双引号包装键,并转义其中的任何双引号。
export REDIS_HOST=your.hostname.com
redis-cli -h "$REDIS_HOST" --scan --pattern "YourPattern*" > /tmp/keys
time cat /tmp/keys | perl -pe 's/"/\\"/g;s/^/DEL "/;s/$/"/;' | redis-cli -h "$REDIS_HOST" --pipe
@mcdizle的解决方案是行不通的,它只适用于一个条目。
这一项适用于具有相同前缀的所有键
EVAL "for i, name in ipairs(redis.call('KEYS', ARGV[1])) do redis.call('DEL', name); end" 0 prefix*
注意:你应该用你的密钥前缀替换'prefix'…
我在redis 3.2.8中使用以下命令
redis-cli KEYS *YOUR_KEY_PREFIX* | xargs redis-cli DEL
您可以从这里获得更多有关键模式搜索的帮助:- https://redis.io/commands/keys。使用您方便的全局样式模式,如*YOUR_KEY_PREFIX*或YOUR_KEY_PREFIX??或者其他的。
如果你已经集成了Redis PHP库,下面的函数将帮助你。
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中有很多类型的键,比如-
“xyz_category_fpc_12” “xyz_category_fpc_245” “xyz_category_fpc_321” “xyz_product_fpc_876” “xyz_product_fpc_302” “xyz_product_fpc_01232”
Ex- 'xyz_category_fpc'这里xyz是一个站点名称,这些键与电子商务网站的产品和类别相关,由FPC生成。
如果您像下面那样使用此命令-
redis-cli --scan --pattern 'key*' | xargs redis-cli del
OR
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:
FLUSHDB -从连接的当前数据库中删除数据。 FLUSHALL—从所有数据库中删除数据。
例如:-在你的壳:
redis-cli flushall
redis-cli flushdb