列表类型是用来存储多个有序的字符串,列表中的每个字符串称为元素。在 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 作为列表的内部实现。