列表类型是用来存储多个有序的字符串,列表中的每个字符串称为元素。在 Redis 中,可以对列表两端插入(push)和弹出(pop),还可以获取指定范围的元素列表、 获取指定索引下标的元素等。列表是一种比较灵活的数据结构,它可以充当栈和队列的角色,在实际开发上有很多应用场景。

列表类型的特点:
1,列表中的元素按插入顺序排列,支持下标访问。元素的位置由插入顺序决定(先插的在前,后插的在后),不会自动排序。
2,列表中的元素是允许重复的。
3,List 底层是双向链表,支持从「表头(left)」和「表尾(right)」双向进行增删操作,核心命令(LPUSH/LPOP、RPUSH/RPOP)的时间复杂度均为 O (1),效率极高。

1,常见命令
- LPUSH:将一个或者多个元素从左侧放入(头插)到 list 中。
- LPUSHX:在 key 存在时,将一个或者多个元素从左侧放入(头插)到 list 中。不存在,直接返回。
- RPUSH:将一个或者多个元素从右侧放入(尾插)到 list 中。
- RPUSHX:在 key 存在时,将⼀个或者多个元素从右侧放入(尾插)到 list 中。
- LRANGE:获取从 start 到 end 区间的所有元素,左闭右闭。
- LPOP:从 list 左侧取出元素(即头删)。
- RPOP:从 list 右侧取出元素(即尾删)。
- LINDEX:获取从左数第 index 位置的元素。
- LINSERT:在特定位置插入元素。
- LLEN:获取 list 长度。
- BLPOP:LPOP的阻塞版本。
- BRPOP:RPOP的阻塞版本。
在列表中有元素的情况下,阻塞和非阻塞表现是⼀致的。但如果列表中没有元素,非阻塞版本会返回nil,但阻塞版本会根据自定义的 timeout (单位:秒。0秒表示永久阻塞),阻塞⼀段时间,期间 Redis 可以执行其他命令,但要求执行该命令的客户端会表现为阻塞状态。
LPUSH key element [element ...]
LPUSHX key element [element ...]
RPUSH key element [element ...]
RPUSHX key element [element ...]
LRANGE key start stop
LPOP key
RPOP key
LINDEX key index
LINSERT key <BEFORE | AFTER> pivot element //
BEFORE表示在目标元素之前插入,AFTER表示在之后插入;pivot目标元素(列表中需存在该元素,否则插入失败返回-1);element 是要插入的新元素.LLEN key
BLPOP key [key ...] timeout
BRPOP key [key ...] timeout


2,内部编码
列表类型的内部编码有两种:
ziplist(压缩列表):当列表的元素个数小于 list-max-ziplist-entries 配置(默认 512 个),同时,列表中每个元素的长度都小于 list-max-ziplist-value 配置(默认 64 字节)时,Redis会选用 ziplist 来作为列表的内部编码实现来减少内存消耗。
linkedlist(链表):当列表类型无法满足 ziplist 的条件时,Redis 会使用 linkedlist 作为列表的内部实现。