你知道,对一个问题已经有了答案。你已经说过redis解决问题的方法:
- 使用ZSET - 键作为时间和值作为计数器。
- 使用HSET - 键作为时间和值作为计数器。
- 使用字符串键- 键名作为时间和值作为计数器。
为什么只有这种情况 - 因为只有这种结构(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);
这个解决方案是原子的,速度快,时间复杂度为O(n),并且在 redis 中消耗的内存尽可能少。