Redis DECR整组键

时间:2016-08-19 15:40:37

标签: redis

假设我有数千个客户端(存储在redis中)的单独计数器,所有客户端都使用相同的命名空间。即client.counter.<client_id>。我想将该命名空间中的所有条目减1(不低于零)。是否可以在不重复每个redis密钥的情况下执行此操作?有没有更好的方法来处理这种数据模型?

2 个答案:

答案 0 :(得分: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。此外,您可以使用SET存储客户端ID。

答案 1 :(得分:0)

如果你需要更新数千个单独的计数器,你将不得不以某种方式逐个遍历它们。

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

相关问题