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

发布时间:2024年01月03日

前言:

继上一篇向爬虫而生---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命令获取指定范围的元素,可以实现列表的分页功能,以便按页显示数据。

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

文章来源:https://blog.csdn.net/m0_56758840/article/details/135349796
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。