Я использую Redis для PHP.
Мне нужно проверить, существует ли ключ в списке redis, и если нет, добавьте его. На данный момент мой код выглядит следующим образом:
$redis = Redis::connection();
$redis->pipeline(function($pipe) use ($type, $redis)
{
$list = $pipe->lRange($type.'_unique_list', 0, -1);
if(!in_array($this->uid, $list)) {
$pipe->rPush($type . '_unique_list', $this->uid);
}
});
Проблема в том, что $list
взято из $pipe
возвращает объект Redis, а не массив, и in_array
не работает. Но если я использую $redis->lRange
Сценарий становится слишком медленным.
Поэтому мой вопрос, есть ли возможность проверить, существует ли ключ в списке Redis без получения списка в сценарий? Какая-то особая команда Redis, которую я не могу найти в документации? Или, может быть, я мог бы заменить in_array
с чем-то еще в этой конкретной ситуации?
Неправильный ответ: вы можете позвонить LINDEX
вместо того, чтобы делать поиск в клиенте.
Правильный ответ: сканирование связанного списка всегда является дорогостоящей операцией (O (N)), независимо от того, выполняется ли она на стороне сервера или на стороне клиента. Рассмотрите возможность использования другой структуры данных, например, Набор для этой цели, если ваш N большой.
Других решений пока нет …