Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:我可以使用Redis db创建优先级队列吗?优先级是根据数据集中键的值设置的_Java_Redis_Queue - Fatal编程技术网

Java:我可以使用Redis db创建优先级队列吗?优先级是根据数据集中键的值设置的

Java:我可以使用Redis db创建优先级队列吗?优先级是根据数据集中键的值设置的,java,redis,queue,Java,Redis,Queue,我是Redis的新手。我想通过Java客户端在Redis中使用优先级队列。我将有一组键值对。并将其用作优先级队列 数据集包含键及其对应的值。示例[a:1,b:1,c:1]。值字段将表示键在数据集中出现的次数。如果将另一个键“a”插入数据集中,则该键变为[a:2,b:1,c:1] 优先权来了。集合中存在的大多数密钥将具有最高优先级,在示例中为its[a],并且应该位于队列的顶部。因此,当我弹出队列时,具有最高优先级的元素应该弹出 另外,如果数据集看起来像这样[a:2,b:2,c:2],那么我想随机

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

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

优先权来了。集合中存在的大多数密钥将具有最高优先级,在示例中为its[a],并且应该位于队列的顶部。因此,当我弹出队列时,具有最高优先级的元素应该弹出

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


因为我的数据集是键-值对,所以我想使用Redis[你可以建议一个更好的]

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

您可以使用Java客户端提供的熟悉的PriorityQueue API over 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();
公共类条目实现了可比较、可序列化的{
私钥;
私有整数值;
公共条目(字符串键,整数值){
this.key=key;
这个值=值;
}
@凌驾
公共整数比较(条目o){
返回键。比较键(o键);
}
}
RPriorityQueue=redisson.getPriorityQueue(“anyQueue”);
添加(新条目(“b”,1));
添加(新条目(“c”,1));
添加(新条目(“a”,1));
//条目[a:1]
条目e=queue.poll();
//条目[b:1]
条目e=queue.poll();
//条目[c:1]
条目e=queue.poll();

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

Java的PriorityQueue如何?是的,我确实想到了这一点,但在优先级队列中,最高优先级将位于队列底部。我想要相反的结果。您确定优先级队列中的顺序,因此如果不是您想要的顺序,请更改您为队列提供的比较器。感谢您的深入了解。那么这些Redis命令可以通过java客户端访问吗?>您可以通过使用元素来模拟从排序集中弹出,您是说get和zrem?