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

Redis Stream消息队列之基本语法与使用方式

前言

本文的主角是Redis Stream,它是Redis5.0版本新增加的数据结构,主要用于消息队列,提供了消息的持久化和主备复制功能,可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证消息不丢失,功能颇为强大。其实,Redis本身是有一个Redis发布订阅来实现消息队列的功能,但它有个缺点就是消息无法持久化,如果出现网络断开、Redis宕机等,消息就会被丢弃。所以,Redis的发布订阅像是Vue2的Bus或Vue3的Mitt,属于后端版的事件总线。此外,Redis本身的List和Sorted Set也可以实现,但是也有各自的缺点,如List没有消息多播功能,没有ACK机制,无法重复消费等,Sorted Set不支持阻塞式获取消息、不允许重复消费、不支持分组。相比之下,Redis Stream明显胜出。

一、消息队列相关命令

1.XADD - 添加消息到末尾

(1)语法格式:

XADD key ID field value

(2)参数:

  • key:队列名称,如果不存在就创建
  • ID:消息ID,我们使用*表示由redis生成,可以自定义,但是要自己保证递增性。
  • field value:记录。

(3)示例:

127.0.0.1:6379[15]> XADD MQ * name Vegeta sex male age 18
"1703235642574-0"
127.0.0.1:6379[15]> XADD MQ * name Bulma sex female age 18
"1703235648454-0"
127.0.0.1:6379[15]>

2.XLEN - 获取流包含的元素数量,即消息长度

(1)语法格式:

XLEN key

(2)参数:

  • key:队列名称。

(3)示例:

127.0.0.1:6379[15]> XLEN MQ
(integer) 2

3.XRANGE - 获取消息列表,会自动过滤已经删除的消息

(1)语法格式:

XRANGE key start end [COUNT count]

(2)参数:

  • key:队列名
  • start:开始值,- 表示最小值
  • end:结束值,+ 表示最大值
  • count:数量

(3)示例:

127.0.0.1:6379[15]> XRANGE MQ - +
1) 1) "1703235642574-0"2) 1) "name"2) "Vegeta"3) "sex"4) "male"5) "age"6) "18"
2) 1) "1703235648454-0"2) 1) "name"2) "Bulma"3) "sex"4) "female"5) "age"6) "18"

4.XREVRANGE - 反向获取消息列表,ID从大到小

(1)语法格式:

XREVRANGE key end start [COUNT count]

(2)参数:

  • key:队列名
  • end:结束值,+ 表示最大值
  • start:开始值,- 表示最小值
  • count:数量

(3)示例:

127.0.0.1:6379[15]> XREVRANGE MQ + - COUNT 2
1) 1) "1703235648454-0"2) 1) "name"2) "Bulma"3) "sex"4) "female"5) "age"6) "18"
2) 1) "1703235642574-0"2) 1) "name"2) "Vegeta"3) "sex"4) "male"5) "age"6) "18"

5.XDEL - 删除消息

(1)语法格式:

XDEL key ID [ID ...]

(2)参数:

  • key:队列名称
  • ID:消息 ID

(3)示例:

127.0.0.1:6379[15]> XADD MQ * name Kakarotto sex male age 18
"1703238230846-0"
127.0.0.1:6379[15]> XADD MQ * name Android18 sex female age 18
"1703238306386-0"
127.0.0.1:6379[15]> XDEL MQ 1703238230846-0
(integer) 1
127.0.0.1:6379[15]> XRANGE MQ - +
1) 1) "1703235642574-0"2) 1) "name"2) "Vegeta"3) "sex"4) "male"5) "age"6) "18"
2) 1) "1703235648454-0"2) 1) "name"2) "Bulma"3) "sex"4) "female"5) "age"6) "18"
3) 1) "1703238306386-0"2) 1) "name"2) "Android18"3) "sex"4) "female"5) "age"6) "18"

6.XTRIM - 对流进行修剪,限制长度

(1)语法格式:

XTRIM key MAXLEN [~] count

(2)参数:

  • key:队列名称
  • MAXLEN:Stream中最大消息数量(即保留的消息数量)
  • [~]:若使用了 ~ 符号,则表示限制的是消息的大小而非数量。
  • count:需要删除的消息数量

(3)示例:

# 限制MQ最多1条消息,其余删除
127.0.0.1:6379[15]> XTRIM MQ MAXLEN 1
(integer) 2
127.0.0.1:6379[15]> XRANGE MQ - +
1) 1) "1703238306386-0"2) 1) "name"2) "Android18"3) "sex"4) "female"5) "age"6) "18"

7.XREAD - 以阻塞或非阻塞方式读取一个或多个队列的消息

(1)语法格式:

XREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] id [id ...]

(2)参数:

  • count:数量,默认值为10
  • milliseconds:可选,阻塞毫秒数,没有设置就是非阻塞模式
  • key:队列名
  • id:指定读取的起始位置,可以是特定的消息ID,也可以是"$"表示最新的消息,或者是"0"表示从最早的消息开始读取。

(3)示例:

127.0.0.1:6379[15]> XADD MQ * name Vegeta sex male age 18
"1703297838206-0"
127.0.0.1:6379[15]> XADD MQ * name Bulma sex female age 18
"1703297844215-0"
# 读取MQ最早的默认条消息
127.0.0.1:6379[15]> XREAD STREAMS MQ 0
1) 1) "MQ"2) 1) 1) "1703238306386-0"2) 1) "name"2) "Android18"3) "sex"4) "female"5) "age"6) "18"2) 1) "1703297838206-0"2) 1) "name"2) "Vegeta"3) "sex"4) "male"5) "age"6) "18"3) 1) "1703297844215-0"2) 1) "name"2) "Bulma"3) "sex"4) "female"5) "age"6) "18"# 读取MQ第二条消息,需指定第二条消息的ID
127.0.0.1:6379[15]> XREAD STREAMS MQ 1703297838206-0
1) 1) "MQ"2) 1) 1) "1703297844215-0"2) 1) "name"2) "Bulma"3) "sex"4) "female"5) "age"6) "18"# 读取MQ最新的一条消息,需开启阻塞,阻塞时长为10s。如果10s内未读取到消息则退出阻塞。
【客户端A】127.0.0.1:6379[15]> XREAD BLOCK 100000 STREAMS MQ $
1) 1) "MQ"2) 1) 1) "1703300894359-0"2) 1) "name"2) "Ranchi"3) "sex"4) "male"5) "age"6) "18"
(2.04s)
【客户端A】127.0.0.1:6379[15]># 另开一个终端向MQ队列中写入一条消息,阻塞读的终端就能接收到消息。
root@帅龍之龍:~# redis-cli -h 127.0.0.1 -p 6379 -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
【客户端B】127.0.0.1:6379> select 15
OK
【客户端B】127.0.0.1:6379[15]> XADD MQ * name Ranchi sex male age 18
"1703300894359-0"
【客户端B】127.0.0.1:6379[15]>

(4)注意:XREAD存在消息漏读的风险,当正在处理一条消息时,又有多条消息到达,此时读取的是最新那条!

二、消费者组相关命令

消费者组将多个消费者划分到一个组中,监听同一个队列,具有消息分流、消息标示、消息确认的特点。
·消息分流:分流给组内的不同消费者,不会重复消费,反而加快消费
·消息标示:消费者组会记录最后一个被处理的消息,确保每一个消息都会被消费
·消息确认:消费者获取消息后,消息处于pending状态,然后将其存入pending-list列表,当处理完成后,通过XACK确认消息,将消息标记为已处理,然后从pending-list被移除

1.XGROUP CREATE - 创建消费者组

(1)语法格式:

XGROUP CREATE key group id|$

(2)参数:

  • key:队列名称,如果不存在就创建起始ID
  • group:消费者组名
  • id:起始ID,$代表队列中最后一条消息,0代表队列中第一条消息

(3)示例:

# 创建一个从队列第一条消息开始消费的消费者组
127.0.0.1:6379[15]> XGROUP CREATE MQ mqGroupA 0
OK
# 创建一个从队列最后一条消息开始消费的消费者组
127.0.0.1:6379[15]> XGROUP CREATE MQ mqGroupB $
OK

2.XGROUP CREATECONSUMER - 在指定的消费者组中添加消费者

(1)语法格式:

XGROUP CREATECONSUMER key group consumer

(2)参数:

  • key:队列名称,如果不存在就创建
  • group:消费者组名
  • consumer:消费者名

(3)示例:

127.0.0.1:6379[15]> XGROUP CREATECONSUMER MQ mqGroupA consumer1
(integer) 1
127.0.0.1:6379[15]> XGROUP CREATECONSUMER MQ mqGroupA consumer2
(integer) 1
127.0.0.1:6379[15]> XGROUP CREATECONSUMER MQ mqGroupA consumer3
(integer) 1

3.XINFO STREAM - 打印流信息

(1)语法格式:

XINFO STREAM key

(2)参数:

  • key:队列名称

(3)示例:

127.0.0.1:6379[15]> XINFO STREAM MQ1) "length"2) (integer) 53) "radix-tree-keys"4) (integer) 15) "radix-tree-nodes"6) (integer) 27) "last-generated-id"8) "1703300894359-0"9) "max-deleted-entry-id"
10) "1703238230846-0"
11) "entries-added"
12) (integer) 8
13) "recorded-first-entry-id"
14) "1703238306386-0"
15) "groups"
16) (integer) 2
17) "first-entry"
18) 1) "1703238306386-0"2) 1) "name"2) "Android18"3) "sex"4) "female"5) "age"6) "18"
19) "last-entry"
20) 1) "1703300894359-0"2) 1) "name"2) "Ranchi1"3) "sex"4) "male"5) "age"6) "18"

4.XINFO GROUPS - 打印消费者组的信息

(1)语法格式:

XINFO GROUPS key

(2)参数:

  • key:队列名称

(3)示例:

127.0.0.1:6379[15]> XINFO GROUPS MQ
1)  1) "name"2) "mqGroupA"3) "consumers"4) (integer) 35) "pending"6) (integer) 07) "last-delivered-id"8) "0-0"9) "entries-read"10) (nil)11) "lag"12) (integer) 5
2)  1) "name"2) "mqGroupB"3) "consumers"4) (integer) 05) "pending"6) (integer) 07) "last-delivered-id"8) "1703300894359-0"9) "entries-read"10) (nil)11) "lag"12) (integer) 0

5.XGROUP DELCONSUMER - 在指定的消费者组中删除消费者

(1)语法格式:

XGROUP DELCONSUMER key group consumer

(2)参数:

  • key:队列名称,如果不存在就创建
  • group:消费者组名
  • consumer:消费者名

(3)示例:

127.0.0.1:6379[15]> XGROUP DELCONSUMER MQ mqGroupA consumer3
(integer) 0

6.XGROUP DESTROY - 删除指定的消费者组

(1)语法格式:

XGROUP DESTROY key group

(2)参数:

  • key:队列名称,如果不存在就创建
  • group:消费者组名

(3)示例:

127.0.0.1:6379[15]> XGROUP DESTROY MQ mqGroupB
(integer) 1

7.XGROUP SETID - 为消费者组设置新的最后递送消息ID

(1)语法格式:

XGROUP SETID key group id|$

(2)参数:

  • key:队列名称,如果不存在就创建
  • group:消费者组名
  • id:起始ID,$代表队列中最后一条消息,0代表队列中第一条消息

(3)示例:

127.0.0.1:6379[15]> XGROUP CREATE MQ mqGroupB $
OK
127.0.0.1:6379[15]> XGROUP SETID MQ mqGroupB $
OK

8.XREADGROUP GROUP - 读取消费者组中的消息

(1)语法格式:

XREADGROUP GROUP group consumer [COUNT count] [BLOCK milliseconds] [NOACK] STREAMS key [key ...] id [id ...]

(2)参数:

  • group:消费者组名
  • consumer:消费者名
  • count:读取数量
  • milliseconds:阻塞毫秒数
  • key:队列名
  • id:起始ID,>代表从下一条未消费的消息开始,0代表从pending-list中第一条消息开始,其它根据指定id从pending-list中获取已消费但未确认的消息开始

(3)示例:

# 指定消费者组的消费者去读取下一条未消费的消息
127.0.0.1:6379[15]> XREADGROUP GROUP mqGroupA consumer1 COUNT 1 STREAMS MQ >
1) 1) "MQ"2) 1) 1) "1703238306386-0"2) 1) "name"2) "Android18"3) "sex"4) "female"5) "age"6) "18"
127.0.0.1:6379[15]>
127.0.0.1:6379[15]> XREADGROUP GROUP mqGroupA consumer2 COUNT 1 STREAMS MQ >
1) 1) "MQ"2) 1) 1) "1703297838206-0"2) 1) "name"2) "Vegeta"3) "sex"4) "male"5) "age"6) "18"
127.0.0.1:6379[15]>

(4)注意:若某个消费者,消费了某条消息,但是并没有处理成功时(如消费者进程宕机),这条消息可能会丢失,因为组内其他消费者不能再次消费到该消息了!

9.XPENDING - 显示待处理消息的相关信息

(1)语法格式:

XPENDING key group [[IDLE min-idle-time] start end count [consumer]]

(2)参数:

  • key:队列名
  • group:消费者组名
  • start:开始值,-表示最小值
  • end:结束值,+表示最大值
  • count:数量

(3)示例:

127.0.0.1:6379[15]> XPENDING MQ mqGroupA
1) (integer) 2 # 已读取但未处理的消息数
2) "1703238306386-0" # 起始消息ID
3) "1703297838206-0" # 结束消息ID
4) 1) 1) "consumer1"2) "1"2) 1) "consumer2"2) "1"
127.0.0.1:6379[15]> XPENDING MQ mqGroupB
1) (integer) 0
2) (nil)
3) (nil)
4) (nil)

10.XACK - 将消息标记为"已处理"

(1)语法格式:

XACK key group id [id ...]

(2)参数:

  • key:队列名
  • group:消费者组名
  • id:消息ID

(3)示例:

127.0.0.1:6379[15]> XACK MQ mqGroupA 1703238306386-0
(integer) 1
127.0.0.1:6379[15]> XPENDING MQ mqGroupA
1) (integer) 1
2) "1703297838206-0"
3) "1703297838206-0"
4) 1) 1) "consumer2"2) "1"
127.0.0.1:6379[15]>

11.XCLAIM - 转移消息的归属权

(1)语法格式:

XCLAIM key group consumer min-idle-time id [id ...] [IDLE ms] [TIME unix-time-milliseconds] [RETRYCOUNT count] [FORCE] [JUSTID] [LASTID lastid]

(2)参数:

  • key:队列名
  • group:消费者组名
  • consumer:消费者名
  • min-idle-time:从被读取到未处理的时间
  • id:消息ID

(3)示例:

# 在指定的消费者组中,将cosumer2已读取5分钟(300秒,300000毫秒),但未处理的`1703297838206-0`消息转移给consumer1
127.0.0.1:6379[15]> XPENDING MQ mqGroupA
1) (integer) 1
2) "1703297838206-0"
3) "1703297838206-0"
4) 1) 1) "consumer2"2) "1"
127.0.0.1:6379[15]> XCLAIM MQ mqGroupA consumer1 3600000 1703297838206-0
(empty array) # 转移不成功
127.0.0.1:6379[15]> XCLAIM MQ mqGroupA consumer1 300000 1703297838206-0
1) 1) "1703297838206-0"2) 1) "name"2) "Vegeta"3) "sex"4) "male"5) "age"6) "18"
127.0.0.1:6379[15]> XPENDING MQ mqGroupA
1) (integer) 1
2) "1703297838206-0"
3) "1703297838206-0"
4) 1) 1) "consumer1"2) "1"
127.0.0.1:6379[15]> XPENDING MQ mqGroupA - + 10
1) 1) "1703297838206-0"2) "consumer1"3) (integer) 1171095 # IDLE被重置了4) (integer) 2 # 读取次数被+1

(4)说明:某个消费者读取了消息但没有处理,这时消费者宕机或重启等就会导致该消息失踪。那么就需要该消息转移给其他的消费者处理,就是消息转移。转移除了要指定ID外,还需要指定min-idle-time最小空闲时间,该值要小于消息从被读取到未处理的时间。

三、消息队列的帮助命令

(1)语法格式:

HELP XXX

(2)参数:

  • XXX:命令关键字

(3)示例:

127.0.0.1:6379[15]> help XADDXADD key [NOMKSTREAM] [MAXLEN|MINID [=|~] threshold [LIMIT count]] *|id field value [field value ...]summary: Appends a new message to a stream. Creates the key if it doesn't exist.since: 5.0.0group: stream127.0.0.1:6379[15]> HELP XGROUPXGROUP (null)summary: A container for consumer groups commands.since: 5.0.0group: streamXGROUP CREATE key group id|$ [MKSTREAM] [ENTRIESREAD entries-read]summary: Creates a consumer group.since: 5.0.0group: streamXGROUP CREATECONSUMER key group consumersummary: Creates a consumer in a consumer group.since: 6.2.0group: streamXGROUP DELCONSUMER key group consumersummary: Deletes a consumer from a consumer group.since: 5.0.0group: streamXGROUP DESTROY key groupsummary: Destroys a consumer group.since: 5.0.0group: streamXGROUP HELP (null)summary: Returns helpful text about the different subcommands.since: 5.0.0group: streamXGROUP SETID key group id|$ [ENTRIESREAD entries-read]summary: Sets the last-delivered ID of a consumer group.since: 5.0.0group: stream127.0.0.1:6379[15]>

相关文章:

Redis Stream消息队列之基本语法与使用方式

前言 本文的主角是Redis Stream,它是Redis5.0版本新增加的数据结构,主要用于消息队列,提供了消息的持久化和主备复制功能,可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证…...

制造行业定制软件解决方案——工业信息采集平台

摘要:针对目前企业在线检测数据信号种类繁多,缺乏统一监控人员和及时处置措施等问题。蓝鹏测控开发针对企业工业生产的在线数据的集中采集分析平台,通过该工业信息采集平台可将企业日常各种仪表设备能够得到数据进行集中分析处理存储&#xf…...

[python]用python实现对arxml文件的操作

目录 关键词平台说明一、背景二、方法2.1 库2.2 code 关键词 python、excel、DBC、openpyxl 平台说明 项目Valuepython版本3.6 一、背景 有时候需要批量处理arxml文件(ARXML 文件符合 AUTOSAR 4.0 标准),但是工作量太大,阔以考虑用python。 二、方…...

pdf 在线编辑

https://smallpdf.com/edit-pdf#rapp 参考 https://zh.wikihow.com/%E5%B0%86%E5%9B%BE%E5%83%8F%E6%8F%92%E5%85%A5PDF...

自然语言处理(NLP):理解语言,赋能未来

目录 前言1 什么是NLP2 NLP的用途3 发展历史4 NLP的基本任务4.1 词性标注(Part-of-Speech Tagging)4.2 命名实体识别(Named Entity Recognition)4.3 共指消解(Co-reference Resolution)4.4 依存关系分析&am…...

FastAPI使用loguru时,出现重复日志打印的解决方案

首先看图,发现每个日志都被打印了3条。其实这个和uvicorn日志打印的设计有关,在uvicorn中有多个logger,分别是uvicorn、uvicorn.error、uvicorn.access 而LOGGING默认有一个属性propagate,这个属性为True时,子日志记录…...

构建每个聚类的profile和deletion_mean特征

通过summarize_clusters函数构建每个聚类的protein[cluster_profile]和protein[cluster_deletion_mean]特征。目的是把extra_msa信息反映到msa中。 集成函数数据处理流程: sample_msa ->make_masked_msa -> nearest_neighbor_clusters -> summarize_clu…...

Milvus数据一致性介绍及选择方法

1、Milvus 时钟机制 Milvus 通过时间戳水印来保障读链路的一致性,如下图所示,在往消息队列插入数据时, Milvus 不光会为这些插入记录打上时间戳,还会不间断地插入同步时间戳,以图中同步时间戳 syncTs1 为例&#xff0…...

异常处理和单元测试python

一、实验题目 异常处理和单元测试 二、实验目的 了解异常的基本概念和常用异常类。掌握异常处理的格式、处理方法。掌握断言语句的作用和使用方法。了解单元测试的基本概念和作用。掌握在Python中使用测试模块进行单元测试的方法和步骤。 三、实验内容 编程实现如下功能&a…...

蓝牙物联网在汽车领域的应用

I、蓝牙的技术特点 ​ 1998 年 5 月,瑞典爱立信、芬兰诺基亚、日本东芝、美国IBM 和英特尔公司五家著名厂商,在联合拓展短离线通信技术的标准化活动时提出了蓝牙技术的概念。蓝牙工作在无需许可的 2.4GHz 工业频段 (SIM)之上(我国的频段范围为2400.0~248…...

用23种设计模式打造一个cocos creator的游戏框架----(二十二)原型模式

1、模式标准 模式名称:原型模式 模式分类:创建型 模式意图:用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象 结构图: 适用于: 1、当一个系统应该独立于它的产品创建、构成和表示时 2、…...

paddle 55 使用Paddle Inference部署嵌入nms的PPYoloe模型(端到端fps达到52.63)

Paddle Inference 是飞桨的原生推理库,提供服务器端的高性能推理能力。由于 Paddle Inference 能力直接基于飞桨的训练算子,因此它支持飞桨训练出的所有模型的推理。paddle平台训练出的模型转换为静态图时可以选用Paddle Inference的框架进行推理,博主以前都是将静态图转换为…...

自动化测试工具-Selenium:WebDriver的API/方法使用全解

我们上一篇文章介绍了Selenium的三大组件,其中介绍了WebDriver是最重要的组件。在这里,我们将看到WebDriver常用的API/方法(注:这里使用Python语言来进行演示)。 1. WebDriver创建 打开VSCode,我们首先引…...

如何通过蓝牙串口启动智能物联网?

1、低功耗蓝牙(BLE)介绍 BLE 技术是一种低成本、短距离、可互操作的鲁棒性无线技术,工作在免许可的 2,4 GHZ 工业、科学、医学(Industrial Scientific Medical,ISM)频段。BLE在设计之初便被定位为一种超低功耗(Ultra Low Power,ULP)无线技术&…...

Linux---基础操作命令

内容导航 类别内容导航机器学习机器学习算法应用场景与评价指标机器学习算法—分类机器学习算法—回归机器学习算法—聚类机器学习算法—异常检测机器学习算法—时间序列数据可视化数据可视化—折线图数据可视化—箱线图数据可视化—柱状图数据可视化—饼图、环形图、雷达图统…...

uniapp怎么动态渲染导航栏的title?

直接在接口请求里面写入以下: 自己要什么参数就写什么参数 本人仅供参考: this.name res.data.data[i].name; console.log(名字, res.data.data[i].name); uni.setNavigationBarTitle({title: this.name}) 效果:...

【机器学习】决策树

参考课程视频:https://www.icourse163.org/course/NEU-1462101162?tid1471214452 1 概述 样子: 2 分裂 2.1 分裂原则 信息增益 信息增益比 基尼指数 3 终止 & 剪枝 3.1 终止条件 无需分裂 当前节点内样本同属一类 无法分裂 当前节点内…...

[node] Node.js的全局对象Global

[node] Node.js的全局对象Global 什么是全局对象 & 全局变量全局对象与全局变量全局变量-- __filename全局变量-- __dirname全局函数-- setTimeout(cb, ms)全局函数-- clearTimeout(t)全局函数-- setInterval(cb, ms)全局变量-- consoleconsole 方法概览 全局变量-- proces…...

完整的 Meteor NPM 集成

在Meteor中,你只能使用包内的模块。你不能直接将模块与流星应用一起使用。此软件包解决了该问题 文章目录 源码下载地址安装定义软件包使用软件包在 Meteor 方法中使用 npm 模块的示例应用程序接口异步实用程序Async.runSync(函数)Meteor.sy…...

智能优化算法应用:基于骑手优化算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于骑手优化算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于骑手优化算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.骑手优化算法4.实验参数设定5.算法结果6.…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...