飞翔飞翔
主页
  • 计算机基础

    • TCP协议
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
主页
  • 计算机基础

    • TCP协议
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
  • 前言

    • 1.Redis简介
  • 第1章 核心数据类型

    • 1.Redis键(Key)
    • 2.Redis字符串(String)
    • 3.Redis哈希(Hash)
    • 4.Redis列表(List)
    • 5.Redis无序集合(Set)
    • 6.Redis有序集合(Sorted Set)
    • 7.Redis HyperLogLog
    • 8.Redis 发布订阅

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+
上一页
3.Redis哈希(Hash)
下一页
5.Redis无序集合(Set)