У меня есть контроллер, который вызывается много раз (тысячи в минуту), и мне нужно регистрировать каждый вызов без потери скорости ответа.
У меня есть кусок кода следующим образом:
$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, не получая сам список.
Я предлагаю использовать хэш вместо списка, если нужно проверить существование ключа.
списки предназначены для добавления множества элементов и сортировки по порядку ввода, а не по ключу
Хеши по ключу и имеют метод hexist
Других решений пока нет …