向爬虫而生---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
和不同的弹出命令组合时,可以应用于以下不同的场景:
-
lpush + lpop
:- 队列:适用于实现先进先出(FIFO)模型的消息队列,用于任务调度、消息传递、事件处理等场景。
- 消息通知:可以用来实现用户订阅/取消订阅某个主题的通知系统。
-
lpush + rpop
:- 栈:适用于实现后进先出(LIFO)模型的堆栈结构,例如浏览器的历史记录管理,撤销操作等。
-
lpush + ltrim
:- 实时数据流:通过保留固定长度的消息列表,用于处理实时数据流、日志收集,尤其对于处理最新的数据非常有用。
- 消息缓冲:用于限制消息队列的长度,仅保留最新的消息,避免队列过度增长。
-
lpush + brpop
:- 阻塞式任务处理:适用于实时任务队列,消费者可以采用阻塞式获取任务的方式,以便及时处理任务并减少轮询的开销。
- 异步任务:将需要进行异步处理的任务推入队列,消费者使用
brpop
命令进行阻塞式地获取任务以进行异步处理,例如发送电子邮件、生成报告等。
-
lpush + rpoplpush
:- 队列延迟处理:通过将任务从一个列表右侧弹出并推入另一个列表的左侧,可以实现任务的延迟处理。例如,将任务从主列表右侧弹出,并推入延迟列表的左侧,以实现任务的延迟执行。
-
lpush + lrange
:- 列表分页:通过将新的元素添加到列表的左侧,并使用
lrange
命令获取指定范围的元素,可以实现列表的分页功能,以便按页显示数据。
- 列表分页:通过将新的元素添加到列表的左侧,并使用
这些场景仅提供了一些常见的应用示例,实际上可以根据具体的业务需求进行更灵活的应用。通过合理使用这些组合,可以构建高效、可靠和实时的应用系统,提升系统性能和用户体验,同时减少开发和维护成本。
相关文章:
向爬虫而生---Redis 基石篇3 <拓展List>
前言: 继上一篇向爬虫而生---Redis 基石篇2 <拓展Hash>-CSDN博客.往下继续---挖一挖list 正文: 在Redis中,列表(List)是一个常用的数据结构,尤其在爬虫应用中。例如,可以用列表实现…...

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

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

webshell检测方式深度剖析 --- Pixy系列二(数据流分析)
开篇 书接上文,这次我们来聊聊数据流分析,数据流分析的内容非常广泛,我们力求深入浅出通俗易懂,在简短的篇幅内将这一概念描述清楚。 简单来说,数据流分析是一种用来获取相关数据沿着程序执行路径流动的信息分析技术…...

[DAU-FI Net开源 | Dual Attention UNet+特征融合+Sobel和Canny等算子解决语义分割痛点]
文章目录 概要I Introduction小结 概要 提出的架构,双注意力U-Net与特征融合(DAU-FI Net),解决了语义分割中的挑战,特别是在多类不平衡数据集上,这些数据集具有有限的样本。DAU-FI Net 整合了多尺度空间-通…...

使用Triton部署ONNX模型
介绍 适用于各种 AI 工作负载的推理:借助 NVIDIA Triton™,在任何处理器(GPU、CPU 或其他)上,对使用基于任何框架的,经过训练的机器学习模型或深度学习模型,进行推理部署。Triton 是 NVIDIA AI…...
Python访问ElasticSearch
ElasticSearch是广受欢迎的NoSQL数据库,其分布式架构提供了极佳的数据空间的水平扩展能力,同时保障了数据的可靠性;反向索引技术使得数据检索和查询速度非常快。更多功能参见官网介绍 https://www.elastic.co/cn/elasticsearch/ 下面简单罗列…...

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

Peter算法小课堂—动态规划
Peter推荐算法书:《算法导论》 图示: 目录 钢条切割 打字怪人 钢条切割 算法导论(第四版)第十四章第一节:钢条切割 题目描述: 给定一根长度为 n 英寸的钢条和一个价格表 ,其中 i1,2,…,n …...

2022–2023学年2021级计算机科学与技术专业数据库原理 (A)卷
一、单项选择题(每小题1.5分,共30分) 1、构成E—R模型的三个基本要素是( B )。 A.实体、属性值、关系 B.实体、属性、联系 C.实体、实体集、联系 D.实体、实体…...

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

Django 分页(表单)
目录 一、手动分页二、分页器分页 一、手动分页 1、概念 页码:很容易理解,就是一本书的页码每页数量:就是一本书中某一页中的内容(数据量,比如第二页有15行内容),这 15 就是该页的数据量 每一…...

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

simulink代码生成(九)—— 串口显示数据(纸飞机联合调试)
纸飞机里面的协议是固定的,必须按照协议配置; (1)使用EasyHEX协议,测试int16数据类型 测试串口发出的数据是否符合? 串口接收数据为: 打开纸飞机绘图侧: (1)…...
Mysql数据库(中)——增删改查的学习(全面,详细)
上一篇主要对查询操作进行了详细的总结,本篇主要对增删改操作以及一些常用的函数进行总结,包括流程控制等;以下的代码可以直接复制到数据库可视化软件中,便于理解和练习; 常用的操作: #函数: S…...

test dbtest-03-对比 Liquibase、flyway、dbDeploy、dbsetup
详细对比 Liquibase、flyway、dbDeploy、dbsetup,给出对比表格 下面是一个简要的对比表格,涵盖了 Liquibase、Flyway、dbDeploy 和 DbSetup 这四个数据库变更管理工具的一些主要特点。 特点/工具LiquibaseFlywaydbDeployDbSetup开发语言Java࿰…...
力导向图与矩阵排序
Graph-layout force directed(力导向图布局)是一种用于可视化网络图的布局算法。它基于物理模型,模拟了图中节点之间的相互排斥和连接弹性,以生成具有良好可读性和美观性的图形布局。 在力导向图布局中,每个节点被视为…...

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

C#线程基础(线程启动和停止)
目录 一、关于线程 二、示例 三、生成效果 一、关于线程 在使用多线程前要先引用命名空间System.Threading,引用命名空间后就可以在需要的地方方便地创建并使用线程。 创建线程对象的构造方法中使用了ThreadStart()委托,当线程开始执行时,…...
如何利用ChatGPT来提高编程效率
如何利用ChatGPT来提高编程效率 在当今这个信息爆炸和技术快速发展的时代,程序员们面临着巨大的压力,既要保证代码的质量,又要提高工作效率。幸运的是,人工智能(AI)正在改变我们编写和维护代码的方式,而OpenAI的ChatGPT是其中的佼佼者。本文将讨论如何利用ChatGPT以及结合…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...

ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...
DiscuzX3.5发帖json api
参考文章:PHP实现独立Discuz站外发帖(直连操作数据库)_discuz 发帖api-CSDN博客 简单改造了一下,适配我自己的需求 有一个站点存在多个采集站,我想通过主站拿标题,采集站拿内容 使用到的sql如下 CREATE TABLE pre_forum_post_…...

Python训练营-Day26-函数专题1:函数定义与参数
题目1:计算圆的面积 任务: 编写一个名为 calculate_circle_area 的函数,该函数接收圆的半径 radius 作为参数,并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求:函数接收一个位置参数 radi…...
用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章
用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章 摘要: 操作系统内核的安全性、稳定性至关重要。传统 Linux 内核模块开发长期依赖于 C 语言,受限于 C 语言本身的内存安全和并发安全问题,开发复杂模块极易引入难以…...

二叉树-144.二叉树的前序遍历-力扣(LeetCode)
一、题目解析 对于递归方法的前序遍历十分简单,但对于一位合格的程序猿而言,需要掌握将递归转化为非递归的能力,毕竟递归调用的时候会调用大量的栈帧,存在栈溢出风险。 二、算法原理 递归调用本质是系统建立栈帧,而非…...