【问题标题】:Java: Can I use Redis db to create Priority queues and the priority is set according to the value of the key in the data setJava:我可以使用Redis db创建优先级队列并根据数据集中键的值设置优先级
【发布时间】:2015-02-17 18:38:09
【问题描述】:

我是 Redis 新手。我想通过 Java 客户端在 Redis 中使用优先级队列。我将有一组键值对。并将其用作优先队列。

数据集包含键及其对应的值。例如 [a:1,b:1,c:1]。值字段将表示键在数据集中出现的次数。如果将另一个键“a”插入数据集中,则它变为 [a:2,b:1,c:1]。

这里是优先级。集合中存在的大多数键将具有最高优先级,在示例中它的 [a],它应该位于队列的顶部。所以当我弹出队列时,应该弹出具有最高优先级的元素。

另外,如果数据集看起来像这样 [a:2,b:2,c:2],那么我想随机选择一个从队列中弹出。

由于我的数据集是键值对,我想使用 Redis[你可能会推荐一个更好的]。

【问题讨论】:

  • Java 的 PriorityQueue 怎么样?
  • 是的,我确实想过,但是在优先级队列中,最高优先级将坐在队列的底部。我想要相反的结果。
  • 您确定优先级队列中的顺序,因此如果不是您想要的顺序,请更改您提供给队列的比较器。

标签: java redis queue


【解决方案1】:

应该可以通过 Redis 排序集和 Lua 脚本来实现。排序集是按分数排序的元素集,但分数可以动态更新。更新排序集分数的一种方法是通过 ZINCRBY 增加其范围,这对应于您尝试执行的 AFAIK。元素将根据增加的分数自动移动到正确的位置。然后通过使用其他排序集命令,您可以通过消耗元素来模拟从排序集中弹出,如果这是您想要的语义。

【讨论】:

  • 感谢您的洞察力。那么这些 Redis 命令可以通过 java 客户端访问吗?
  • >你可以通过消费元素来模拟从有序集合中弹出,你的意思是get和zrem?
【解决方案2】:

您可以使用Redisson Java 客户端提供的熟悉的 PriorityQueue API 而不是 Redis。这是一个例子:

public class Entry implements Comparable<Entry>, Serializable {

    private String key;
    private Integer value;

    public Entry(String key, Integer value) {
        this.key = key;
        this.value = value;
    }

    @Override
    public int compareTo(Entry o) {
        return key.compareTo(o.key);
    }

}

RPriorityQueue<Entry> queue = redisson.getPriorityQueue("anyQueue");
queue.add(new Entry("b", 1));
queue.add(new Entry("c", 1));
queue.add(new Entry("a", 1));

// Entry [a:1]
Entry e = queue.poll();
// Entry [b:1]
Entry e = queue.poll();
// Entry [c:1]
Entry e = queue.poll();

Redisson 支持许多编解码器(Jackson JSON、Avro、Smile、CBOR、MsgPack、Kryo、FST、LZ4、Snappy 和 JDK 序列化)。因此可以使用任何 Java 对象来代替示例中显示的 String。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-14
    相关资源
    最近更新 更多