Программы
Сортированные множества в Redis

Сортированные множества в Redis

Сортированные множества или sorted sets — одна из структур данных Redis. Интересна она хотя бы тем, что не так часто встречается как таковая (даже вне рассмотрения Redis). А посему — давайте глубже копнём — что с ними будем делать.

Как и в случае со списками и множествами, в сортированных множествах можно хранить не скаляры, а именно множества (можно было догадаться). Как и у множеств, у sorted sets поддерживается уникальность элементов. Однако, в дополнение к этому добавляется значение score к каждому элементу, что позволяет упорядочивать элементы во множестве.

127.0.0.1:6379> zadd langs 1 python
(integer) 1
127.0.0.1:6379> zadd langs 2 perl
(integer) 1
127.0.0.1:6379> zadd langs 3 php
(integer) 1
127.0.0.1:6379> zadd langs 3 perl
(integer) 0
127.0.0.1:6379> zrange langs 0 100
1) "python"
2) "perl"
3) "php"

Синтаксис команды zadd — ключ, значение (значения). Только значение в sorted set — пара (score, element).

zrange — получить список элементов (с … по …) из множества. Элементы упорядочены по score. Можно указывать отрицательные границы — будет считать с конца.

127.0.0.1:6379> zadd langs 2 ruby
(integer) 1
127.0.0.1:6379> zrevrange langs -2 -1
1) "ruby"
2) "python"

zrevrange — то же самое, что и range, только считаем, что элементы упорядочены по score от большего к меньшему.

127.0.0.1:6379> zcard langs
(integer) 4

zcard — количество элементов во множестве.

Аналогично можно получить количество через zcount:

127.0.0.1:6379> zcount langs -inf +inf
(integer) 4
127.0.0.1:6379> zcount langs 2 3
(integer) 3

С другой стороны, вы ещё можете использовать её для получения количества элементов, score которого с … по …

127.0.0.1:6379> zincrby langs 2 ruby
"4"

— как «двигать» элементы во множестве.

127.0.0.1:6379> zadd football 1 "Спартак" 2 "Зенит" 3 "Локомотив"
(integer) 3
127.0.0.1:6379> zadd hockey 1 "Локомотив" 2 "Спартак"
(integer) 2
127.0.0.1:6379> zinterstore result 2 football hockey
(integer) 2
127.0.0.1:6379> zrange result 0 -1 withscores
1) "\xd0\xa1\xd0\xbf\xd0\xb0\xd1\x80\xd1\x82\xd0\xb0\xd0\xba"
2) "3"
3) "\xd0\x9b\xd0\xbe\xd0\xba\xd0\xbe\xd0\xbc\xd0\xbe\xd1\x82\xd0\xb8\xd0\xb2"
4) "4"

Небольшой рейтинг команд по футболу и хоккею. В итоге — получаем «общий зачёт» с помощью zinterstore, который мы ограничиваем 2-мя командами. Score — сумма score по множествам.

zlexcount key min max — получение числа элементов, находящихся включительно с min до max, но в порядке не score, а лексикографическом.

zrangebylex — то же самое, но применительно к zrange.

127.0.0.1:6379> zrangebyscore langs 1 3 withscores
1) "python"
2) "1"
3) "perl"
4) "3"
5) "php"
6) "3"
127.0.0.1:6379> zrangebyscore langs 1 (3 withscores
1) "python"
2) "1"

А вот мы получаем range именно по score — то есть «с такого score по такой». Здесь же пример с использованием скобочки — в значении «не включая».

127.0.0.1:6379> zrank langs ruby
(integer) 3

Получить номер элемента в ранжированной по score последовательности (номер начинается с 0).

127.0.0.1:6379> zrem football "Спартак"
(integer) 1

«Дисквалифицировали» команду «Спартак» из футбольных соревнований. zscore key element — получить score для элемента во множестве.

127.0.0.1:6379> zunionstore result 2 football hockey WEIGHTS 1 2
(integer) 3
127.0.0.1:6379> zrange result 0 -1 withscores
1) "\xd0\x97\xd0\xb5\xd0\xbd\xd0\xb8\xd1\x82"
2) "2"
3) "\xd0\xa1\xd0\xbf\xd0\xb0\xd1\x80\xd1\x82\xd0\xb0\xd0\xba"
4) "4"
5) "\xd0\x9b\xd0\xbe\xd0\xba\xd0\xbe\xd0\xbc\xd0\xbe\xd1\x82\xd0\xb8\xd0\xb2"
6) "5"

Получили результирующую общую зачётную таблицу. Weights — говорит о том, что при суммирование score из разных множеств (футбола и хоккея), мы очки хоккея удваиваем.

Также может быть вам интересно:

Эрик Рис — Бизнес с нуля

Давеча прочитал неплохую книгу о стратапах — весьма годное чтиво, советую. Далее — о некоторых аспектах сей книжки.

Читать »

Что новый Redis нам готовит

В Redis 3 должна появиться возможность использовать несколько Redis-нод как кластер. О кластере говорили давно, примерно тогда же пытались сделать, но вскоре поняли, что с разбегу сделать его не получится — надо решить перед этим ряд проблем.

Читать »
Фото Как установить PostgreSQL на Linux и создать базу и пользователя

Как установить PostgreSQL на Linux и создать базу и пользователя

PostgreSQL - система управления базой данных общего назначения. Одна из самых распространённых баз данных, используемая на многих коммерческих и некоммерческих проектах.

Фото Как сделать свою middleware в Django (с примерами)

Как сделать свою middleware в Django (с примерами)

Middleware или "промежуточное программное обеспечение" - элегантный способ установить общие правила обработки запросов и ответов приложения. Давайте напишем парочку middleware, чтобы понять, как они работают.

Фото Как настроить отправку почты из Django

Как настроить отправку почты из Django

Письма об ошибках, отчёты на почту, восстановление паролей - всё это полезно при работе с сайтом. Django предоставляет удобный способ это сделать с минимумом настроек!

Фото Добавляем поддержку медиа-файлов в Django проект

Добавляем поддержку медиа-файлов в Django проект

Современные сайты редко ограничиваются только текстом и вёрсткой. Часто в заметках красуются фотографии, а рядом с описанием товаров - их изображения.

Фото Нет слов, одни... однострочники

Нет слов, одни... однострочники

На днях вышел пост со списком полезных однострочников для JavaScript программистов. Памятуя Perl-овую молодость, заглянул туда.

Фото Добавляем переменные в контекст Django шаблонов (свой контекст-процессор)

Добавляем переменные в контекст Django шаблонов (свой контекст-процессор)

В Django вы можете передавать данные в шаблоны посредством контекстов. Контекст передаётся из контроллера (view в терминах Django), однако, если одни и те же данные нужны в разных местах, лучше сделать свой контекст-процессор.

Фото Пример своей консольной команды в Django проекте

Пример своей консольной команды в Django проекте

Если вы работали с Django проектом, то, скорее всего, запускали команды из консоли (manage.py). В Django есть простой способ писать свои команды для управления проектом.

Фото Разграничение прав доступа на Django сайте

Разграничение прав доступа на Django сайте

Почти на любом веб-сайте необходимо разделять пользователей на группы и предоставлять им разные возможности. В Django есть довольно серьёзная система прав доступа для пользователей - давайте её рассмотрим!