Laravel和redis扫描

时间:2016-02-18 09:13:14

标签: laravel laravel-5 redis laravel-5.2

我正在尝试使用redis scan和laravel。我可以发出一个返回10个键的请求,但我希望循环直到所有键都被返回。我不确定如何用laravel做到这一点。目前我有

$test = Redis::scan(0, 'match', '*keypattern*');

我不知道是否有“laravel”方式这样做。

修改

我使用composer导入predis/predis并使用

use Predis\Collection\Iterator;
use Predis;

...

$client = new Predis\Client([
    'scheme' => 'tcp',
    'host'   => 'localhost',
    'port'   => 6379,
]);

foreach (new Iterator\Keyspace($client, '*keypattern*') as $key) {
     $arr[] = $key;
}

但我想知道laravel方式

修改

Redis::scan

的var_dump
array(2) {
  [0]=>
  string(4) "23"
  [1]=>
  array(10) {
    [0]=>
    string(19) "key17"
    [1]=>
    string(19) "key72"
    [2]=>
    string(76) "key11"
    [3]=>
    string(19) "key73"
    [4]=>
    string(19) "key63"
    [5]=>
    string(19) "key87"
    [6]=>
    string(19) "key70"
    [7]=>
    string(19) "key65"
    [8]=>
    string(19) "key82"
    [9]=>
    string(19) "key43"
  }
}

2 个答案:

答案 0 :(得分:5)

由于Redis外观将命令直接传递给Predis(或者你可能会说Redis本身),这与Redis文档(http://redis.io/commands/scan)密切相关。您可以使用游标(第一个数组条目)进行后续调用以进行迭代,直到游标为零。

我已经整理了一个递归方法来扫描所有条目:

function scanAllForMatch ($pattern, $cursor=null, $allResults=array()) {

    // Zero means full iteration
    if ($cursor==="0") {
        return $allResults;
    }

    // No $cursor means init
    if ($cursor===null) {
        $cursor = "0";
    }

    // The call
    $result = Redis::scan($cursor, 'match', $pattern);

    // Append results to array
    $allResults = array_merge($allResults, $result[1]);

    // Recursive call until cursor is 0
    return scanAllForMatch($pattern, $result[0], $allResults);
}

请注意,您可能需要在递归之前添加$this,如果您在类中使用它(将是return $this->scanAllForMatch(...)

你会这样称呼它:

// Don't pass a cursor yourself!
$allResults = scanAllForMatch('*keypattern*');

答案 1 :(得分:4)

谢谢@martinczerwi 这是一个非递归版本:

function scanAllForMatch($pattern)
{
    $cursor = 0;
    do {
        list($cursor, $keys) = Redis::scan($cursor, 'match', $pattern);
        foreach ($keys as $key) {
            yield $key;
        }
    } while ($cursor);
}