Простой Python. современный стиль программирования - читать онлайн бесплатно полную версию книги . Страница 194

>>> conn.sunion('zoo', 'better_zoo')

{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')