首页 > 数据库 >详解Redis的List类型及相关命令

详解Redis的List类型及相关命令

时间:2024-12-31 19:03:00浏览次数:3  
标签:mylist List 元素 redis 详解 LRANGE key integer Redis

目录

LPUSH

LPUSHX

RPUSH

RPUSHX

LRANGE

LPOP

RPOP

LINDEX

LINSERT

LLEN

阻塞版本命令

BLPOP

BRPOP

内部编码

应用场景


Redis中的List类型,是保证元素有序的,支持队列从两端进行插入删除和获取,并且元素时刻重复的。

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

语法

LPUSH key element [element ...]
时间复杂度:只插⼊⼀个元素为 O(1), 插⼊多个元素为 O(N), N 为插⼊元素个数. 返回值:插⼊后 list 的⻓度。 举例
redis> LPUSH mylist "world"
(integer) 1
redis> LPUSH mylist "hello"
(integer) 2
redis> LRANGE mylist 0 -1
1) "hello"
2) "world"
LPUSHX
在 key 存在时,将⼀个或者多个元素从左侧放⼊(头插)到 list 中。不存在,直接返回。

语法

LPUSHX key element [element ...]
时间复杂度:只插⼊⼀个元素为 O(1), 插⼊多个元素为 O(N), N 为插⼊元素个数. 返回值:插⼊后 list 的⻓度。 举例
redis> LPUSH mylist "World"
(integer) 1
redis> LPUSHX mylist "Hello"
(integer) 2
redis> LPUSHX myotherlist "Hello"
(integer) 0
redis> LRANGE mylist 0 -1
1) "Hello"
2) "World"
redis> LRANGE myotherlist 0 -1
(empty array)
RPUSH
将⼀个或者多个元素从右侧放⼊(尾插)到 list 中。
语法
RPUSH key element [element ...]
时间复杂度:只插⼊⼀个元素为 O(1), 插⼊多个元素为 O(N), N 为插⼊元素个数. 返回值:插⼊后 list 的⻓度。 举例
redis> RPUSH mylist "hello"
(integer) 1
redis> RPUSH mylist "world"
(integer) 2
redis> LRANGE mylist 0 -1
1) "hello"
2) "world"
RPUSHX
在 key 存在时,将⼀个或者多个元素从右侧放⼊(尾插)到 list 中。

语法

RPUSHX key element [element ...]
时间复杂度:只插⼊⼀个元素为 O(1), 插⼊多个元素为 O(N), N 为插⼊元素个数. 返回值:插⼊后 list 的⻓度。 举例
redis> RPUSH mylist "Hello"
(integer) 1
redis> RPUSHX mylist "World"
(integer) 2
redis> RPUSHX myotherlist "World"
(integer) 0
redis> LRANGE mylist 0 -1
1) "Hello"
2) "World"
redis> LRANGE myotherlist 0 -1
(empty array)
LRANGE
获取从 start 到 end 区间的所有元素,左闭右闭。
语法
LRANGE key start stop
时间复杂度:O(N) 返回值:指定区间的元素。 举例
redis> RPUSH mylist "one"
(integer) 1
redis> RPUSH mylist "two"
(integer) 2
redis> RPUSH mylist "three"
(integer) 3
redis> LRANGE mylist 0 0
1) "one"
redis> LRANGE mylist -3 2
1) "one"
2) "two"
3) "three"
redis> LRANGE mylist -100 100
1) "one"
2) "two"
3) "three"
redis> LRANGE mylist 5 10
(empty array)
LPOP
从 list 左侧取出元素(即头删)。
语法
LPOP key
时间复杂度:O(1) 返回值:取出的元素或者 nil。 举例
redis> RPUSH mylist "one" "two" "three" "four" "five"
(integer) 5
redis> LPOP mylist
"one"
redis> LPOP mylist 2
1) "two"
2) "three"
redis> LRANGE mylist 0 -1
1) "four"
2) "five"
RPOP
从 list 右侧取出元素(即尾删)。
语法
RPOP key
时间复杂度:O(1) 返回值:取出的元素或者 nil。 举例
redis> RPUSH mylist "one" "two" "three" "four" "five"
(integer) 5
redis> RPOP mylist
"five"
redis> RPOP mylist 2
1) "four"
2) "three"
redis> LRANGE mylist 0 -1
1) "one"
2) "two"
LINDEX
获取从左数第 index 位置的元素。

语法

LINDEX key index

时间复杂度:O(N)
返回值:取出的元素或者 nil。

举例

redis> LPUSH mylist "World"
(integer) 1
redis> LPUSH mylist "Hello"
(integer) 2
redis> LINDEX mylist 0
"Hello"
redis> LINDEX mylist -1
"World"
redis> LINDEX mylist 3
(nil)
LINSERT
在特定位置插⼊元素。

语法

LINSERT key <BEFORE | AFTER> pivot element
时间复杂度:O(N) 返回值:插⼊后的 list ⻓度。 举例
redis> RPUSH mylist "Hello"
(integer) 1
redis> RPUSH mylist "World"
(integer) 2
redis> LINSERT mylist BEFORE "World" "There"
(integer) 3
redis> LRANGE mylist 0 -1
1) "Hello"
2) "There"
3) "World"
LLEN
获取 list ⻓度。

语法

LLEN key
时间复杂度:O(1) 返回值:list 的⻓度。 举例
redis> LPUSH mylist "World"
(integer) 1
redis> LPUSH mylist "Hello"
(integer) 2
redis> LLEN mylist
(integer) 2
阻塞版本命令

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

BLPOP
LPOP 的阻塞版本。

语法

BLPOP key [key ...] timeout
时间复杂度:O(1) 返回值:取出的元素或者 nil。 举例
redis> DEL list1 list2
(integer) 0
redis> RPUSH list1 a b c
(integer) 3
redis> BLPOP list1 list2 0
1) "list1"
2) "a"
BRPOP
RPOP 的阻塞版本。

语法

BRPOP key [key ...] timeout
时间复杂度:O(1) 返回值:取出的元素或者 nil。 举例
redis> DEL list1 list2
(integer) 0
redis> RPUSH list1 a b c
(integer) 3
redis> BRPOP list1 list2 0
1) "list1"
2) "c"
内部编码

列表类型的内部编码有两种:

• ziplist(压缩列表):当列表的元素个数⼩于 list-max-ziplist-entries 配置(默认 512 个),同时列表中每个元素的⻓度都⼩于 list-max-ziplist-value 配置(默认 64 字节)时,Redis 会选⽤ziplist 来作为列表的内部编码实现来减少内存消耗。
• linkedlist(链表):当列表类型⽆法满⾜ ziplist 的条件时,Redis 会使⽤ linkedlist 作为列表的内部实现。

1)当元素个数较少且没有⼤元素时,内部编码为 ziplist:

127.0.0.1:6379> rpush listkey e1 e2 e3
OK
127.0.0.1:6379> object encoding listkey
"ziplist"

2)当元素个数超过 512 时,内部编码为 linkedlist:

127.0.0.1:6379> rpush listkey e1 e2 e3 ... 省略 e512 e513
OK
127.0.0.1:6379> object encoding listkey
"linkedlist"

3)当某个元素的⻓度超过 64 字节时,内部编码为 linkedlist:

127.0.0.1:6379> rpush listkey "one string is bigger than 64 bytes ... 省略 ..."
OK
127.0.0.1:6379> object encoding listkey
"linkedlist"

应用场景

1.消息队列

List类型可以用作一个先进先出(FIFO)的消息队列。生产者将消息添加到列表的右端(尾部),而消费者则从列表的左端(头部)读取消息。这种机制非常适合在生产者和消费者之间传递消息,实现异步通信。

2.数据分页

在处理大量数据时,可以使用List类型来实现数据的分页显示。将数据按照某种顺序存储在列表中,然后根据页码和每页显示的数据量来获取相应的数据子集。这种方法在处理需要分页显示的长列表时非常有效。

3.延时任务

List类型可以用于存储延时任务,如发送电子邮件、短信通知等。将任务添加到列表中,并使用定时任务系统(如Redis的键空间通知或外部定时任务调度器)检查列表中的任务,并在适当的时间执行它们。

标签:mylist,List,元素,redis,详解,LRANGE,key,integer,Redis
From: https://blog.csdn.net/wmh_1234567/article/details/144488372

相关文章

  • 基于Redis有序集合实现滑动窗口限流
    滑动窗口算法是一种基于时间窗口的限流算法,它将时间划分为若干个固定大小的窗口,每个窗口内记录了该时间段内的请求次数。通过动态地滑动窗口,可以动态调整限流的速率,以应对不同的流量变化。整个限流可以概括为两个主要步骤:统计窗口内的请求数量应用限流规则Redis有序集......
  • 【prometheus】【Node_export】【原理介绍】【源码阅读】node_export的newHandler函数
    这两个函数是Go语言node_exporter的核心部分,主要与Prometheus指标的收集、注册、处理以及HTTP处理器的创建相关。我们将逐步解析每个函数的逻辑。目录1.newHandler函数解析:2.innerHandler函数解析:总结:1.newHandler函数funcnewHandler(includeExpor......
  • redis 基础
    redis.confbind0.0.0.0#指定监听地址,支持用空格隔开的多个监听IPprotected-modeyes#redis3.2之后加入的新特性,在没有设置bindIP和密码的时候,redis只允许访问127.0.0.1:6379,可以远程连接,但当访问将提示警告信息并拒绝远程访问,redis-7版本后,只要没有密码就不能远......
  • Java Map 集合详解:基础用法、常见实现类与高频面试题解析
    在Java集合框架中,Map是用于存储键值对(Key-Value)的重要接口,广泛应用于开发中的各种场景。本文将详细讲解Map的基础概念、常见实现类及其特性,并结合代码示例和高频面试问题,帮助你深入理解Map的用法。......
  • Hyperf async-queue 队列 [ERROR] RedisException: read error on connection to xxx
    起因:在redis异步队列中总是有很多超时的任务,于是将redis-queue的任务超时时间调整到了3600async_queue.php'default'=>['driver'=>\Hyperf\AsyncQueue\Driver\RedisDriver::class,'redis'=>['pool'=>'def......
  • 【YashanDB知识库】listagg拼接结果发生溢出
    本文内容来自YashanDB官网,原文内容请见https://www.yashandb.com/newsinfo/7849011.html?templateId=1718516【问题分类】功能使用【关键字】listagg,YAS-02511【问题描述】使用listagg进行业务查询提示YAS-02511resultofstringconcatenationvalueexceedsmaximumlength......
  • Java List 集合详解:基础用法、常见实现类与高频面试题解析
    正文在Java集合框架中,List是一个非常重要的接口,广泛用于存储有序的元素集合。本文将带你深入了解List接口的基本用法、常见实现类及其扩展,同时通过实际代码示例帮助你快速掌握这些知识。......
  • 【人工智能机器学习基础篇】——深入详解深度学习之神经网络基础:理解前馈神经网络与反
    深入详解深度学习之神经网络基础:理解前馈神经网络与反向传播算法        深度学习作为人工智能(AI)的核心技术,已经在语音识别、图像处理、自然语言处理等诸多领域取得了显著的成果。而在深度学习的众多模型中,**前馈神经网络(FeedforwardNeuralNetworks,FNN)与反向传播......
  • 【分布式数据库与数据存储方案】详解
    分布式数据库与数据存储方案一、分布式数据库概述(一)概念分布式数据库是一种将数据分散存储在多个物理节点上的数据库系统,这些节点通过网络进行连接和通信,对外呈现出一个统一的逻辑数据库,用户或应用程序可以像操作传统的单一数据库一样与之交互,但其内部通过一系列复杂的......
  • cesium小知识:ScreenSpaceEventHandler 详解示例
    ScreenSpaceEventHandler是Cesium中用于处理屏幕空间事件的工具,它允许开发者响应用户的交互操作,如鼠标点击、拖动、滚轮滚动等。通过ScreenSpaceEventHandler,你可以轻松地为3D场景中的对象添加交互功能,例如选择实体、显示信息提示、控制相机移动等。详细说明1.概念......