2016-01-25 4 views
1

Я хочу использовать Redis для сеанса. Пользователи будут храниться в Redis с истечением срока действия, который будет обновляться по каждому запросу. Я хотел бы реализовать параллельную лицензию.Redis сеанс с одновременным лицензированием пользователей

Как я могу подсчитать количество сохраненных в настоящее время ключей?

Я узнал, что есть KEYS command, но он не должен использоваться на производстве. Я также думал о некоторых триггерах, когда ключ истекает, но снова it's not what I should rely on.

Как я могу реализовать параллельное лицензирование пользователей с помощью Redis?

+0

Если это глобальная лицензия, тогда как ['DBSIZE'] (http://redis.io/commands/dbsize), так и [' INFO'] (http://redis.io/commands/info) keypace может сказать вам это. –

ответ

1

Это не очень удобно использовать для EXPIRE или верхнего уровня клавиш Redis. Если вы когда-нибудь захотите сохранить что-нибудь еще в Redis, это испортит вашу логику. Кроме того, хотя вы можете подсчитать общее количество ключей с помощью команды DBSIZE, it may be inaccurate because Redis does not actively expire items. По моему впечатлению, Redis построен так, что точное количество клавиш на верхнем уровне не должно быть важно.

Для случаев, когда точное число ключей имеет важное значение, у Redis есть отличные типы данных, которые вы можете использовать. В вашем случае я бы рекомендовал sorted set, где ключ является user_id, а оценка - временем истечения срока действия Unix. Это выглядело бы что-то вроде:

ZADD users_set 1453771862 "user1" 
ZADD users_set 1453771563 "user2" 
ZADD users_set 1453779999 "user3" 

Тогда, в любое время вы должны знать, сколько тока пользователей есть, вы можете просто сделать ZCOUNT на все времена истечения выше, чем текущее время:

ZCOUNT users_set 1453771850 
>>> 2 

ZADD операции идемпотентны, так что вы можете легко добавлять/обновлять истечения раз на пользователей:

ZADD users_set 1453779999 "user2" 
ZCOUNT users_set 1453771850 
>>> 3 

таким образом, вы получите точное количество соответствующего использования rs каждый раз, когда вы делаете ZCOUNT, и каждая операция, которую вы делаете, является относительно дешевой O (log (n)).

И, наконец, если вы хотите, чтобы пользователи из отсортированного набора были удалены/уволены из сортированного набора, вы можете сделать это как довольно дешевое пакетное задание с ZREMRANGEBYRANK в любой промежуток времени, который вам нравится.

Смежные вопросы