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

1361864257.576483

Посмотрим, каким по счету пришел каждый гость:

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