数据类型 list

一、介绍

类似于数组,顺序表,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 就能模拟出外键的效果