速通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 的长度。

示例:

速通Redis基础(三):掌握Redis的列表类型和命令_第1张图片

嗯?问题来了,为什么不是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. 不存在的情况

2. 存在的情况


RPUSH

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

语法:

RPUSH key element [element ...]

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

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

示例:

速通Redis基础(三):掌握Redis的列表类型和命令_第2张图片

RPUSHX

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

语法:

RPUSHX key element [element ...]

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

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

示例:

LRANGE

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

语法:

LRANGE key start stop

时间复杂度:O(N)

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

示例:

速通Redis基础(三):掌握Redis的列表类型和命令_第3张图片

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  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)

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

你可能感兴趣的:(redis,redis,数据库,缓存,后端,数据结构)