# Redis列表(List)

概念

Redis列表(List)是一种线性数据结构,基于双向链表实现。它以插入顺序存储元素,支持在头部(Left)或尾部(Right)高效插入、删除元素,并能通过索引直接访问或修改元素。

# 作用

  • 队列/栈:通过组合命令LPUSH+RPOPRPUSH+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交流群
原创网站开发,偏差难以避免。

如若发现错误,诚心感谢反馈。

愿你倾心相念,愿你学有所成。

愿你朝华相顾,愿你前程似锦。