如何用Java和Redis设计一个高效的先入先出的队列

如何用Java和Redis设计一个高效的先入先出的队列,第1张

分析:

redis的list底层是多个ziplist结构组成的“双向”链表。中间部分还压缩了一下。

最外层是由两个哈希表构成的dict。

哈希表的get(key)时间复杂度为O(1),而且这个O(1)理论上不会因为所占内存的大小和元素数目所改变。list的出队列和入队 *** 作也都是O(1)。

Java的队列时间复杂度也应为O(1)。

可不可以直接用redis的list做先进先出?

情况1,数据数量不多,可以用

情况2,数据量多,但存的数据是激活码这样简单誉型态值一类,可以用。

情况3,list存的是要获取数据的索引,大量数据的值已经存在redis的KV结构中。

这时候,如果数据每次获取下一个数据都要执行redis的hash查找(O(1))然后redis的list从头或者末尾出一个。经过网络IO返回,Java程序在用出来的key去请求redis去get(key) (O(1))。这里是两次网络IO或者进程间的IO。

这时候,可以不用redis的list存索引而只是用redis大的KV哈希结构存键值。用①Java的队列先进先出获取下一个key或者②使用预先规定好的键生成的规则,让键庆源是有规则有顺序的,比如自增ID,然后每次获取都是ID++,而直接从redis.get(ID.next())来获取值。

最后一租余种就是最高效的办法,为了特殊场景的高效出队列而设计。但是如果只是一般的数据量,使用redis的list也未尝不可。

import java.util.LinkedList

public class Demo01 {

private LinkedList<Object> linkedList

public Demo01() 卖岁虚{

linkedList = new LinkedList<Object>()

}

public void put(Object object) {

linkedList.add(object)

}

public Object get() {

Object object = null

if (linkedList.size() != 0) {

object = 中燃linkedList.get(0)

linkedList.remove(0)

}

return object

}

public boolean isEmpty() {

if (linkedList.size() != 0) {

return true

} else {

return false

}

}

public static void main(String[] args) {

Demo01 demo01 = new Demo01()

demo01.put("1")

demo01.put("雀念2")

System.out.println(demo01.get())

System.out.println(demo01.get())

System.out.println(demo01.isEmpty())

}

}

结果:

1

2

false


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12447398.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存