一、是什么
一种先进先出的线性表数据结构,只支持入队和出队操作
二、使用场景
-
MySQL
连接池 -
Redis
单线程特性 - 分布式消息队列
三、工作原理
队尾插入元素,队头删除元素
四、队列类型
-
顺序队列:
数组实现的就是顺序队列(有数据搬移操作) -
循环队列:
将数组的首尾相连,形成一个环(没有数据搬移操作) -
阻塞队列:
当队列为空时,从队头取数据会被阻塞;当队列已满时,插入数据的操作将被阻塞,形成一个生产者-消费者模型。 -
并发队列:
在多线程情况下, 会有多个线程同时操作队列,此时如果是线程安全的队列我们就叫作并发队列。一般使用CAS(类似乐观锁)和锁来实现并发队列。
四、实现
-
代码实现
type list []int
func NewList() *list {
newList := make(list, 0)
return &newList
}
func listPush(newList *list, a ...int) {
*newList = append(*newList, a...)
}
func listPop(newList *list) (listObj int) {
length := len(*newList)
if length <= 0 {
return
}
listObj = (*newList)[0]
*newList = (*newList)[1:length]
return
}
-
Redis
实现
rpush + lpop = list(队列)
五、优劣
- 优点:
- 不涉及到数组搬移时,出队和入队的时间复杂度都为
O(1)
- 操作受限,使用比较可控,不容易出错(和数组、链表相比较)
- 缺点:
- 在内存中,队列结构里的数据大小和生命周期是固定的,缺乏灵活性
六、替代性技术
- 数组
- 链表
- 栈
网友评论