>1
Каким по счету пришел bilbo?
>>>> conn.zrank('logins', 'bilbo')
>2
Когда это было?
>>>> conn.zscore('logins', 'bilbo')
>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)]
Биты
Биты — это очень эффективный (с точки зрения занимаемого места) и быстрый способ обработать большое множество чисел. Предположим, у вас есть сайт, на котором регистрируются пользователи. Вы хотите отслеживать, как часто люди авторизуются, сколько пользователей посещает сайт в конкретный день, как часто один и тот же пользователь посещает сайт в следующие дни и т. д. Вы могли бы использовать множества 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
Значит, tire_kicker не посещал сайт во второй день.
Сколько пользователей посещает сайт каждый день?
>>>> conn.bitop('and', 'everyday', *days)
>68777
>>>> conn.bitcount('everyday')
>1
Угадайте с трех попыток, кто это:
>>>> conn.getbit('everyday', big_spender)
>1
Наконец, сколько уникальных пользователей посетили сайт за эти три дня?
>>>> conn.bitop('or', 'alldays', *days)
>68777
>>>> conn.bitcount('alldays')
>3
Кэши и истечение срока действия
У всех ключей Redis есть время жизни, или дата истечения срока действия. По умолчанию этот срок длится вечно. Мы можем использовать функцию expire(), чтобы указать Redis, как долго хранить заданный ключ. Как показано далее, значением является количество секунд: