Redis常见数据类型List列表使用详解

 更新时间:2024年12月07日 14:59:37   作者:呼啦啦啦啦啦啦啦啦  
Redis的List是一种有序的字符串集合,支持两端高效插入和删除,适用于队列和栈,这篇文章主要介绍了Redis常见数据类型List列表使用的相关资料,需要的朋友可以参考下

前言

在 Redis 中,List 是一种非常常见的数据类型,用于表示一个有序的字符串集合。与传统的链表结构类似,Redis 的 List 支持在两端进行高效的插入和删除操作,因此非常适合实现队列(Queue)和栈(Stack)等数据结构。

Redis List 的基本概念

  • 有序的字符串集合:List中的元素按插入顺序排列,每个元素都是一个字符串。
  • 双端队列:Redis List 是一个双端队列(Deque),允许你在列表的两端高效地进行操作(插入和删除)。
  • 最大长度:Redis 的 List 数据类型没有最大长度限制,理论上可以存储无限多的元素,除非内存不足。

List命令:

LPUSH

LPUSH 命令用于将一个或多个元素插入到列表的头部(即左侧)。如果列表不存在,Redis 会自动创建一个空列表并执行插入操作。

语法: LPUSH key value [value ...] 

127.0.0.1:6379> lpush key 1 2 3 4
(integer) 4
127.0.0.1:6379> lrange key 0 -1
1) "4"
2) "3"
3) "2"
4) "1"

返回值

  • 返回插入元素后的列表长度。

LPUSHX 

LPUSHX 是一个用于将元素推入到列表(list)头部的命令,但与 LPUSH 不同的是,LPUSHX 只有在列表已存在的情况下才会执行操作。如果列表不存在,LPUSHX 不会做任何操作,也不会创建新的列表。 

语法:LPUSHX key value

127.0.0.1:6379> lpush key world
(integer) 1
127.0.0.1:6379> lpushx key hello 
(integer) 2
127.0.0.1:6379> lpushx key2 hi 
(integer) 0
127.0.0.1:6379> lrange key 0 -1
1) "hello"
2) "world"
127.0.0.1:6379> lrange key2 0 -1
(empty array)

总结:

LPUSHX 用于将元素添加到已经存在的列表中,它不会创建新的列表,这与 LPUSH(无论列表是否存在都创建新列表)有所不同。

 RPUSH

RPUSH 命令用于将一个或多个元素插入到列表的尾部(即右侧)。如果列表不存在,Redis 会自动创建一个空列表并执行插入操作。

语法:RPUSH key value [value ...] 

127.0.0.1:6379> rpush key 1 2 3 4
(integer) 4
127.0.0.1:6379> rpush key 5 6 7 8
(integer) 8
127.0.0.1:6379> lrange key 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"
8) "8"

返回值:

  • 返回插入元素后的列表长度。

RPUSHX 同理 LPUSHX

LRANGE

LRANGE 命令用于获取列表中的一个指定范围的元素。你可以指定开始和结束的索引位置,然后 Redis 会返回该范围内的所有元素。

语法:LRANGE key start stop

127.0.0.1:6379> lrange key 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"
8) "8"
127.0.0.1:6379> lrange key 0 3
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> lrange key 0 100
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"
8) "8"
127.0.0.1:6379> lrange key 8 10
(empty array)
127.0.0.1:6379> lrange key -8 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"
8) "8"

返回值:

  • 返回指定范围内的所有元素。如果范围超出列表长度,Redis 会返回所有符合范围条件的元素。

总结:

  • LRANGE 用于获取 Redis 列表中指定范围的元素。
  • 支持负数索引,可以从列表尾部获取元素。
  • 如果 start 和 stop 超出了列表的实际长度,Redis 会自动调整范围。

LPOP

LPOP 命令用于从列表的头部(左侧)移除并返回一个元素。执行该命令时,列表的第一个元素会被移除,并返回这个被移除的元素。如果列表为空,LPOP 会返回 nil

语法:LPOP key

127.0.0.1:6379> rpush key 1 2 3 4
(integer) 4
127.0.0.1:6379> lpop key
"1"
127.0.0.1:6379> lpop key
"2"
127.0.0.1:6379> lpop key
"3"
127.0.0.1:6379> lpop key
"4"
127.0.0.1:6379> lpop key
(nil)

返回值:

  • 返回被移除的列表元素。
  • 如果列表为空,返回 nil

总结:

LPOP 是一个用于从 Redis 列表左侧移除并返回一个元素的命令。如果列表为空,返回 nil

RPOP 同理 
 RPOP 命令用于从列表的尾部(右侧)移除并返回一个元素。执行该命令时,列表的最后一个元素会被移除,并返回该元素。如果列表为空,RPOP 会返回 nil

LINDEX

LINDEX 命令用于获取列表中指定位置的元素。你可以通过指定一个索引来获取列表中对应位置的元素。

语法:LINDEX key index

127.0.0.1:6379> rpush key 1 2 3 4 5 6 7 8
(integer) 8
127.0.0.1:6379> lindex key 0
"1"
127.0.0.1:6379> lindex key 7
"8"
127.0.0.1:6379> lindex -1
127.0.0.1:6379> lindex key -1
"8"
127.0.0.1:6379> lindex key -7
"2"
127.0.0.1:6379> lindex key 9
(nil)

返回值:

        返回指定位置的元素。

        如果指定的索引超出了列表的范围,返回 nil

总结:

LINDEX 用于获取 Redis 列表中指定位置的元素。可以通过正数索引或负数索引来指定位置。如果索引超出范围,返回 nil。这是一个读取操作,而不会改变列表内容

LINSERT

LINSERT 命令用于在列表中指定位置插入一个元素。你可以在列表的 左侧 或 右侧 插入元素,依据你指定的插入位置。语法:LINSERT key BEFORE|AFTER pivot element 

127.0.0.1:6379> rpush key a b c d
(integer) 4
127.0.0.1:6379> linsert key before b 111
(integer) 5
127.0.0.1:6379> linsert key after b 222
(integer) 6
27.0.0.1:6379> linsert key before e 333
(integer) -1
127.0.0.1:6379> lrange key 0 -1
1) "a"
2) "111"
3) "b"
4) "222"
5) "c"
6) "d"

返回值:

        如果操作成功,返回列表的新长度。

        如果 pivot 元素在列表中不存在,则不插入任何元素,返回 -1

总结:

LINSERT 命令在 Redis 列表中指定位置插入一个新元素。可以在指定元素的 前 或 后 插入。它是一个修改列表的命令,成功执行后返回新的列表长度,如果指定的 pivot 元素不存在,则返回 -1

 LLEN

LLEN 命令用于获取列表的长度,即列表中元素的数量。

语法:LLEN key 

127.0.0.1:6379> lrange key 0 -1
1) "a"
2) "111"
3) "b"
4) "222"
5) "c"
6) "d"
127.0.0.1:6379> llen key
(integer) 6
127.0.0.1:6379> llen key2
(integer) 0

返回值:

返回列表中元素的数量。如果该 key 对应的不是一个列表,或者该列表为空,返回 0

如果 key 不存在,返回 0

总结:

LLEN 命令用于获取 Redis 列表的长度,返回列表中元素的数量。如果列表为空或不存在,返回 0

 阻塞版本命令

 blpop 和 brpop 是 lpop 和 rpop 的阻塞版本,和对应非阻塞版本的作用基本⼀致,除了: 
• 在列表中有元素的情况下,阻塞和⾮阻塞表现是⼀致的。但如果列表中没有元素,非阻塞版本会理解返回 nil,但阻塞版本会根据 timeout,阻塞⼀段时间,期间 Redis 可以执行其他命令,但要求执行该命令的客户端会表现为阻塞状态(如图 2-22 )。 
• 命令中如果设置了多个键,那么会从左向右进⾏遍历键,⼀旦有一个键对应的列表中可以弹出元素,命令立即返回。
• 如果多个客户端同时多⼀个键执行 pop,则最先执行命令的客户端会得到弹出的元素。 

图 2-22 阻塞版本的 blpop 和 非阻塞版本 lpop 的区别

演示一下BLPOP

BLPOP 命令是 阻塞式弹出(Blocking Pop)命令,它用于从一个或多个列表中弹出一个元素。如果列表为空,命令会阻塞,直到有元素可弹出为止,或者超时。

语法:BLPOP key [key ...] timeout

此时再开一个服务器去增加key里面的元素

此时发现它在100内只有接收到key中是否有信息即可

返回值:

        如果成功弹出了元素,返回一个列表,包含两个元素:

        第一个元素是列表名称 key

        第二个元素是从该列表中弹出的值。

        如果在 timeout 时间内没有元素可弹出,命令返回 nil

总结:

BLPOP 是 Redis 中的阻塞式弹出命令,可以从一个或多个列表中弹出元素。它会阻塞直到列表中有元素可供弹出,或者超时。如果超时,命令返回 nil。此命令常用于任务队列或消息队列的实现。

 BRPOP同理BLPOP

List使用场景

消息队列

Redis 可以使用 lpush + brpop 命令组合实现经典的阻塞式生产者-消费者模型队列,
生产者客户端使用 lpush 从列表左侧插入元素,多个消费者客户端使用 brpop 命令阻塞式地从队列中 "争抢" 队首元素。通过多个客户端来保证消费的负载均衡和高可用性。 

总结 

到此这篇关于Redis常见数据类型List列表使用详解的文章就介绍到这了,更多相关Redis List列表详解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Redis遍历所有key的两个命令(KEYS 和 SCAN)

    Redis遍历所有key的两个命令(KEYS 和 SCAN)

    这篇文章主要介绍了Redis遍历所有key的两个命令(KEYS 和 SCAN),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • springboot使用Redis作缓存使用入门教程

    springboot使用Redis作缓存使用入门教程

    这篇文章主要介绍了springboot使用Redis作缓存使用入门教程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-07-07
  • SpringBoot集成Redis的思路详解

    SpringBoot集成Redis的思路详解

    Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。接下来通过本文给大家分享SpringBoot集成Redis的详细过程,感兴趣的朋友一起看看吧
    2021-10-10
  • Redis持久化方式之RDB和AOF的原理及优缺点

    Redis持久化方式之RDB和AOF的原理及优缺点

    在Redis中,数据可以分为两类,即内存数据和磁盘数据,Redis 提供了两种不同的持久化方式,其中 RDB 是快照备份机制,AOF 则是追加写操作机制,本文将详细给大家介绍Redis 持久化方式RDB和AOF的原理及优缺点,感兴趣的同学可以跟着小编一起来学习
    2023-06-06
  • Centos 7 如何安装Redis(推荐)

    Centos 7 如何安装Redis(推荐)

    这篇文章主要介绍了Centos 7 如何安装Redis,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • 基于session Redis实现登录

    基于session Redis实现登录

    这篇文章主要介绍了基于session Redis实现登录的相关资料,需要的朋友可以参考下
    2023-10-10
  • 查看redis的缓存时间方式

    查看redis的缓存时间方式

    这篇文章主要介绍了查看redis的缓存时间方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • Redis的大Key对持久化影响分析

    Redis的大Key对持久化影响分析

    为了保证数据的持久性,Redis提供了两种持久化的方式,本文主要介绍了Redis的大Key对持久化影响分析,具有一定的参考价值,感兴趣的可以了解一下
    2024-04-04
  • Redis中SDS简单动态字符串详解

    Redis中SDS简单动态字符串详解

    Redis中的SDS(Simple Dynamic String)是一种自动扩容的字符串实现方式,它可以提供高效的字符串操作,并且支持二进制安全。SDS的设计使得它可以在O(1)时间内实现字符串长度的获取和修改,同时也可以在O(N)的时间内进行字符串的拼接和截取。
    2023-04-04
  • 解决Redis开启远程访问及密码问题

    解决Redis开启远程访问及密码问题

    这篇文章主要介绍了Redis开启远程访问及密码的教程,文中给大家提到了Redis启动报错解决方法,需要的朋友可以参考下
    2019-10-10

最新评论