Как лучше всего обрабатывать списки и множества в Redis? - PullRequest
8 голосов
/ 28 октября 2010

Мы используем Redis в качестве сервера кэширования, и часто приходится иметь дело со списком кэширования.Когда мы кэшируем простые объекты, мы выполняем GET, и Redis возвращает null, если объект не существует, и мы будем знать, что объект не кэширован и должен быть загружен из базы данных.

Но как это сделать?лучше всего обрабатывать списки одинаково - пустой список может быть допустимым значением.Нужно ли нам вызывать EXISTS, чтобы проверить, существует ли список (но делает операцию 2, а не одну), или у кого-то есть идея, как справиться с этим сценарием?

/ Спасибо

Ответы [ 3 ]

10 голосов
/ 06 ноября 2010

Если вам абсолютно необходимо это сделать, при создании списка вы можете указать «страж» как первый элемент, который никогда не удаляется.Чтобы сделать это атомарно, вы можете использовать MULTI / EXEC / WATCH, но часы доступны только в Redis 2.2, который в настоящее время является предварительным просмотром (даже если он достаточно стабилен, вы можете получить его из мастер-ветви github).

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

Обратите внимание, что, поскольку Redis 2.2 существует, значит иметь как минимум 1 элемент для списка, поскольку списки, которые достигнут нулевых элементов, автоматически удаляются по многим уважительным причинам;)

3 голосов
/ 29 октября 2010

К сожалению, команды извлечения списка / набора, такие как LRANGE и SMEMBERS, похоже, не различают пустой список / набор и несуществующий список / набор.

Так что если вам абсолютно необходимо различатьв двух случаях, я думаю, вам нужно сделать EXISTS в первую очередь.Попробуйте конвейеризировать ваши команды для лучшей производительности.Большинство клиентских библиотек Redis поддерживают конвейерную обработку.

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

0 голосов
/ 29 октября 2010

Если вы используете php, я бы присвоил возвращаемое значение переменной, а затем проверил, является ли он массивом. (Вот как это работает, используя библиотеку Predis)

$res = $redis->get('Key');
if(is_array($res))
    do code here
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...