当前位置: 首页 > news >正文

向爬虫而生---Redis 基石篇3 <拓展List>

前言:

继上一篇向爬虫而生---Redis 基石篇2 <拓展Hash>-CSDN博客​​​​​​.往下继续---挖一挖list

正文:

在Redis中,列表(List)是一个常用的数据结构,尤其在爬虫应用中。例如,可以用列表实现IP代理池,按照更新时间获取信息,等。

常用的列表命令

1.lpush / lpop:

        在列表左侧插入一个或多个元素 / 从列表左侧弹出一个元素
127.0.0.1:6379> lpush key element1 element2 element3
(integer) 3
127.0.0.1:6379> lpop key
"element3"

使用lpush命令向列表左侧插入了3个元素,并使用lpop命令从列表左侧弹出一个元素。

2.rpush / rpop:

        在列表右侧插入一个或多个元素 / 从列表右侧弹出一个元素。
127.0.0.1:6379> rpush key element1 element2 element3
(integer) 3
127.0.0.1:6379> rpop key
"element3"

使用rpush命令向列表右侧插入了3个元素,并使用rpop命令从列表右侧弹出一个元素。

3.llen:

获取列表的长度。
127.0.0.1:6379> llen key
(integer) 2

使用llen命令获取列表的长度,结果为2。

4.lrem:

删除列表中指定值的元素。
127.0.0.1:6379> lrem key 0 element
(integer) 1

在上面的示例中,我们使用lrem命令删除列表中值为"element"的元素。

5.ltrim:

移除列表中多余的索引值。
127.0.0.1:6379> ltrim key 2 5
OK

使用ltrim命令根据索引范围移除列表中多余的值。

6.lrange:

获取列表中指定范围的元素。
127.0.0.1:6379> lrange key 0 2
1) "element1"
2) "element2"

使用lrange命令获取列表索引范围为0到2的元素。

通过以上案例,我们可以清楚地了解到列表数据结构的基本操作。列表具有有序、允许重复元素和可以在左/右插入或删除的特性。

扩展命令:

1.lindex命令-->lindex key <index>

按索引获取列表中的特定元素。

假设我们有一个存储用户订单的列表,我们可以使用lpush命令将新的订单添加到列表的左侧。然后,我们可以使用lindex命令获取列表中指定索引位置的订单。

# 添加新的订单
127.0.0.1:6379> lpush orders "Order 1"
(integer) 1
127.0.0.1:6379> lpush orders "Order 2"
(integer) 2
127.0.0.1:6379> lpush orders "Order 3"
(integer) 3# 获取列表中特定索引位置的订单
127.0.0.1:6379> lindex orders 1
"Order 2"

在上述示例中,我们通过lpush命令将订单信息添加到名为orders的列表的左侧。然后,使用lindex命令获取列表中索引为1(从左侧开始)的订单。

------可以看到如何使用lindex命令按索引获取列表中的特定元素。这在处理列表数据时非常有用,可以根据索引值快速定位和检索元素。

请注意,索引值是从0开始的,因此第一个元素的索引为0,第二个元素的索引为1,以此类推。


2.linsert命令的案例:linsert key after(before) value

假设我们有一个待办事项的任务列表,我们可以使用lpush命令将新的任务添加到列表的左侧。然后,我们可以使用linsert命令在某个任务之前或之后插入新的任务。


# 添加新的任务
127.0.0.1:6379> lpush todos "Task 1"
(integer) 1# 在指定任务之后插入新的任务
127.0.0.1:6379> linsert todos after "Task 1" "Task 2"
(integer) 2# 在指定任务之前插入新的任务
127.0.0.1:6379> linsert todos before "Task 2" "Task 3"
(integer) 3

首先使用lpush命令向名为todos的列表左侧添加了一个任务"Task 1",然后使用linsert命令在"Task 1"之后插入了一个新的任务"Task 2"。接着,使用linsert命令在"Task 2"之前插入了一个新的任务"Task 3"。

通过linsert命令,我们可以根据指定的标志任务位置,按需在列表中插入新的任务。可以使用"before"或"after"来指定插入位置。

ps: linsert命令会遍历列表来找到目标任务位置,因此如果列表中有大量的元素,linsert操作可能会更耗时。在实际使用中,需要根据实际情况权衡使用列表数据结构和linsert命令的性能。


3.lset命令的案例:lset key <index> value

根据索引更新value

假设我们有一个待办事项的任务列表,我们可以使用lpush命令将新的任务添加到列表的左侧。然后,我们可以使用lset命令根据索引更新列表中的某个任务。

# 添加新的任务
127.0.0.1:6379> lpush todos "Task 1"
(integer) 1# 根据索引更新任务
127.0.0.1:6379> lset todos 0 "New Task"
OK# 获取更新后的任务
127.0.0.1:6379> lindex todos 0
"New Task"

通过lpush命令向名为todos的列表的左侧添加了一个任务"Task 1"。然后,使用lset命令根据索引0(最左侧)将该任务更新为"New Task"。最后,使用lindex命令获取更新后的任务。

根据索引位置对列表中的任务进行更新。可以根据实际需求在列表中指定的位置更改任务内容。需要注意的是,索引值是从0开始的,因此第一个元素的索引为0,第二个元素的索引为1,以此类推,如果需要从右往左,就是-1开始,依次减1

例如:使用lset命令,我们可以快速修改指定位置的任务,实现对任务列表中任务的动态更新和管理。这对于待办事项、任务管理或者其他需要随时调整任务内容的场景非常有用。


4.blpop和brpop命令:

scrapy-redis里面的关键命令!!! 这个牢记!!!

假设我们有一个消息队列,通过使用lpush命令将新的消息添加到列表的左侧。然后,我们可以使用blpop或brpop命令阻塞式地从左侧或右侧获取消息,如果列表为空,则会阻塞等待。

# 添加新的消息
127.0.0.1:6379> lpush messages "Message 1"
(integer) 1
127.0.0.1:6379> lpush messages "Message 2"
(integer) 2# 从左侧阻塞式获取消息
127.0.0.1:6379> blpop messages 0
1) "messages"
2) "Message 2"# 添加新的消息
127.0.0.1:6379> lpush messages "Message 3"
(integer) 3# 从右侧阻塞式获取消息
127.0.0.1:6379> brpop messages 0
1) "messages"
2) "Message 3"

使用lpush命令将消息"Message 1"和"Message 2"分别添加到名为messages的列表的左侧。然后,我们使用blpop命令通过阻塞方式从列表的左侧获取消息。在此例中,当我们执行blpop命令时,列表中已经有两条消息,但我们设置的超时时间为0,所以它会立即返回最左侧的消息"Message 2"。

接着,我们使用lpush命令将消息"Message 3"添加到左侧,然后使用brpop命令通过阻塞方式从列表的右侧获取消息。同样地,当执行brpop命令时,它会返回最右侧的消息"Message 3"。

通过这个案例,我们可以看到blpop和brpop命令在处理消息队列时的重要作用。它们可以有效地实现消费者从列表中获取消息的阻塞等待机制,当列表为空时,消费者会一直阻塞等待,直到有新的消息到达,然后立即返回。这种机制非常适用于实现异步任务处理、实时消息推送等场景中


4.1 blpop key timeout

当在Redis中使用消息队列时,可以通过命令blpop key timeout对列表进行阻塞式左侧弹出操作,以获取最新的消息。

blpop命令用于从一个或多个列表中阻塞式地左侧弹出(pop)元素。它会按照指定的键列表顺序遍历,并返回第一个非空列表中的左侧元素。如果所有列表都为空,客户端连接将被阻塞,直到有新的元素进入或超过指定的超时时间

命令格式为:blpop key [key ...] timeout

其中:

  • key是待弹出的列表的键。可以指定一个或多个键,按照指定的键的顺序进行遍历。
  • timeout是超时时间,单位为秒(seconds)。如果列表为空,客户端连接将被阻塞等待,直到遇到新的元素或超过指定的超时时间。

下面是一个示例:

# 创建一个消息队列
127.0.0.1:6379> lpush messages "Message 1"
(integer) 1
127.0.0.1:6379> lpush messages "Message 2"
(integer) 2# 阻塞式左侧弹出消息
127.0.0.1:6379> blpop messages 10
1) "messages"
2) "Message 2"

使用lpush命令将两个消息依次添加到名为messages的列表左侧。然后,我们执行blpop命令对messages列表进行阻塞式左侧弹出操作,并设置超时时间为10秒。由于列表不为空,命令立即返回并返回最左侧的消息为"Message 2"。如果在10秒内未有新的消息到达,命令将超时并返回空结果。

blpop命令常用于实现消息队列的消费者,它可以在列表为空时进行阻塞等待,直到有新的消息到达。消费者可以通过轮询多个键,以按照优先级或不同的消息类型处理不同的消息队列

需要注意的是,blpop命令只对指定的键列表进行阻塞式左侧弹出操作,并不能处理多个列表间的优先级或复杂的消费逻辑。如果需要更复杂的消息队列功能,可以考虑使用专门的消息队列中间件,如Redis的Streams数据类型或其他消息中间件。


延伸:

当使用Redis的lpush和不同的弹出命令组合时,可以应用于以下不同的场景:

  1. lpush + lpop:
    • 队列:适用于实现先进先出(FIFO)模型的消息队列,用于任务调度、消息传递、事件处理等场景。
    • 消息通知:可以用来实现用户订阅/取消订阅某个主题的通知系统。
  2. lpush + rpop:
    • 栈:适用于实现后进先出(LIFO)模型的堆栈结构,例如浏览器的历史记录管理,撤销操作等。
  3. lpush + ltrim:
    • 实时数据流:通过保留固定长度的消息列表,用于处理实时数据流、日志收集,尤其对于处理最新的数据非常有用。
    • 消息缓冲:用于限制消息队列的长度,仅保留最新的消息,避免队列过度增长。
  4. lpush + brpop:
    • 阻塞式任务处理:适用于实时任务队列,消费者可以采用阻塞式获取任务的方式,以便及时处理任务并减少轮询的开销。
    • 异步任务:将需要进行异步处理的任务推入队列,消费者使用brpop命令进行阻塞式地获取任务以进行异步处理,例如发送电子邮件、生成报告等。
  5. lpush + rpoplpush:
    • 队列延迟处理:通过将任务从一个列表右侧弹出并推入另一个列表的左侧,可以实现任务的延迟处理。例如,将任务从主列表右侧弹出,并推入延迟列表的左侧,以实现任务的延迟执行。
  6. lpush + lrange:
    • 列表分页:通过将新的元素添加到列表的左侧,并使用lrange命令获取指定范围的元素,可以实现列表的分页功能,以便按页显示数据。

这些场景仅提供了一些常见的应用示例,实际上可以根据具体的业务需求进行更灵活的应用。通过合理使用这些组合,可以构建高效、可靠和实时的应用系统,提升系统性能和用户体验,同时减少开发和维护成本。

相关文章:

向爬虫而生---Redis 基石篇3 <拓展List>

前言: 继上一篇向爬虫而生---Redis 基石篇2 &#xff1c;拓展Hash&#xff1e;-CSDN博客​​​​​​.往下继续---挖一挖list 正文: 在Redis中&#xff0c;列表&#xff08;List&#xff09;是一个常用的数据结构&#xff0c;尤其在爬虫应用中。例如&#xff0c;可以用列表实现…...

CSS渲染性能优化

✨ 专栏介绍 HTML/CSS专栏合集是一个涵盖HTML和CSS两个方面的栏目。HTML是一种标记语言&#xff0c;用于创建网页的结构和内容&#xff0c;而CSS是一种样式表语言&#xff0c;用于控制网页的外观和布局。 在HTML/CSS专栏合集中&#xff0c;我们将深入探讨HTML和CSS的基础知识…...

【C++入门】类和对象(完)

前言 在谈论C时&#xff0c;常常会涉及到一些高级特性和概念&#xff0c;比如初始化列表、static成员、友元、内部类、匿名对象等。这些概念在C编程中起着非常重要的作用&#xff0c;对于想要深入了解C语言的开发者来说&#xff0c;掌握这些知识是至关重要的。本文&#xff0c;…...

webshell检测方式深度剖析 --- Pixy系列二(数据流分析)

开篇 书接上文&#xff0c;这次我们来聊聊数据流分析&#xff0c;数据流分析的内容非常广泛&#xff0c;我们力求深入浅出通俗易懂&#xff0c;在简短的篇幅内将这一概念描述清楚。 简单来说&#xff0c;数据流分析是一种用来获取相关数据沿着程序执行路径流动的信息分析技术…...

[DAU-FI Net开源 | Dual Attention UNet+特征融合+Sobel和Canny等算子解决语义分割痛点]

文章目录 概要I Introduction小结 概要 提出的架构&#xff0c;双注意力U-Net与特征融合&#xff08;DAU-FI Net&#xff09;&#xff0c;解决了语义分割中的挑战&#xff0c;特别是在多类不平衡数据集上&#xff0c;这些数据集具有有限的样本。DAU-FI Net 整合了多尺度空间-通…...

使用Triton部署ONNX模型

介绍 适用于各种 AI 工作负载的推理&#xff1a;借助 NVIDIA Triton™&#xff0c;在任何处理器&#xff08;GPU、CPU 或其他&#xff09;上&#xff0c;对使用基于任何框架的&#xff0c;经过训练的机器学习模型或深度学习模型&#xff0c;进行推理部署。Triton 是 NVIDIA AI…...

Python访问ElasticSearch

ElasticSearch是广受欢迎的NoSQL数据库&#xff0c;其分布式架构提供了极佳的数据空间的水平扩展能力&#xff0c;同时保障了数据的可靠性&#xff1b;反向索引技术使得数据检索和查询速度非常快。更多功能参见官网介绍 https://www.elastic.co/cn/elasticsearch/ 下面简单罗列…...

Flutter 混合开发 - 动态下发 libflutter.so libapp.so

背景 最近在做包体积优化&#xff0c;在完成代码混淆、压缩&#xff0c;裁剪ndk支持架构&#xff0c;以及资源压缩&#xff08;如图片转webp、mp3压缩等&#xff09;后发现安装包的中占比较大的仍是 so 动态库依赖。 具体查看发现 libflutter.so 和 libapp.so 的体积是最大的&…...

Peter算法小课堂—动态规划

Peter推荐算法书&#xff1a;《算法导论》 图示&#xff1a; 目录 钢条切割 打字怪人 钢条切割 算法导论&#xff08;第四版&#xff09;第十四章第一节&#xff1a;钢条切割 题目描述&#xff1a; 给定一根长度为 n 英寸的钢条和一个价格表 &#xff0c;其中 i1,2,…,n …...

2022–2023学年2021级计算机科学与技术专业数据库原理 (A)卷

一、单项选择题&#xff08;每小题1.5分&#xff0c;共30分&#xff09; 1、构成E—R模型的三个基本要素是&#xff08; B &#xff09;。 A&#xff0e;实体、属性值、关系 B&#xff0e;实体、属性、联系 C&#xff0e;实体、实体集、联系 D&#xff0e;实体、实体…...

Clojure 实战(4):编写 Hadoop MapReduce 脚本

Hadoop简介 众所周知&#xff0c;我们已经进入了大数据时代&#xff0c;每天都有PB级的数据需要处理、分析&#xff0c;从中提取出有用的信息。Hadoop就是这一时代背景下的产物。它是Apache基金会下的开源项目&#xff0c;受Google两篇论文的启发&#xff0c;采用分布式的文件…...

Django 分页(表单)

目录 一、手动分页二、分页器分页 一、手动分页 1、概念 页码&#xff1a;很容易理解&#xff0c;就是一本书的页码每页数量&#xff1a;就是一本书中某一页中的内容&#xff08;数据量&#xff0c;比如第二页有15行内容&#xff09;&#xff0c;这 15 就是该页的数据量 每一…...

socket实现视频通话-WebRTC

最近喜欢研究视频流&#xff0c;所以思考了双向通信socket&#xff0c;接下来我们就一起来看看本地如何实现双向视频通讯的功能吧~ 客户端获取视频流 首先思考如何获取视频流呢&#xff1f; 其实跟录音的功能差不多&#xff0c;都是查询电脑上是否有媒体设备&#xff0c;如果…...

simulink代码生成(九)—— 串口显示数据(纸飞机联合调试)

纸飞机里面的协议是固定的&#xff0c;必须按照协议配置&#xff1b; &#xff08;1&#xff09;使用EasyHEX协议&#xff0c;测试int16数据类型 测试串口发出的数据是否符合&#xff1f; 串口接收数据为&#xff1a; 打开纸飞机绘图侧&#xff1a; &#xff08;1&#xff09…...

Mysql数据库(中)——增删改查的学习(全面,详细)

上一篇主要对查询操作进行了详细的总结&#xff0c;本篇主要对增删改操作以及一些常用的函数进行总结&#xff0c;包括流程控制等&#xff1b;以下的代码可以直接复制到数据库可视化软件中&#xff0c;便于理解和练习&#xff1b; 常用的操作&#xff1a; #函数&#xff1a; S…...

test dbtest-03-对比 Liquibase、flyway、dbDeploy、dbsetup

详细对比 Liquibase、flyway、dbDeploy、dbsetup&#xff0c;给出对比表格 下面是一个简要的对比表格&#xff0c;涵盖了 Liquibase、Flyway、dbDeploy 和 DbSetup 这四个数据库变更管理工具的一些主要特点。 特点/工具LiquibaseFlywaydbDeployDbSetup开发语言Java&#xff0…...

力导向图与矩阵排序

Graph-layout force directed&#xff08;力导向图布局&#xff09;是一种用于可视化网络图的布局算法。它基于物理模型&#xff0c;模拟了图中节点之间的相互排斥和连接弹性&#xff0c;以生成具有良好可读性和美观性的图形布局。 在力导向图布局中&#xff0c;每个节点被视为…...

word 常用功能记录

word手册 多行文字对齐标题调整文字间距打钩方框插入三线表插入参考文献自动生成目录 多行文字对齐 标题调整文字间距 打钩方框 插入三线表 插入一个最基本的表格把整个表格设置为无框线设置上框线【实线1.5磅】设置下框线【实线1.5磅】选中第一行&#xff0c;设置下框线【实线…...

C#线程基础(线程启动和停止)

目录 一、关于线程 二、示例 三、生成效果 一、关于线程 在使用多线程前要先引用命名空间System.Threading&#xff0c;引用命名空间后就可以在需要的地方方便地创建并使用线程。 创建线程对象的构造方法中使用了ThreadStart()委托&#xff0c;当线程开始执行时&#xff0c…...

如何利用ChatGPT来提高编程效率

如何利用ChatGPT来提高编程效率 在当今这个信息爆炸和技术快速发展的时代,程序员们面临着巨大的压力,既要保证代码的质量,又要提高工作效率。幸运的是,人工智能(AI)正在改变我们编写和维护代码的方式,而OpenAI的ChatGPT是其中的佼佼者。本文将讨论如何利用ChatGPT以及结合…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

django blank 与 null的区别

1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是&#xff0c;要注意以下几点&#xff1a; Django的表单验证与null无关&#xff1a;null参数控制的是数据库层面字段是否可以为NULL&#xff0c;而blank参数控制的是Django表单验证时字…...