2016-08-19 75 views
0

假设我为成千上万的客户端(存储在redis中)有一个单独的计数器,所有客户端都使用相同的名称空间。即client.counter.<client_id>。我想将该名称空间中的所有条目减1(不低于零)。是否有可能做到这一点,而无需遍历每个redis密钥?有没有更好的方法来处理这种数据模型?Redis DECR整组密钥

回答

1

有几种方法。

HASH解决方案

您可以使用HASH来存储数据,与命名空间为重点,CLIENT_ID的字段,并且计数器的价值。

// insert 
hset client.counter client_1 1 
hset client.counter client_2 2 
... 
hset client.counter client_N N 

// get all client ids 
hkeys client.counter 

// decr the counter for each client 
hincrby client.counter client_1 -1 

如果有太多的客户,hkeys可能会阻止其他操作Redis的。在这种情况下,您可以使用hscan逐步迭代HASH中的所有客户端。

LIST解决方案

你可以有一个LIST保存所有客户端。当你想为'命名空间'中的所有客户端解密计数器时,只需迭代LIST即可获取客户端ID,然后逐个解析相应的计数器。

// insert client and id 
set client.counter.client_1 1 

// update the id list 
lpush client.ids client_1 

// get all client ids 
lrange client.ids 0 -1 

// decr the counter 
decr client.ids.client_1 

如果客户太多,您不需要一次获取所有ID。另外,您可以使用商店的客户ID号SET

0

如果您需要更新数千个独立的计数器,您将永远必须以某种方式逐一遍历它们。

您应该查看从3.2版本开始提供的BITFIELD command。有了它,您可以将所有计数器存储在一个密钥下的密集计数器中。关于这一点的好处是,如果你想增加所有的计数器,一个Lua循环将是一个非常有效的方法。