[TOC] #### 1. List 类型 --- Redis 的 List(列表)是其五种基础类型之一,本质上是一个有序的字符串列表。 你可以把它想象成一个 “双向传送带”,即能从左边放东西,也能从右边放东西,非常适合用来实现消息队列、最新列表等功能 核心特性与底层原理: + 有序性:元素按照插入顺序排列 + 可重复:允许存储重复的元素 + 双端高效:在列表的头部和尾部进行插入和删除操作的时间复杂度都是 O(1),速度极快 #### 2. 常用命令 --- 常用命令速查表 | 命令 | 描述 | 典型用途 | | ------------ | ------------ | ------------ | | lpush | 从列表左侧插入一个或多个元素 | 生产者入队、推入最新数据 | | rpush | 从列表右侧插入一个或多个元素 | 生产者入队 | | lpop | 移除并返回列表最左侧的一个元素 | 消费者出队、获取最新数据 | | rpop | 移除并返回列表最右侧的一个元素 | 消费者出队 | | lrange | 获取列表指定范围内的元素(支持负数索引)| 查看列表内容、分页查询 | | llen | 获取列表长度| 获取消息堆积数量 | List 类型是即插即用的:当你第一次向一个不存在的键(Key)插入数据时,Redis 会自动创建这个 List ```bash # 从左侧插入元素 lpush mylist 'html' lpush mylist 'css' 'js' # 获取列表长度 llen mylist # 查看列表所有元素 lrange mylist 0 -1 # 删除指定 key del mylist ``` #### 3. 详细操作演示 --- ##### 插入与弹出 List 既可以当栈(后进先出),也可以当队列(先进先出) ```bash # 1. 插入数据 # 左侧插入 127.0.0.1:6379> lpush mylist 'A' 'B' (integer) 2 # 右侧插入 127.0.0.1:6379> rpush mylist 'C' 'D' (integer) 4 # 2. 查看列表(顺序为: B -> A -> C -> D) 127.0.0.1:6379> lrange mylist 0 -1 1) "B" 2) "A" 3) "C" 4) "D" # 3. 弹出数据 # 从左侧弹出(相当于栈顶弹出) 127.0.0.1:6379> lpop mylist "B" # 从右侧弹出 127.0.0.1:6379> rpop mylist "D" ``` ##### 范围查询与索引 + 索引规则:0 表示第一个元素,-1 表示最后一个元素,-2 表示倒数第二个 + 语法格式:`lrange key start stop` ```bash # 准备一个 List 数据 lpush language 'html' 'css' 'javascript' 'vue' # 获取前三个元素 lrange language 0 3 # 获取后三个元素 lrange language -3 -1 ``` ##### 裁剪与删除操作 `ltrim`:这是一个非常有用的命令,常用于 “保留最近 N 条记录” 的场景 ```bash # 准备一个 List 数据 lpush jobs 'html' 'css' 'js' 'vue' 'uniapp' 'thinkphp' # 只保留前三个元素 ltrim jobs 0 2 # 查看 List 数据 lrange jobs 0 -1 ``` `lrem` 是 Redis 中用于从列表(List)中删除指定元素的命令,常用于队列去重、移除无效数据等场景 基本语法: + key:列表的键名 + count:支持正数和负数,表示删除数量和方向 + element:要删除的元素值 + 返回值是删除的元素个数 ```plaintext lrem key count element ``` 当 `count > 0` 时,表示从左往右删除 count 个指定元素 ```bash # 准备一个列表("d" "a" "b" "a" "c" "b" "a") lpush code 'a' 'b' 'c' 'a' 'b' 'a' 'd' # 从左往右删除 2 个 a,变为了:"d" "b" "c" "b" "a" lrem code 2 'a' ``` 当 `count < 0` 时,表示从右往左删除 count 个指定元素 ```bash # 准备一个列表("d" "a" "b" "a" "c" "b" "a") lpush code 'a' 'b' 'c' 'a' 'b' 'a' 'd' # 从右往删除 2 个 a,变为了:"d" "a" "b" "c" "b" lrem code -2 'a' ``` 当 `count = 0` 时,表示删除全部指定元素 ```bash # 准备一个列表("d" "a" "b" "a" "c" "b" "a") lpush code 'a' 'b' 'c' 'a' 'b' 'a' 'd' # 删除列表中所有的 a,变为了:"d" "b" "c" "b" lrem code 0 'a' ``` `lrem` 的使用场景(面试常问) ```bash # 队列去重(移除队列中重复任务) lrem queue 0 "user:1001" # 取消任务(删除某个任务,只删一个) lrem task_queue 1 "task_id_123" # 修复脏数据(批量清理错误数据) lrem list 0 "invalid_data" ```