一、介绍
类似于数组,顺序表,deque
结构图

特点:元素有序,元素允许重复
由于头尾高效插入删除,可以模拟栈,队列
二、常见 list 命令
1、lpush key elem [elem ...]
头插元素,返回值列表长度
2、lrange key start end
获取列表下标 [start, end] 区间的元素
3、lpushx key elem [elem ...]
如果 key 存在再头插元素
4、rpush key elem [elem ...]
尾插元素
5、rpushx key elem [elem ...]
如果 key 存在再尾插元素
6、lpop key [count]
头删元素 count 次
7、rpop key [count]
尾删元素 count 次
8、lindex key index
获取下标 index 的元素
9、linsert key <before | after> pivot elem
从左往右在列表中找到 pivot 值,在值前 / 后插入元素
10、llen key
获取列表长度
11、lrem key count elem
count > 0: 从左往右删除 count 个 elem
count > 0: 从右往左删除 count 个 elem
count = 0: 删除全部元素 elem
12、ltrim key start end
只保留区间 [start, end] 的元素
13、[blpop | brpop] key [key ...] timeout
阻塞 timeout 内删除元素
如果 list 非空,和 lpop, rpop 一样
如果 list 为空,不会立即返回,在 timeout 时间内如果列表不为空了那就删除并返回
阻塞时间内 Redis 可以执行其他命令
在等待多个 key 的列表时,哪个先不为空那就删除哪个,并且命令返回
多个客户端同时 pop,哪个先执行哪个就 pop
返回删除的 key 和删除的元素
三、内部编码
总体用的是 quicklist,由 ziplist 和 linkedlist 链表组成

把一个个的压缩列表用链表的形式组织起来
结合二者的有点,ziplist 存储个数少的元素节省空间,linkedlist 存储个数的元素效率高
四、应用场景
1、消息队列
生产者消费者模型

2、模拟外键
把两个表中的主键提取,结合成列表建立联系。
如提取课程 id 和学生 id,key 就是一个课程的 id,list 里面存储所有选课学生的 id,这样 redis 就能模拟出外键的效果