假設我爲成千上萬的客戶端(存儲在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獲取多個密鑰