redis这个东西,挺有用的,但有时候存入了错误的key,还沙雕的没有设置过期时间的时候,尤其是当你存了好多,然后想去处理的时候,才发现这玩意好难用。总结了下批量删除的方法。
那么什么是xargs呢,网上给出的解释如下
xargs 是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。
xargs 可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据。
xargs 也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。
xargs 默认的命令是 echo,这意味着通过管道传递给 xargs 的输入将会包含换行和空白,不过通过 xargs 的处理,换行和空白将被空格取代。
xargs 是一个强有力的命令,它能够捕获一个命令的输出,然后传递给另外一个命令。
之所以能用到这个命令,关键是由于很多命令不支持|管道来传递参数,而日常工作中有有这个必要,所以就有了 xargs 命令xargs 一般是和管道一起使用。
命令格式:somecommand |xargs -item command
简单来说,就是|左边的命令执行的结果,传递给右边xargs后的命令,所以可以用这个方法来操作redis,先用keys 方法模糊查询出相关的key,然后传入del进行删除,思路有了,具体实现就是这样子:
$connect = "redis-cli -h '{$host}' -p {$port} -n {$db} -a '{$auth}'";
$command = " {$connect} keys '*{$key}*' | xargs --no-run-if-empty {$connect} del";
如此便可以删除想要删除的所有key
/**
* @param string $key
* @param string $type
* @return array
* 批量删除 redis_key
* 确保服务器已安装redis
*/
public static function rmRedisKeys($key='',$type='core'){
if(empty($key)){
return ['exec'=>0, 'command'=>'key不能为空'];
}
if(strpos($key,'*') !== false){
return ['exec'=>0, 'command'=>'禁止匹配所有key'];
}
$type = strval($type);
$config_key = "redis_{$type}";//省略redis_前缀
$redis_config = CUtil::getConfig($config_key,'common',\Yii::$app->id);
$auth = $redis_config['password'];
$db = $redis_config['database'];
$host = $redis_config['hostname'];
$port = $redis_config['port'];
$connect = "redis-cli -h '{$host}' -p {$port} -n {$db} -a '{$auth}'";
$command = " {$connect} keys '*{$key}*' | xargs --no-run-if-empty {$connect} del";
if(empty($auth)){
$command = str_replace("-a '{$auth}'",'',$command);
}
exec($command,$output);
return ['exec'=> $output, 'command'=>$command];
}
看看以下链接的内容,基本就搞懂xargs的用法了
linux xargs
0 条评论