【问题标题】:How to use redis "memory usage keyname" command with laravel facade redis? we can use all command except memory command如何在 laravel 外观 redis 中使用 redis“内存使用键名”命令?我们可以使用除内存命令之外的所有命令
【发布时间】:2020-03-27 12:29:54
【问题描述】:

我们可以在 laravel 中使用以下命令。

$user = Redis::get('user:profile:'.$id); 
$values = Redis::lrange('names', 5, 10);
$values = Redis::command('lrange', ['name', 5, 10]);

但不能将 memory usage keyname 命令与 laravel redis 外观一起使用。

【问题讨论】:

    标签: laravel redis predis phpredis laravel-facade


    【解决方案1】:

    简短的回答不,你不能执行。让我解释一下;

    public function createCommand($commandID, array $arguments = array())
    {
        $commandID = strtoupper($commandID);
    
        if (!isset($this->commands[$commandID])) {
            throw new ClientException("Command '$commandID' is not a registered Redis command.");
        }
    
        $commandClass = $this->commands[$commandID];
        $command = new $commandClass();
        $command->setArguments($arguments);
    
        if (isset($this->processor)) {
            $this->processor->process($command);
        }
    
        return $command;
    }
    

    当你调用方法时使用这个方法,它使用这个抽象方法来决定你是否可以调用一个方法。

    abstract protected function getSupportedCommands();
    

    getSupportedCommands 方法如下所示;

    public function getSupportedCommands()
    {
        return array(
            /* ---------------- Redis 1.2 ---------------- */
    
            /* commands operating on the key space */
            'EXISTS'                    => 'Predis\Command\KeyExists',
            'DEL'                       => 'Predis\Command\KeyDelete',
            'TYPE'                      => 'Predis\Command\KeyType',
            'KEYS'                      => 'Predis\Command\KeyKeys',
            'RANDOMKEY'                 => 'Predis\Command\KeyRandom',
            'RENAME'                    => 'Predis\Command\KeyRename',
            'RENAMENX'                  => 'Predis\Command\KeyRenamePreserve',
            'EXPIRE'                    => 'Predis\Command\KeyExpire',
            'EXPIREAT'                  => 'Predis\Command\KeyExpireAt',
            'TTL'                       => 'Predis\Command\KeyTimeToLive',
            'MOVE'                      => 'Predis\Command\KeyMove',
            'SORT'                      => 'Predis\Command\KeySort',
            'DUMP'                      => 'Predis\Command\KeyDump',
            'RESTORE'                   => 'Predis\Command\KeyRestore',
            ....
            ...
            ..
    

    memory usage 命令在此方法中不可用。您可以检查/vendor/predis/predis/src/Profile/RedisVersion300.phpProfile 文件夹中的任何其他类 - 它没有在其中定义。

    原因是 memory usage 方法自 Redis 版本 4.0.0 起可用。这个包在 Redis 版本 3.0.0 之前支持命令,这可以从 RedisVersion240RedisVersion300 等类名中看出。

    【讨论】:

    • 谢谢您的回答,但我怎么知道哪个密钥存储了多少内存?我们可以在 redis-cli 中通过memory usage keyname 进行检查,但我想显示每个键使用了多少内存
    • 在redis中扫描所有keys并一一执行memory usage会很昂贵。我不确定域,但您可以尝试运行 redis-cli --bigkeys 以查看一些最大的域,具体取决于数据类型(字符串、哈希、集合等)@parekhpankaj
    • @parekhpankaj 请检查此链接gist.github.com/epicserve/5699837(我不是此脚本的所有者)它看起来涵盖了您的情况。
    • 我无法在 laravel 中运行此脚本。我需要运行 laravel 控制器,然后需要在视图中显示键内存。
    • @parekhpankaj 你也不应该经常运行这个。它有keys 命令。仍然如果你想使用这个stackoverflow.com/questions/46208801/… - 将结果保存在文本文件/数据库表中,并以另一种方法从文件/数据库表中读取
    【解决方案2】:

    没有为此定义命令,但您可以使用 eval:

    Redis::connection('connection')->eval("return redis.call('memory', 'usage', 'keyname')", 0)
    

    或者如果您想使用键名作为参数:

    Redis::connection('connection')->eval("return redis.call('memory', 'usage', KEYS[1])", 1, 'keyname');
    

    Redis LUA 脚本在 laravel 中的执行方式相同

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-13
      • 2021-05-09
      • 2013-11-23
      • 2013-03-16
      • 1970-01-01
      • 1970-01-01
      • 2020-02-29
      • 1970-01-01
      相关资源
      最近更新 更多