PHP Redis конвейер lRange не работает правильно

У меня есть контроллер, который вызывается много раз (тысячи в минуту), и мне нужно регистрировать каждый вызов без потери скорости ответа.

У меня есть кусок кода следующим образом:

    $redis = Redis::connection();
$redis->pipeline(function($pipe)  use ($type, $redis)
{
// usual
$pipe->incr($type);

// check unique list
$len = $pipe->lLen($type.'_unique_list');
$list = $pipe->lRange($type.'_unique_list', 0, $len);
if(!in_array($this->uid, $list)) {
$pipe->rPush($type . '_unique_list', $this->uid);
$pipe->incr($type . '_unique');
}
});

В другом месте я получаю данные от Redis и отображаю их.

Проблема в том, что пока я использую $pipe->lLen а также $pipe->lRange цифры не изменятся (интересным моментом является то, что ни $type ни $type . '_unique' change).

Я пытался заменить $len с PHP_INT_MAX, но проблема остается той же. Я также попытался добавить $pipe->exec(); в конце концов, но это не помогло.

Если я заменю $pipe->lRange с $redis->lRange, все начинает работать, но ужасно медленно, потому что каждый вызов redis ждет ответа.

Как я мог решить эту ситуацию?

UPD: я узнал, что $list взят с $pipe возвращается Redis объект, а не массив. Итак, вопрос в том, как я могу проверить, существует ли ключ в списке Redis, не получая сам список.

1

Решение

Я предлагаю использовать хэш вместо списка, если нужно проверить существование ключа.
списки предназначены для добавления множества элементов и сортировки по порядку ввода, а не по ключу
Хеши по ключу и имеют метод hexist

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]