В прошлом уроке список охотно принимал одну книгу дважды, и чтобы убрать дубль, приходилось перебирать его целиком. Но часто нужно другое: метки книги, где каждая встречается один раз, или список покупателей, где важен сам факт «купил или нет». Для этого в Redis есть множества.
Мешок с жетонами
Представь мешок с именными жетонами гостей на конференции. У каждого гостя один жетон, второй такой же в мешок не положат. Порядка в мешке нет: жетоны лежат как придётся. Зато на вопрос «есть ли здесь жетон Ольги?» ответить можно сразу, не перебирая всех. А если у тебя два мешка, легко найти гостей, которые были на обоих днях конференции.
Множество в Redis устроено так же: набор уникальных строк без порядка, быстрые проверки и операции над несколькими множествами сразу. Это те самые множества из школьной математики и из урока про операции над отношениями.
Метки книги
Метки «Мастера и Маргариты» кладём командой SADD:
127.0.0.1:6379> SADD tags:book:1 classic mystic moscow
(integer) 3
127.0.0.1:6379> SADD tags:book:1 classic
(integer) 0
127.0.0.1:6379> SMEMBERS tags:book:1
1) "classic"
2) "mystic"
3) "moscow"
127.0.0.1:6379> SCARD tags:book:1
(integer) 3
SADD отвечает, сколько элементов действительно добавилось. Второй раз classic не добавился: такая метка уже есть, ответ 0. SMEMBERS показывает всё множество, SCARD считает элементы.
Порядок в выводе SMEMBERS Redis не обещает. Маленькие множества строк он хранит компактно и отдаёт в порядке добавления, а маленькие множества чисел отсортированными. Но когда множество вырастет, порядок станет произвольным. Если нужен порядок, сортируй результат в приложении или бери отсортированные множества из урока про рейтинги.
Есть или нет
Главная операция множества: проверить, есть ли элемент. SISMEMBER отвечает 1 или 0:
127.0.0.1:6379> SISMEMBER tags:book:1 mystic
(integer) 1
127.0.0.1:6379> SISMEMBER tags:book:1 scifi
(integer) 0
Проверить сразу несколько значений можно командой SMISMEMBER, она вернёт ответ на каждое по порядку:
127.0.0.1:6379> SMISMEMBER tags:book:1 classic scifi moscow
1) (integer) 1
2) (integer) 0
3) (integer) 1
В списке для такой проверки пришлось бы просмотреть все элементы. Во множестве проверка занимает одно и то же время, хоть там десять элементов, хоть миллион.
урок из курса
Урок из курса «Redis с нуля». Курс покупается один раз и остаётся навсегда: 500 ₽.
Оплата пока не подключена: премиум и курсы открываются промокодом.