2016-08-19 73 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循環將是一個非常有效的方法。