Redis的list类及基础指令

📅 2026/7/12 2:09:36
Redis的list类及基础指令
文章目录Redis的list类及基础指令一、list类特点二、内部实现三、常用命令1. LPUSH、RPUSH2. LPUSHX、RPUSHX3. LRANGE4. LPOP、RPOP5. LINSERT6. LLEN三、阻塞版本的命令Redis的list类及基础指令一、list类特点列表中的元素是有序的列表中的元素可以重复二、内部实现3.2之前的版本类型解释ziplist 压缩链表ziplist 是一块连续内存插入/删除时需要移动后续所有元素时间复杂度为 O(n)linkedlist 双向链表linkedlist 是由离散节点组成插入/删除时只需修改相邻指针时间复杂度为 O(1)注意 ziplist 向 linkedlist 的转换单个元素的长度过大元素数量超过阈值这个阈值可以自己到参数文件里去设置3.2之后的版本只有quicklistQuicklist宏观上是双向链表但微观上每个节点内部包含的是一个 Ziplist用来存储一批元素简单的来说就是ziplist就相当于是普通的数组空间大小也是连续的插入和删除也跟普通数组一样会“动辄全身”而linedlist就是双向链表每个节点都记录着数据本身以及指针指针占用空间空间分布不连续插入和删除较快而quicklist整合了这个两个list的有点存储上以ziplist为单位结构上使用linedlist既节省了空间也加快了插入删除的效率。三、常用命令1. LPUSH、RPUSHlpush: 将⼀个或者多个元素从左侧放入头插到 list 中rpush: 将⼀个或者多个元素从右侧放入尾插到 list 中语法LPUSH key element [element ...] RPUSH key element [element ...]返回值插入list后的长度示例redis LPUSH mylist world (integer) 1 redis LPUSH mylist hello (integer) 2 redis LRANGE mylist 0 -1 1) hello 2) world redis RPUSH mylist world (integer) 1 redis RPUSH mylist hello (integer) 2 redis LRANGE mylist 0 -1 1) world 2) hello2. LPUSHX、RPUSHX在 key 存在时将⼀个或者多个元素从左右侧放入头插或尾插到 list 中。不存在直接返回。语法LPUSHX key element [element ...] RPUSHX key element [element ...]返回值插入后的list长度示例redis LPUSH mylist World (integer) 1 redis LPUSHX mylist Hello (integer) 2 redis LPUSHX myotherlist Hello (integer) 0 redis LRANGE mylist 0 -1 1) Hello 2) World redis LRANGE myotherlist 0 -1 (empty array)3. LRANGE获取从start到end区间的所有元素左闭右闭 [start, end]语法LRANGE key start end返回值指定区间的元素示例redis RPUSH mylist one (integer) 1 redis RPUSH mylist two (integer) 2 redis RPUSH mylist three (integer) 3 redis LRANGE mylist 0 0 1) one redis LRANGE mylist -3 2 1) one 2) two 3) three redis LRANGE mylist -100 100 1) one 2) two 3) three redis LRANGE mylist 5 10 (empty array)4. LPOP、RPOP从list左侧或者右侧取出元素头删或尾删语法LPOP key RPOP key返回值取出的元素或者nil示例redis RPUSH mylist one two three four five (integer) 5 redis LPOP mylist one redis LPOP mylist two redis LPOP mylist three redis LRANGE mylist 0 -1 1) four5. LINSERT在特定的位置前面或者后面插入元素语法LINSERT key BEFORE | AFTER pivot element返回值插入后list的长度示例redis RPUSH mylist Hello (integer) 1 redis RPUSH mylist World (integer) 2 redis LINSERT mylist BEFORE World There (integer) 3 redis LRANGE mylist 0 -1 1) Hello 2) There 3) World6. LLEN获取lsit长度语法LLEN key返回值返回list长度三、阻塞版本的命令Redis中的list可以当做简单的消息队列使用通过BLPOP, BRPOP来实现消费者操作BLPOP、BRPOP语法BLPOP key [key ...] timeout BRPOP key [key ...] timeout返回值取出的元素或者nil示例redis EXISTS list1 list2 (integer) 0 redis RPUSH list1 a b c (integer) 3 redis BLPOP list1 list2 0 1) list1 2) aEXISTS list1 list2(返回 0)检查list1和list2这两个键是否存在。返回 0 表示这两个列表目前都不存在。RPUSH list1 a b c(返回 3)向list1列表的右端依次推入 “a”、“b”、“c” 三个元素。返回 3 表示列表当前长度为 3。BLPOP list1 list2 0(返回 “list1” 和 “a”)这是 LPOP 的阻塞版本用于从左侧弹出元素。list1 list2表示同时监听这两个键Redis 会从左向右遍历哪个列表先有元素就从哪个弹出。0表示超时时间设为 0即永久阻塞等待直到有元素被弹出为止。返回结果是一个二元组list1表示元素是从这个 key 弹出的a表示弹出的具体元素值。因为list1中有元素且排在list2前面所以直接弹出了list1的头部元素 “a”。小结空列表处理差异当列表有元素时两者表现一致若列表为空非阻塞版本立即返回 nil而阻塞版本会等待指定的 timeout 时间期间 Redis 可处理其他命令但客户端处于阻塞状态。多键遍历机制当命令包含多个键时Redis 会从左向右依次遍历一旦遇到某个键对应的列表中有元素可弹出命令立即返回。多客户端竞争规则当多个客户端同时对同一个键执行 pop 操作时遵循“先到先得”原则最先执行命令的客户端会成功获取弹出的元素。