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