Простой Python. Современный стиль программирования (Любанович) - страница 144

>1

Множества

Множества Redis похожи на множества Python, как вы можете увидеть в следующих примерах.

Добавим одно или несколько значений множества:

>>>> conn.sadd('zoo', 'duck', 'goat', 'turkey')

>3

Получим количество значений множества:

>>>> conn.scard('zoo')

>3

Получим все значения множества:

>>>> conn.smembers('zoo')

>{b'duck', b'goat', b'turkey'}

Удалим значение из множества:

>>>> conn.srem('zoo', 'turkey')

>True

Создадим второе множество, чтобы продемонстрировать некоторые операции:

>>>> conn.sadd('better_zoo', 'tiger', 'wolf', 'duck')

>0

Пересечение множеств (получение общих членов) zoo и better_zoo:

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

>{b'duck'}

Выполним пересечение множеств zoo и better_zoo и сохраним результат в множестве fowl_zoo:

>>>> conn.sinterstore('fowl_zoo', 'zoo', 'better_zoo')

>1

Есть кто живой?

>>>> conn.smembers('fowl_zoo')

>{b'duck'}

Выполним объединение (всех членов) множеств zoo и better_zoo:

>>>> 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. Они представляют собой набор уникальных значений, но каждое значение связано с дробным счетчиком. Вы можете получить доступ к каждому элементу с помощью его значения или счетчика. Упорядоченные множества применяются в качестве:

• списков лидеров;

• вторичных индексов;

• временных рядов, где отметки времени используются как счетчик.

Мы рассмотрим последний вариант применения, отслеживая логины пользователей с помощью временных меток. Мы будем использовать значение времени 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))