假设我为成千上万的客户端(存储在redis中)有一个单独的计数器,所有客户端都使用相同的名称空间。即client.counter.<client_id>
。我想将该名称空间中的所有条目减1(不低于零)。是否有可能做到这一点,而无需遍历每个redis密钥?有没有更好的方法来处理这种数据模型?Redis DECR整组密钥
0
A
回答
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循环将是一个非常有效的方法。
相关问题
- 1. 如何在DECR之后重置Redis中的密钥增量?
- 2. Redis是否有decr功能
- 3. Redis ZCARD多个密钥(redis-rb)
- 4. Redis中的孤儿密钥
- 5. Redis密钥匹配性能
- 6. 使用redis中的密钥
- 7. Spring Data Redis过期密钥
- 8. redis如何过期密钥?
- 9. 从Redis中提取密钥
- 10. Redis复制密钥级别
- 11. 如何总结整个星期的Redis密钥?
- 12. 选择Redis密钥名称并限制密钥数量
- 13. 如何通过TTL查找redis密钥
- 14. Redis在大型密钥集上过期
- 15. Redis的KEYSPACE声明和密钥过期
- 16. Mongoose Redis无法找到文档密钥
- 17. 回收Redis中的过期密钥
- 18. Redis根据设定值找到密钥
- 19. 使用redis获取一系列密钥?
- 20. Redis不删除会话密钥
- 21. 春季Redis删除不删除密钥
- 22. 仅前缀redis会话密钥
- 23. 为什么REDIS密钥持续过期?
- 24. Redis/Node等待密钥存在
- 25. 在redis中获取密钥的权重
- 26. 获取密钥空间打和Redis的
- 27. redis block直到存在密钥
- 28. Redis从值中获取密钥
- 29. 阻止访问Redis的密钥(ServiceStack)
- 30. 使用node-redis获取多个密钥