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