{b'duck', b'goat', b'wolf', b'tiger'}
Сохраним результат этого пересечения в множестве fabulous_zoo:
>>> conn.sunionstore('fabulous_zoo', 'zoo', 'better_zoo')
4
>>> conn.smembers('fabulous_zoo')
{b'duck', b'goat', b'wolf', b'tiger'}
Какие элементы присутствуют в множестве zoo и отсутствуют в множестве
better_zoo? Используйте метод sdiff(), чтобы получить разность множеств, и метод
sdiffstore(), чтобы сохранить ее в множестве zoo_sale:
>>> conn.sdiff('zoo', 'better_zoo')
{b'goat'}
>>> conn.sdiffstore('zoo_sale', 'zoo', 'better_zoo')
1
>>> conn.smembers('zoo_sale')
{b'goat'}
Упорядоченные множества
Один из самых гибких типов данных Redis — это упорядоченные множества, или zset.
Они представляют собой набор уникальных значений, но каждое значение связано
252
Глава 8. Данные должны куда-то попадать
с дробным счетчиком. Вы можете получить доступ к каждому элементу с помощью
его значения или счетчика. Упорядоченные множества применяются в качестве:
списков лидеров;
вторичных индексов;
временных рядов, где отметки времени используются как счетчик.
Мы рассмотрим последний вариант применения, отслеживая логины пользо-
вателей с помощью временных меток. Мы будем использовать значение времени
epoch (подробнее об этом — в главе 10), которое возвращает функция time():
>>> import time
>>> now = time.time()
>>> now
1361857057.576483
Добавим первого гостя (он немного нервничает):
>>> conn.zadd('logins', 'smeagol', now)
1
Пять минут спустя добавим второго гостя:
>>> conn.zadd('logins', 'sauron', now+(5*60))
1
Через два часа:
>>> conn.zadd('logins', 'bilbo', now+(2*60*60))
1
Еще один гость не торопился и пришел спустя сутки:
>>> conn.zadd('logins', 'treebeard', now+(24*60*60))
1
Каким по счету пришел bilbo?
>>> conn.zrank('logins', 'bilbo')
2
Когда это было?
>>> conn.zscore('logins', 'bilbo')