Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当考虑到相应的状态时,如何取消redis位集中的位';关闭';在一段时间不活动之后?_Redis - Fatal编程技术网

当考虑到相应的状态时,如何取消redis位集中的位';关闭';在一段时间不活动之后?

当考虑到相应的状态时,如何取消redis位集中的位';关闭';在一段时间不活动之后?,redis,Redis,我发现使用 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 但为了让它工作,我需要

我发现使用

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

i、 e.当远程代理建立连接时,我可以将位设置为1。如果支持按位过期,则该位将在一段时间不活动后翻转


这在Redis中完全可行吗?如果不是,什么是替代品?

不,你不能过期一点

相反,您只能使密钥过期。因此,为了实现您的目标,当建立连接时,您可以设置一个带有超时的键。要获取连接总数,请使用
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
命令。如果一个id较大的代理(比如100000000)建立了连接,在设置相应的位时,Redis需要分配大量内存,并且可能会阻塞一段时间。有关详细信息,请参见。

如前所述,位图不支持位级过期。事实上,核心Redis数据结构都不提供嵌套元素过期


一个简单的替代方法是使用排序集。对于每个新连接,它将作为一个成员,其分数为当前时间戳(历元)。然后,为了获得一个计数,从“-inf”到当前时间减去“TTL”——这将“修剪”zset以只包括未过期的连接。最后,您可以调用以获取成员的基数/计数。

DBSIZE可能不适用于我,因为我将插入密钥用于其他目的。但是谢谢你的回答。你只能为此目的使用数据库,请看这里