Хэш или отсортированный набор в Redis?

У меня есть вариант использования на моем веб-сайте, в котором я должен хранить ежедневную статистику пользователя в форме, например

user:1 {field1: value, field2: value, field3: value}

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

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

Map of field1 <user_id, value> 
Map of field2 <user_id, value>
Map of field3 <user_id, value>
Also a map for expiry <user_id, last_updated_time>

Я не понимаю, сохранять ли существующую реализацию или реализовать вариант использования с хэшами. Может кто-нибудь помочь?


person Aarish Ramesh    schedule 21.09.2014    source источник


Ответы (1)


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

hmset user:1 field1 value1 field2 value2 field3 value3

Отсортированный набор может использоваться для хранения дат истечения срока действия. Ключ — это идентификатор пользователя, значение — временная метка unix даты истечения срока действия. Для пользователя: 1 дата истечения срока действия будет установлена ​​​​на 1234567890 с помощью команды, например:

zadd expirations 1 1234567890

Это позволит вам получить список ключей с истекшим сроком действия на текущее время за одну операцию, используя ZRANGEBYSCORE.

ОБНОВЛЕНИЕ

Вы можете использовать простые ключи для хранения ваших данных:

SET user:1:field1 value1
SET user:1:field2 value2
SET user:1:field3 value3

Это позволит вам позволить Redis позаботиться об истечении срока действия: EXPIRE user:1:field1 EXPIRE user:1:field2 EXPIRE user:1:field3

Алгоритм Redis для удаления ключей с истекшим сроком действия не приведет к заметной задержке. Конечно, лучше использовать его, чем реализовывать свой собственный. Дополнительные сведения см. в документации по EXPIRE.

Вы также можете использовать EXPIREAT, если хотите указать дату истечения срока действия вместо продолжительности.

person Pascal Le Merrer    schedule 21.09.2014
comment
Хорошо спасибо. Также дайте мне ваше предложение о том, чтобы иметь отдельные хэши для отдельных полей? и не требует ли истечение срока действия ключа много ресурсов процессора? - person Aarish Ramesh; 21.09.2014