Набір Редіс проти хешу


75

У багатьох підручниках Redis (таких як цей ) дані зберігаються в наборі, але з кількома значеннями, об'єднаними в рядок (тобто обліковий запис користувача може зберігатися в наборі у вигляді двох записів, "user: 1000: username" та "користувач: 1000: пароль").

Однак у Редіса теж є хеш. Здається, було б більш розумно мати хеш "user: 1000", який містить запис "ім'я користувача" та запис "пароль". Замість того, щоб об’єднувати рядки для доступу до певного значення, ви просто отримуєте доступ до них безпосередньо в хеші.

То чому його не використовують стільки? Це лише старі підручники? Або у хешів Redis є проблеми з продуктивністю?


1
Я думаю, ви маєте на увазі команду SET, яка фактично використовує тип даних Strings. Це просто пара ключ / значення, на відміну від фактичного типу даних Sets (який використовує SADD для додавання до набору).
Mike G

Ви маєте рацію, вона використовує команду SET. Я не підозрював, що це окремий тип даних, але це має сенс.
Найру

Я не знаю про різницю в продуктивності і пишу невеликий тест базового рівня github.com/logrusorgru/redisbm Але різні параметри хешу (наприклад, кількість полів) повертають інший результат. І встановити / отримати не завжди повільніше.
Іван Блек

Відповіді:


54

Хеші Redis корисні для зберігання більш складних даних, як ви пропонуєте у своєму питанні. Я використовую їх саме для цього - для зберігання об’єктів з кількома атрибутами, які потрібно кешувати (зокрема, дані про запаси для певного товару на сайті електронної комерції). Звичайно, я міг би використовувати зв’язаний рядок - але це додає непотрібної складності коду мого клієнта, і оновлення окремого поля неможливе.

Ви можете мати рацію - навчальні посібники можуть бути просто з того моменту, як були введені hashes. Вони були чітко розроблені для зберігання репрезентацій Об’єктів: http://oldblog.antirez.com/post/redis-weekly-update-1.html

Я припускаю, що однією проблемою буде кількість команд, які Redis повинен обслуговувати, коли вставляється новий елемент (n кількість команд, де n - кількість полів у хеші) порівняно з простою командою String SET. Я ще не виявив, що це проблема в службі, яка вражає Redis приблизно 1 мільйон разів на день. Використання правильної структури даних для мене важливіше, ніж незначний вплив на продуктивність.

(Також, будь ласка, перегляньте мій коментар щодо наборів Redis проти Redis Strings - я думаю, ваше питання стосується струн, але виправте мене, якщо я помиляюся!)


1
Привіт Майк, два запитання. По-перше, 1 мільйон звернень на день - це близько 12 вимог / с, що завдяки тесту Redis ви бачите 30 тисяч на низькому рівні машин EC2 або 120 тисяч на висококласних ноутбуках. Як щодо більш ніж 12 разів на секунду? Ви думаєте, якщо у вас буде кілька тисяч на секунду, SET буде кращим вибором, ніж HASH? Друге питання стосується того, що ви сказали "n кількість команд, де n - кількість полів у хеші", якщо вам потрібно зберегти елемент з двома параметрами, це буде в 2 рази SET для зберігання окремо, як і хеш, якщо він робить те саме. Ви впевнені, що HASH вражає Redis стільки, скільки його полів? tnx
Maziyar

48

Хеші - один з найефективніших методів зберігання даних у Redis, навіть доходячи до того, що рекомендує їх до використання, коли це можливо ефективно.

http://redis.io/topics/memory-optimization

Використовуйте хеш, коли це можливо

Маленькі хеші кодуються в дуже малому просторі, тому вам слід спробувати представляти свої дані за допомогою хешів щоразу, коли це можливо. Наприклад, якщо у вас є об’єкти, що представляють користувачів у веб-програмі, замість того, щоб використовувати різні ключі для імені, прізвища, електронної пошти, пароля, використовуйте єдиний хеш із усіма обов’язковими полями.


0

Порівняння випадків використання:

Набори забезпечують семантичний інтерфейс для зберігання даних як набору на сервері Redis. Варіанти використання такого роду даних будуть скоріше для аналітичних цілей, наприклад, скільки людей переглядає сторінку товару і скільки в кінцевому підсумку придбає продукт.

Хеші забезпечують семантичний інтерфейс для зберігання простих і складних об'єктів даних на сервері Redis. Наприклад, профіль користувача, каталог товарів тощо.

Посилання: Навчання Redis

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.