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.LinkedListpublic 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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)