Laravel 和 redis 扫描
Laravel and redis scan
我正在尝试将 Redis scan
与 laravel 一起使用。我可以发出一个 returns 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方式
编辑:
var_dump单人Redis::scan
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"
}
}
由于 Redis facade 将命令直接传递给 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
,如果您在 class(将是 return $this->scanAllForMatch(...)
)
中使用它
你可以这样称呼它:
// Don't pass a cursor yourself!
$allResults = scanAllForMatch('*keypattern*');
谢谢@martinczerwi
这是一个非递归版本:
function scanAllForMatch($pattern)
{
$cursor = 0;
do {
list($cursor, $keys) = Redis::scan($cursor, 'match', $pattern);
foreach ($keys as $key) {
yield $key;
}
} while ($cursor);
}
我正在尝试将 Redis scan
与 laravel 一起使用。我可以发出一个 returns 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方式
编辑:
var_dump单人Redis::scan
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"
}
}
由于 Redis facade 将命令直接传递给 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
,如果您在 class(将是 return $this->scanAllForMatch(...)
)
你可以这样称呼它:
// Don't pass a cursor yourself!
$allResults = scanAllForMatch('*keypattern*');
谢谢@martinczerwi 这是一个非递归版本:
function scanAllForMatch($pattern)
{
$cursor = 0;
do {
list($cursor, $keys) = Redis::scan($cursor, 'match', $pattern);
foreach ($keys as $key) {
yield $key;
}
} while ($cursor);
}