Посмотрим, каким по счету пришел каждый гость:
>>> conn.zrange('logins', 0, -1)
[b'smeagol', b'sauron', b'bilbo', b'treebeard']
И когда:
>>> conn.zrange('logins', 0, -1, withscores=True)
[(b'smeagol', 1361857057.576483), (b'sauron', 1361857357.576483),
(b'bilbo', 1361864257.576483), (b'treebeard', 1361943457.576483)]
Хранилища данных NoSQL
253
Биты
Биты — это очень эффективный (с точки зрения занимаемого места) и быстрый
способ обработать большое множество чисел. Предположим, у вас есть сайт, на ко-
тором регистрируются пользователи. Вы хотите отслеживать, как часто люди авто-
ризуются, сколько пользователей посещает сайт в конкретный день, как часто один
и тот же пользователь посещает сайт в следующие дни и т. д. Вы могли бы исполь-
зовать множества Redis, но если вы присваиваете пользователям увеличива ющиеся
числовые ID, биты помогут вам быстрее и компактнее решить эту задачу.
Начнем с создания последовательности битов для каждого дня. Для этой про-
верки мы используем всего три дня и несколько ID:
>>> days = ['2013-02-25', '2013-02-26', '2013-02-27']
>>> big_spender = 1089
>>> tire_kicker = 40459
>>> late_joiner = 550212
Каждая дата является отдельным ключом. Установим бит для конкретного
пользователя в эту дату. Например, в первую дату (2013-02-25) у нас есть посещения
от big_spender (ID 1089) и tire_kicker (ID 40459):
>>> conn.setbit(days[0], big_spender, 1)
0
>>> conn.setbit(days[0], tire_kicker, 1)
0
На следующий день big_spender вернулся:
>>> conn.setbit(days[1], big_spender, 1)
0
На следующий день у нас снова появился наш друг big_spender, а также новый
человек, которого мы назвали late_joiner:
>>> conn.setbit(days[2], big_spender, 1)
0
>>> conn.setbit(days[2], late_joiner, 1)
0
Получим счетчик ежедневных посещений за эти три дня:
>>> for day in days:
... conn.bitcount(day)
...
2
1
2
Посещал ли сайт заданный пользователь в указанный день?
>>> conn.getbit(days[1], tire_kicker)
0