# Redis列表(List)
概念
Redis列表(List)是一种线性数据结构,基于双向链表实现。它以插入顺序存储元素,支持在头部(Left)或尾部(Right)高效插入、删除元素,并能通过索引直接访问或修改元素。
# 作用
队列/栈:通过组合命令
LPUSH
+RPOP
或RPUSH
+LPOP
实现先进先出(队列)或后进先出(栈)。动态列表:存储有序数据,如时间线、排行榜、操作日志等。
批量操作:支持范围查询、批量插入/删除,适合处理列表型数据。
# 特性
核心特性包括:
双向操作:支持头部和尾部的高效插入/删除(时间复杂度 O(1))。
索引访问:可通过索引直接访问元素(时间复杂度 O(n))。
动态扩展:长度自动调整,无固定容量限制。
允许重复:元素可重复,按插入顺序存储。
# 场景
消息队列:使用
LPUSH
生产消息,BRPOP
阻塞消费消息。最新消息排行:通过
LPUSH
插入新内容,LRANGE
快速获取最新N条。历史记录:存储用户浏览记录,限制列表长度防止内存溢出。
# 示例
# 1.创建列表并初始化数据
创建名为 languages 的列表,初始数据通过RPUSH
插入(尾插法):
127.0.0.1:6379> RPUSH languages c++ java python
(integer) 3 # 创建了3个元素:c++ -> java -> python
127.0.0.1:6379> LRANGE languages 0 -1 # 全列表查询:从下标0开始,到最后一个元素(-1)
1) "c++"
2) "java"
3) "python"
重新创建名为 languages 的列表,初始数据通过LPUSH
插入(头插法):
127.0.0.1:6379> DEL languages
(integer) 1
127.0.0.1:6379> LPUSH languages c++ java python
(integer) 3 # 创建了3个元素:python -> java -> c++
127.0.0.1:6379> LRANGE languages 0 -1
1) "python"
2) "java"
3) "c++"
在 Redis 中,RPUSH
用于将一个或多个值插入到列表的尾部(右边)。而LPUSH
则用于将一个或多个值插入到列表的头部(左边)。LRANGE
用于获取列表中指定范围内的元素,顺序与尾插法一致,与头插法相反。下面的例子,以尾插法初始化后的效果说明。
# 2.左侧插入
在列表头部插入一个或多个元素:
127.0.0.1:6379> LPUSH languages c
(integer) 4 # 列表变为:c -> c++ -> java -> python
127.0.0.1:6379> LRANGE languages 0 -1
1) "c"
2) "c++"
3) "java"
4) "python"
# 3.右侧插入
在列表尾部插入一个或多个元素:
127.0.0.1:6379> RPUSH languages C#
(integer) 5 # 列表变为:c -> c++ -> java -> python -> C#
127.0.0.1:6379> LRANGE languages 0 -1
1) "c"
2) "c++"
3) "java"
4) "python"
5) "C#"
# 4.左侧弹出
移除并返回列表头部元素:
127.0.0.1:6379> LPOP languages
"c" # 列表变为:c++ -> java -> python -> C#
127.0.0.1:6379> LRANGE languages 0 -1
1) "c++"
2) "java"
3) "python"
4) "C#"
# 5.右侧弹出
移除并返回列表尾部元素:
127.0.0.1:6379> RPOP languages
"C#" # 列表变为:c++ -> java -> python
127.0.0.1:6379> LRANGE languages 0 -1
1) "c++"
2) "java"
3) "python"
# 6.设置指定索引元素
修改列表中指定索引位置的元素:
127.0.0.1:6379> LSET languages 2 "Python"
OK # 列表变为:c++ -> java -> Python
127.0.0.1:6379> LRANGE languages 0 -1
1) "c++"
2) "java"
3) "Python"
# 7.删除元素
删除列表中指定数量的匹配元素:
127.0.0.1:6379> DEL languages # 重新初始化,方便演示
(integer) 1
127.0.0.1:6379> RPUSH languages c++ java python java java
(integer) 5
127.0.0.1:6379> LREM languages 1 java # 移除列表中,第一个匹配的 java 元素
(integer) 1
127.0.0.1:6379> LRANGE languages 0 -1
1) "c++"
2) "python"
3) "java"
4) "java"
# 8.获取指定索引元素
返回列表中指定索引位置的元素:
127.0.0.1:6379> LINDEX languages 2
"java" # 原列表索引2对应元素为 java
# 9.获取范围元素
返回列表中指定索引范围内的元素:
127.0.0.1:6379> DEL languages # 重新初始化,方便演示
(integer) 1
127.0.0.1:6379> RPUSH languages c c++ java python c#
(integer) 5
127.0.0.1:6379> LRANGE languages 0 -1 # 全列表查询:从下标0开始,到最后一个元素(-1)
1) "c"
2) "c++"
3) "java"
4) "python"
5) "c#"
127.0.0.1:6379> LRANGE languages 1 -2 # 从下标1开始,到倒数第二个元素(-2)
2) "c++"
3) "java"
4) "python"
127.0.0.1:6379> LRANGE languages 2 3 # 从下标2开始,到下标3结束
1) "java"
2) "python"
# 10.插入元素
在指定元素前或后插入新元素:
127.0.0.1:6379> LINSERT languages BEFORE python javascript # 在python前插入javascript
(integer) 6
127.0.0.1:6379> LRANGE languages 0 -1
1) "c"
2) "c++"
3) "java"
4) "javascript"
5) "python"
6) "c#"
127.0.0.1:6379> LINSERT languages AFTER python golang # 在python后插入golang
(integer) 7
127.0.0.1:6379> LRANGE languages 0 -1
1) "c"
2) "c++"
3) "java"
4) "javascript"
5) "python"
6) "golang"
7) "c#"
# 命令集
在 Redis 客户端(如 redis-cli )可以通过help @list
命令查找所有与列表相关的命令,效果如下:
127.0.0.1:6379> help @list
BLPOP key [key ...] timeout
summary: Remove and get the first element in a list, or block until one is available
since: 2.0.0
BRPOP key [key ...] timeout
summary: Remove and get the last element in a list, or block until one is available
since: 2.0.0
BRPOPLPUSH source destination timeout
summary: Pop a value from a list, push it to another list and return it; or block until one is available
since: 2.2.0
……
以下是 Redis-x64-3.0.504 版本的列表命令集:
命令 | 说明 | 版本 |
---|---|---|
BLPOP key [key ...] timeout | 移除并获取列表的第一个元素,或阻塞直到有元素可用 | 2.0.0+ |
BRPOP key [key ...] timeout | 移除并获取列表的最后一个元素,或阻塞直到有元素可用 | 2.0.0+ |
BRPOPLPUSH source destination timeout | 从列表弹出一个值,推入另一列表并返回该值,或阻塞直到有元素可用 | 2.2.0+ |
LINDEX key index | 通过索引获取列表中的元素 | 1.0.0+ |
LINSERT key BEFORE|AFTER pivot value | 在列表中指定元素前或后插入新元素 | 2.2.0+ |
LLEN key | 获取列表长度 | 1.0.0+ |
LPOP key | 移除并获取列表的第一个元素 | 1.0.0+ |
LPUSH key value [value ...] | 在列表头部插入一个或多个值 | 1.0.0+ |
LPUSHX key value | 仅在列表存在时,将值插入到列表头部 | 2.2.0+ |
LRANGE key start stop | 获取列表指定范围内的元素 | 1.0.0+ |
LREM key count value | 从列表中移除指定数量的匹配元素 | 1.0.0+ |
LSET key index value | 通过索引设置列表元素的值 | 1.0.0+ |
LTRIM key start stop | 修剪列表至指定范围 | 1.0.0+ |
RPOP key | 移除并获取列表的最后一个元素 | 1.0.0+ |
RPOPLPUSH source destination | 移除列表的最后一个元素,将其推入另一列表并返回 | 1.2.0+ |
RPUSH key value [value ...] | 在列表尾部追加一个或多个值 | 1.0.0+ |
RPUSHX key value | 仅在列表存在时,将值追加到列表尾部 | 2.2.0+ |

微信公众号

QQ交流群
如若发现错误,诚心感谢反馈。
愿你倾心相念,愿你学有所成。
愿你朝华相顾,愿你前程似锦。