Chr*_*haw 7 java redis lettuce
TL; DR我正在寻找一种按分钟存储,增加和检索事件计数范围的方法.
我正在寻找一种在redis中创建递增时间序列的解决方案.我希望将分数存储到分钟.我的目标是能够查找时间范围并获得值.因此,如果特定键的事件每30分钟发生一次,则为instnace.我想做像zrange这样的事情,并获得他们的关键价值观.我也希望使用像zincrby这样的东西来增加价值.我当然看了一个有条不紊的装置,看起来像是一个完美的装,直到我意识到我只能对得分进行范围扫描,而不是值.最佳解决方案是使用分钟数作为分数,然后使用排序集中的值作为该分钟的事件数.我遇到的问题是,锌只会增加分数而不是值.我无法找到一种原子地增加值的方法.我还使用当前分钟作为键和事件计数作为值来查看散列映射.我能够使用hincrby增加值,但问题是它不支持获取一系列键.
任何帮助,将不胜感激.
你知道,对的问题已经有答案了。你已经说过用 redis 的方式来解决你的问题:
为什么只有这种情况 - 因为只有这种结构(ZSET、HSET和字符串键)具有原子方法来递增值。
所以实际上:
第一个问题的答案是内存和性能之间的折衷。从您的问题来看,如果排序,则不需要任何类型,因此排序集不是最佳解决方案 - 消耗大量内存,并且ZINCRBY时间复杂度是O(log(N))而HINCRBY和INCRBY是O(1)。所以我们应该在哈希值和字符串键之间进行选择。请查看有关 redis 中正确内存优化的问题和答案- 据此,我认为您应该使用哈希作为解决方案的数据类型。
第二个问题对于任何类型的数据结构都是常见的,因为所有类型的数据结构都不包含select by name特征或类似物。我们可以使用HMGET或LUA脚本来解决这个问题。无论如何,这个解决方案的时间复杂度都是O(n)。
这是Jedis的示例(我不是 Java 程序员,对于可能的错误深表歉意):
int fromMinute = 1;
int toMinute = 10;
List<String> list = new ArrayList<String>();
for(int i = fromMinute ; i < toMinute ; i++) {
list.add(i.toString());
}
Jedis jedis = new Jedis("localhost");
List<String> values = jedis.hmget("your_set_name", list);
Run Code Online (Sandbox Code Playgroud)
该解决方案是原子的、快速的、时间复杂度为O(n)并且在redis中消耗尽可能少的内存。
| 归档时间: |
|
| 查看次数: |
2029 次 |
| 最近记录: |