Java 如何增加redis排序集的值
TL;DR我正在寻找一种按分钟存储、增加和检索事件计数范围的方法 我正在寻找在redis中创建递增时间序列的解决方案。我正在寻找存储计数到分钟。我的目标是能够查找时间范围并获得值。因此,对于Instance,如果特定钥匙每分钟发生30次事件。我想做一些类似zrange的事情,并获取它们的键值。我也希望使用类似zincrby的东西来增加价值。我当然看过一个排序集,它看起来像是一个完美的匹配,直到我意识到我只能对分数而不是值进行范围扫描。最佳解决方案是使用分钟数作为分数,然后使用排序集中的值作为该分钟的事件数。我遇到的问题是zincrby只会增加分数,而不会增加值。我无法找到一种方法来原子地增加值。我还研究了一个hashmap,使用当前分钟作为键,使用事件计数作为值。我可以使用hincrby增加值,但问题是它不支持获取一系列键Java 如何增加redis排序集的值,java,redis,lettuce,Java,Redis,Lettuce,TL;DR我正在寻找一种按分钟存储、增加和检索事件计数范围的方法 我正在寻找在redis中创建递增时间序列的解决方案。我正在寻找存储计数到分钟。我的目标是能够查找时间范围并获得值。因此,对于Instance,如果特定钥匙每分钟发生30次事件。我想做一些类似zrange的事情,并获取它们的键值。我也希望使用类似zincrby的东西来增加价值。我当然看过一个排序集,它看起来像是一个完美的匹配,直到我意识到我只能对分数而不是值进行范围扫描。最佳解决方案是使用分钟数作为分数,然后使用排序集中的值作为该分
任何帮助都将不胜感激。你知道,对,一个问题已经有了答案。您已经谈到了redis解决问题的方法: 使用-键作为时间,值作为计数器。 使用-键作为时间,值作为计数器。 使用-键名称作为时间,值作为计数器。 为什么只有这种情况?因为只有这种结构,并且有原子方法来增加值 实际上: 您应该正确选择数据结构。 解决数据选择的问题。 第一个问题的答案是内存和性能之间的折衷。从您的问题来看,如果按排序集排序不是最佳解决方案,则不需要任何类型-消耗大量内存,时间复杂度是OlogN,而不是O1。因此,我们应该在哈希和字符串键之间进行选择。请看一下redis中的右内存优化——根据这一点,我认为您应该使用哈希作为解决方案的数据类型 第二个问题对于任何类型的数据结构都很常见,因为所有类型的数据结构都不包含按名称选择功能或类似功能。我们可以使用或来解决这个问题。在任何情况下,此解决方案都具有时间复杂性 以下是我不是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);
此解决方案是原子的、快速的,在redis中具有时间复杂性,并且尽可能少地消耗内存 谢谢你提供的信息!!我几乎得出了相同的结论,但是我没有考虑得到钥匙清单的hmget。我看着hscan,非常讨厌这样做。我认为这是一个很好的解决方案!!我还发现了一个node项目,它有一个我将要模仿的非常类似的解决方案。它使用hashmaps创建时间序列,时间序列依赖于分钟/小时/秒等粒度。忘了考虑节点库