Redis 列表(Lists) 复习

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: Redis中的Lists相当于双向列表,实现原理是一个双向链表(其底层是一个快速列表),即可以支持反向查找和遍历,更方便操作。插入和删除操作非常快,时间复杂度为o(1),但是索引定位很慢,时间复杂度为o(n)。Redis set 类型中成员不能重复。

介绍

Redis中的Lists相当于双向列表,实现原理是一个双向链表(其底层是一个快速列表),即可以支持反向查找和遍历,更方便操作。插入和删除操作非常快,时间复杂度为o(1),但是索引定位很慢,时间复杂度为o(n)。Redis set 类型中成员不能重复。

应用场景

Lists的应用场景非常多,可以利用它轻松实现热销榜;可以实现工作队列(利用lists的push操作,将任务存在Lists中,然后工作线程再用pop操作将任务取出进行执行);可以实现最新列表,比如最新评论等。

命令大纲

新增(LPUSH、RPUSH、LPUSHX、RPUSHX、LINSERT、LSET)

一个或多个值插入到列表(头部\尾部)(LPUSH)

# LPUSH key element [element ...]
# element 元素值
# 返回值:列表的长度
>  LPUSH listtest 3 2 1
3 
# RPUSH key element [element ...]
# element 元素值
# 返回值:列表的长度
> RPUSH listtest 4 5 6
6

一个或多个值插入到已存在的列表(头部\尾部)(LPUSHX、RPUSHX)

LPUSHX key element [element ...]
# element 元素值
# 返回值:列表的长度,不存在则返回0
> LPUSHX listtest 7
(integer) 7
RPUSHX key element [element ...]
# element 元素值
# 返回值:列表的长度,不存在则返回0
> RPUSHX listtest 8
(integer) 8

指定的元素(前\后)插入元素(LINSERT)

LINSERT key BEFORE|AFTER pivot element

当指定元素不存在于列表中时,不执行任何操作

#  LINSERT key BEFORE|AFTER pivot element
# BEFORE 指定元素前,AFTER指定元素后
> LRANGE listtest 0 -1
1) "7"
2) "1"
3) "2"
4) "3"
5) "4"
6) "5"
7) "6"
> LINSERT listtest after 4 10
(integer) 8
> LRANGE listtest 0 -1
1) "7"
2) "1"
3) "2"
4) "3"
5) "4"
6) "10"
7) "5"
8) "6"
> linsert listtest before 22 1
(integer) -1

通过索引来设置元素的值(LSET)

当索引参数超出范围,或对一个空列表进行 LSET 时,返回一个错误。

# LSET key index element
# 
> LRANGE listtest 0 -1
1) "7"
2) "1"
3) "2"
4) "3"
5) "4"
6) "10"
7) "5"
8) "7"
> LSET listtest 7 8
OK
> LRANGE listtest 0 -1
1) "7"
2) "1"
3) "2"
4) "3"
5) "4"
6) "10"
7) "5"
8) "8"

查询

返回指定区间内的元素(LRANGE)

LRANGE key start stop

下标(index)参数 start 和 stop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。

也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。

# LRANGE key start stop
# 包含指定区间内的元素
> LRANGE listtest 0 -1
1) "7"
2) "1"
3) "2"
4) "3"
5) "4"
6) "5"
7) "6"

通过索引获取列表中的元素(LINDEX)

也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。

# LINDEX key index
# 返回值:存在则返回,不存在,返回 nil 。
> LRANGE listtest 0 -1
1) "7"
2) "1"
3) "2"
4) "3"
5) "4"
6) "10"
7) "5"
8) "8"
> LINDEX listtest 2
"2"
127.0.0.1:6379> LINDEX listtest -1
"8"

移出并获取列表的(第一\最后一)个元素 (LPOP\RPOP)

# LPOP key [count]
# count 移除或者返回的条数
# 返回值:不存在则返回nil
> LPOP listtest 2
1) "7"
2) "1"
# RPOP key [count]
> RPOP listtest 2
1) "8"
2) "5"

获取列表长度(LLEN)

LLEN key
> lrange listtest 0 -1
1) "2"
2) "3"
3) "4"
4) "10"
> LLEN listtest
(integer) 4

移出并获取列表的(第一/最后一)个元素(BLPOP、BRPOP)

BLPOP、BRPOP 是列表的阻塞式(blocking)弹出原语

多个 key 参数时,按参数 key 的先后顺序依次检查各个列表,弹出第一个非空列表的尾部元素

BLPOP key [key ...] timeout
BRPOP key [key ...] timeout
# timeout :0 是无限时间

返回值:

  • 假如在指定时间内没有任何元素被弹出,则返回一个 nil 和等待时长。
  • 反之,返回一个含有两个元素的列表,第一个元素是被弹出元素所属的 key ,第二个元素是被弹出元素的值。
# 返回值:弹出元素所属的 key 和值
> BLPOP listtest listtest2 0
1) "listtest"
2) "3"
> BRPOP listtest 0
1) "listtest"
2) "10"

移除最后一个元素,将该元素添加到一个新列表并返回(RPOPLPUSH)

RPOPLPUSH source destination
# source 源list destination 目的list
# 返回值:弹出的元素,不存在返回nil
> RPOPLPUSH listtest listtest2
"6"

移除最后一个元素,将该元素添加到一个新列表并返回,没有元素则阻塞(BRPOPLPUSH)

BRPOPLPUSH source destination timeout

RPOPLPUSH 阻塞版本 BRPOPLPUSH

用法与RPOPLPUSH一样

返回值

假如在指定时间内没有任何元素被弹出,则返回一个 nil 和等待时长。 反之,返回一个含有两个元素的列表,第一个元素是被弹出元素的值,第二个元素是等待时长。

<!--#### 用途:[安全的队列](#用途:安全的队列)-->

<!--#### 用途:[循环列表](#用途:循环列表)-->

其他操作

修剪保留指定区间内的元素(LTRIM)

LTRIM key start stop
 # start 开始位置 stop结束位置

下标 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。

返回值

命令执行成功时,返回 ok

> LRANGE listtest2  0 -1
1) "6"
2) "4"
3) "3"
4) "2"
5) "1"
6) "2"
> LTRIM listtest2 1 -1
OK
> LRANGE listtest2  0 -1
1) "4"
2) "3"
3) "2"
4) "1"
5) "2"

移除列表元素(LREM)

LREM key count element
# element 元素

count 的值可以是以下几种:

count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。
count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。
count = 0 : 移除表中所有与 value 相等的值。

返回值:

被移除元素的数量。

因为不存在的 key 被视作空表(empty list),所以当 key 不存在时, LREM 命令总是返回 0 。

> LRANGE listtest2  0 -1
1) "4"
2) "3"
3) "2"
4) "1"
5) "2"
127.0.0.1:6379> LREM listtest2 -2 2
(integer) 2
127.0.0.1:6379> LRANGE listtest2  0 -1
1) "4"
2) "3"
3) "1"

引用

Redis 列表(List) | 菜鸟教程

List(列表) — Redis 命令参考

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
7月前
|
NoSQL Shell Redis
2、Redis列表
2、Redis列表
|
2月前
|
NoSQL 关系型数据库 MySQL
Redis 列表(List)
10月更文挑战第16天
30 2
|
1月前
|
存储 NoSQL Java
Redis命令:列表模糊删除详解
通过本文的介绍,我们详细探讨了如何在Redis中实现列表的模糊删除。虽然Redis没有直接提供模糊删除命令,但可以通过组合使用 `LRANGE`和 `LREM`命令,并在客户端代码中进行模糊匹配,来实现这一功能。希望本文能帮助你在实际应用中更有效地操作Redis列表。
54 0
|
2月前
|
存储 分布式计算 NoSQL
大数据-40 Redis 类型集合 string list set sorted hash 指令列表 执行结果 附截图
大数据-40 Redis 类型集合 string list set sorted hash 指令列表 执行结果 附截图
29 3
|
2月前
|
缓存 NoSQL Redis
Redis命令:列表模糊删除详解
Redis命令:列表模糊删除详解
73 3
|
1月前
|
存储 NoSQL Redis
Redis常见面试题:ZSet底层数据结构,SDS、压缩列表ZipList、跳表SkipList
String类型底层数据结构,List类型全面解析,ZSet底层数据结构;简单动态字符串SDS、压缩列表ZipList、哈希表、跳表SkipList、整数数组IntSet
|
3月前
|
消息中间件 存储 NoSQL
4)深度解密 Redis 的列表(List)
4)深度解密 Redis 的列表(List)
39 1
|
4月前
|
存储 NoSQL 算法
Redis6入门到实战------ 三、常用五大数据类型(列表(List)、集合(Set)、哈希(Hash)、Zset(sorted set))
这是关于Redis 6入门到实战的文章,具体内容涉及Redis的五大数据类型:列表(List)、集合(Set)、哈希(Hash)、有序集合(Zset(sorted set))。文章详细介绍了这些数据类型的特点、常用命令以及它们背后的数据结构。如果您有任何关于Redis的具体问题或需要进一步的帮助,请随时告诉我。
|
7月前
|
存储 消息中间件 NoSQL
Redis列表:高效消息通信与实时数据处理的利器
Redis列表:高效消息通信与实时数据处理的利器
|
5月前
|
存储 NoSQL 容灾
Redis问题之压缩列表zipList在Redis中有哪些应用场景
Redis问题之压缩列表zipList在Redis中有哪些应用场景