速通Redis基础(三):掌握Redis的列表类型和命令

目录

Redis列表类型

Redis列表的基本命令

LPUSH

LPUSHX

RPUSH

RPUSHX

LRANGE

LPOP

RPOP

LINDEX

LINSERT

LLEN

阻塞版本命令

BLPOP

BRPOP

Redis的列表命令小结


Redis是一种高性能、开源的NoSQL数据库,以其支持多种数据类型而闻名。在前两篇博客中,我们介绍了Redis的字符串和哈希类型。今天,我们将深入研究Redis的另一种重要数据类型------列表(List)以及相关命令。

Redis列表类型

Redis的列表是一个有序的数据集合,可以包含重复的元素。它类似于其他编程语言中的数组,但有一些特定的功能和命令使其非常有用。以下是Redis列表的一些关键特性:

  1. 有序性:列表中的元素保持插入顺序,这使得列表非常适合实现队列、堆栈和其他需要有序数据的场景。

  2. 允许重复元素:与集合不同,列表允许包含相同的元素多次。

  3. 支持快速的头尾插入和删除:Redis的列表操作非常高效,可以在常量时间内在列表的头部和尾部插入或删除元素。

  4. 适用范围广泛:列表可用于实现消息队列、最近浏览、时间线和更多应用。

Redis列表的基本命令

LPUSH

将⼀个或者多个元素从左侧放入(头插)到 list 中。

语法:

复制代码
 LPUSH key element [element ...]

**时间复杂度:**只插入⼀个元素为 O(1), 插入多个元素为 O(N), N 为插入元素个数

**返回值:**插入后 list 的长度。

示例:

嗯?问题来了,为什么不是1234,而是4321?

Redis的LPUSH命令会将元素按照参数的顺序从左到右插入到列表的头部 所以,当你执行以下命令时:

复制代码
LPUSH ids 1 2 3 4

Redis会按照参数的顺序将1、2、3、4从左到右插入到列表ids的头部。这就是为什么你在执行LRANGE命令时得到的顺序是4321而不是1234。列表中的元素保持插入顺序,所以最后插入的元素4位于列表的最左侧,3位于4的右侧,依此类推。

LPUSHX

在 key 存在时,将⼀个或者多个元素从左侧放入(头插)到 list 中。不存在,直接返回0

语法:

复制代码
 LPUSHX key element [element ...]

**时间复杂度:**只插入⼀个元素为 O(1), 插入多个元素为 O(N), N 为插入元素个数

**返回值:**插入后 list 的长度。

示例:

  1. 不存在的情况
  1. 存在的情况

RPUSH

将⼀个或者多个元素从右侧放入(尾插)到 list 中。

语法:

复制代码
RPUSH key element [element ...]

**时间复杂度:**只插入⼀个元素为 O(1), 插入多个元素为 O(N), N 为插入元素个数

**返回值:**插入后 list 的长度。

示例:

RPUSHX

在 key 存在时,将⼀个或者多个元素从右侧放⼊(尾插)到 list 中。不存在返回0

语法:

复制代码
RPUSHX key element [element ...]

**时间复杂度:**只插入⼀个元素为 O(1), 插入多个元素为 O(N), N 为插入元素个数

**返回值:**插入后 list 的长度。

示例:

LRANGE

获取从 start 到 end 区间的所有元素,左闭右闭。

语法:

复制代码
LRANGE key start stop

**时间复杂度:**O(N)

**返回值:**指定区间的元素。

示例:

LPOP

从 list 左侧取出元素(即头删)。

语法:

复制代码
LPOP key

**时间复杂度:**O(1)

**返回值:**取出的元素或者 nil。

示例:

RPOP

从 list 右侧取出元素(即尾删)。

语法:

复制代码
RPOP key

**时间复杂度:**O(1)

**返回值:**取出的元素或者 nil。

LINDEX

获取从左数第 index 位置的元素。

语法:

复制代码
LINDEX key index

**时间复杂度:**O(N)

**返回值:**取出的元素或者 nil。

LINSERT

在特定位置插入元素。

语法:

复制代码
LINSERT key <BEFORE | AFTER> pivot element

**时间复杂度:**O(N)

**返回值:**插入后的 list 长度。

LLEN

获取 list 长度。

语法:

复制代码
LLEN key

**时间复杂度:**O(1)

**返回值:**list 的长度。

示例:

阻塞版本命令

blpop 和 brpop 是 lpop 和 rpop 的阻塞版本,和对应非阻塞版本的作用基本⼀致,除了:

• 在列表中有元素的情况下,阻塞和非阻塞表现是⼀致的。但如果列表中没有元素,非阻塞版本会理 解返回 nil,但阻塞版本会根据 timeout,阻塞⼀段时间,期间 Redis 可以执行其他命令,但要求执行该命令的客户端会表现为阻塞状态。

• 命令中如果设置了多个键,那么会从左向右进行遍历键,⼀旦有⼀个键对应的列表中可以弹出元 素,命令立即返回。

• 如果多个客户端同时多⼀个键执行 pop,则最先执行命令的客户端会得到弹出的元素。

BLPOP

LPOP 的阻塞版本。

语法:

复制代码
 BLPOP key [key ...] timeout

**时间复杂度:**O(1)

**返回值:**取出的元素或者 nil。

BRPOP

RPOP 的阻塞版本。

语法:

复制代码
BRPOP key [key ...] timeout

**时间复杂度:**O(1)

**返回值:**取出的元素或者 nil。

Redis的列表命令小结

|------|-----------------------------------------|------------------------------------------|
| 操作类型 | 命令 | 时间复杂度 |
| 添加 | rpush key value [value ...] | O(k),k 是元素个数 |
| 添加 | lpush key value [value ...] | O(k),k 是元素个数 |
| 添加 | linsert key before | after pivot value | O(n),n 是 pivot 距离头尾的距离 |
| 查找 | lrange key start end | O(s+n),s 是 start 偏移量,n 是 start 到 end 的范围 |
| 查找 | lindex key index | O(n),n 是索引的偏移量 |
| 查找 | llen key | O(1) |
| 删除 | lpop key | O(1) |
| 删除 | rpop key | O(1) |
| 删除 | lremkey count value | O(k),k 是元素个数 |
| 删除 | ltrim key start end | O(k),k 是元素个数 |
| 修改 | lset key index value | O(n),n 是索引的偏移量 |
| 阻塞操作 | blpop brpop | O(1) |

制作不易,希望大家多多支持噢~~🤗

相关推荐
许小燚17 分钟前
线性表——双向链表
数据结构·链表
ai小鬼头1 小时前
Ollama+OpenWeb最新版0.42+0.3.35一键安装教程,轻松搞定AI模型部署
后端·架构·github
互联网搬砖老肖1 小时前
运维打铁: MongoDB 数据库集群搭建与管理
运维·数据库·mongodb
萧曵 丶2 小时前
Rust 所有权系统:深入浅出指南
开发语言·后端·rust
典学长编程2 小时前
数据库Oracle从入门到精通!第四天(并发、锁、视图)
数据库·oracle
老任与码2 小时前
Spring AI Alibaba(1)——基本使用
java·人工智能·后端·springaialibaba
积跬步,慕至千里2 小时前
clickhouse数据库表和doris数据库表迁移starrocks数据库时建表注意事项总结
数据库·clickhouse
qqxhb2 小时前
零基础数据结构与算法——第四章:基础算法-排序(上)
java·数据结构·算法·冒泡·插入·选择
华子w9089258593 小时前
基于 SpringBoot+VueJS 的农产品研究报告管理系统设计与实现
vue.js·spring boot·后端
极限实验室3 小时前
搭建持久化的 INFINI Console 与 Easysearch 容器环境
数据库