Как сбросить бит в наборе битов Redis, когда соответствующий статус считается выключенным после некоторого времени бездействия? - PullRequest
2 голосов
/ 30 января 2020

Мне очень легко посчитать количество активных соединений, используя

redis_sip = redis.Redis(host="localhost", port=6379, db=0)
redis_sip.setbit(skey, 1, 1)
redis_sip.setbit(skey, 2, 1)
redis_sip.setbit(skey, 3, 0)
redis_sip.setbit(skey, 4, 1)
print(redis_sip.bitcount(skey)) # shows me 3 connections

Но чтобы это работало, мне нужно иметь возможность установить TTL для каждого отдельного бита.

т. Е. Когда удаленный агент устанавливает соединение, я могу установить бит в 1. Если битовое истечение поддерживается, то после перерыва бит будет перевернут.

Это выполнимо вообще в редисе? Если нет, то что такое альтернатива?

Ответы [ 2 ]

3 голосов
/ 30 января 2020

НЕТ, вы не можете истечь немного.

Вместо этого вы можете только срок действия ключа. Таким образом, для достижения вашей цели, когда соединение установлено, вы можете установить ключ с тайм-аутом. Если вы хотите получить общее количество соединений, используйте команду DBSIZE.

// agent 1 establishes a connection, set a timeout of 60s
SET 1 1 EX 60
// agent 2 establishes a connection, set a timeout of 60s
SET 2 2 EX 60
/// agent 1 closes the connection
DEL 1
// total connections
DBSIZE

Кроме того, вы должны быть осторожны с командой SETBIT. Если агент с большим идентификатором, скажем, 100000000, устанавливает соединение, при установке соответствующего бита Redis необходимо выделить много памяти и может на некоторое время заблокироваться. Подробнее см. do c.

2 голосов
/ 30 января 2020

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

Легкой альтернативой было бы использование Sorted Sets. Для каждого нового соединения ZADD это как член с оценкой, которая является текущей отметкой времени (эпоха). Затем, чтобы получить счетчик, выполните ZREMRANGEBYSCORE от '-inf' до текущего времени минус ваш "TTL" - это "обрезает" zset, чтобы включить только не просроченные соединения. Наконец, вы можете позвонить ZCARD, чтобы получить количество членов / количество членов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...