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 条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据