Redis 7.x 系列【14】数据类型之流(Stream)
有道无术,术尚可求,有术无道,止于术。
本系列Redis 版本 7.2.5
源码地址:https://gitee.com/pearl-organization/study-redis-demo
文章目录
- 1. 概述
- 2. 常用命令
- 2.1 XADD
- 2.2 XRANGE
- 2.3 XREVRANGE
- 2.4 XDEL
- 2.5 XLEN
- 2.6 XREAD
- 2.7 XGROUP CREATE
- 2.8 XACK
- 2.9 XPENDING
- 3. 应用场景
1. 概述
消息队列:是指把要传输的数据(消息)放在队列中,用队列机制来实现消息传递,生产者产生消息并把消息放入队列,然后由消费者去处理。消费者可以到指定队列拉取消息,或者订阅相应的队列,由服务端给其推送消息。
Redis
也支持消息队列功能,在 5.0
版本之前,基于以下两种方式实现:
Pub/Sub
List
Pub/Sub
发布订阅模式,消息的发送者不会将消息直接发送给特定的接收者,而是通过消息通道广播出去,让订阅该消息主题的订阅者消费到:
Pub/Sub
中的消息无法持久化,如果出现网络断开、宕机等,消息就会被丢弃。而且也没有 Ack
机制来保证数据的可靠性,假设一个消费者都没有,那消息就直接被丢弃了。
Redis List
也可以实现消息队列,按照插入顺序排序,可以添加一个元素到列表的头部(左边)或者尾部(右边)。 将需要延后处理的任务结构体序列化成字符串塞进 Redis
的列表,另一个线程从这个列表中轮询数据进行处理:
Redis List
同样存在诸多问题,比如,不支持多消费者模式,不支持延时消息,不支持优先级,不支持消息确认机制等等。
Redis Stream
是 5.0
版本中引入的一种新的数据结构,用于实现简单但功能强大的消息传递模式。以时间序列的方式存储消息,每个消息都有一个唯一的 ID
,并且可以被多个消费者订阅和消费。是 Redis
实现消息队列的另外一种模式,支持消息的持久化、支持自动生成全局唯一 1D
、支持 Ack
确认消息模式、支持消费组模式等,旨在让消息队列更加的稳定和可靠。
其结构图如下:
各部分解释:
Message Content
:消息内容Consumer group
:消费组,通过XGROUP CREATE
命令创建,同一个消费组可以有多个消费者Last_delivered_id
:游标,每个消费组会有个游标Last_delivered_id
,任意一个消费者读取了消息都会使游标往前移动。Consumer
:消费者,消费组中的消费者Pending_ ids
:消费者会有一个状态变量,用于记录被当前消费已读取但未 ack 的消息 Id ,如果客户端没有 ack ,这个变量里面的消息ID
会越来越多,一旦某个消息被ack
它就开始减少。这个pending_ids
变量在Redis
官方被称之为PEL
(Pending Entries List
),记录了当前已经被客户端读取的消息,但是还没有ack
(Acknowledge character
:确认字符),它用来确保客户端至少消费了消息一次,而不会在网络传输的中途丢失了没处理
2. 常用命令
Stream
相关所有命令:
命名 | 描述 |
---|---|
XACK | 确认消费者已经成功处理从 Stream 中获取的消息 |
XADD | 添加消息到队列末尾 |
XAUTOCLAIM | 转移符合指定条件的待处理流条目的所有权 |
XCLAIM | 改变待处理消息的所有权 |
XDEL | 删除消息 |
XGROUP CREATE | 为存储在 key 的流创建一个新的消费者组 |
XGROUP CREATECONSUMER | 要在存储在key 的流的消费者组中创建一个消费者 |
XGROUP DELCONSUMER | 消费者组中删除一个消费者 |
XGROUP DESTROY | 删除一个已存在的消费者组 |
XGROUP SETID | 为消费者组设置最后传递的ID |
XINFO CONSUMERS | 返回消费者组中的消费者列表 |
XINFO GROUPS | 返回消费者组列表 |
XINFO STREAM | 存储在的key 流的相关信息 |
XLEN | 获取 Stream 中的消息长度 |
XPENDING | 通过消费者组从流中获取数据但不确认这些数据,会产生待处理条目 |
XRANGE | 获取消息列表(可以指定范围) |
XREAD | 获取消息(阻塞/非阻塞),返回大于指定 ID 的消息 |
XREADGROUP | XREAD 命令的一个特殊版本,支持消费者组 |
XREVRANGE | 和 XRANGE 相比区别在于反向获取,ID 从大到小 |
XSETID | 内部命令。它用于主节点来复制流的最后传递的ID |
XTRIM | 限制 Stream 的长度,如果已经超长会进行截取 |
2.1 XADD
XADD
命令用于向 Stream
(流)数据结构末尾添加消息。
语法格式:
XADD key [NOMKSTREAM] [MAXLEN|MINID [=|~] threshold [LIMIT count]] *|ID field value [field value ...]
参数说明:
key
:指定要添加消息的Stream
的名称。[NOMKSTREAM]
:可选参数,用于指定当流不存在时是否报错。默认情况下,如果指定的流不存在,XADD
命令会创建。如果使用NOMKSTREAM
选项,则流不存在时命令会失败。[MAXLEN|MINID [=|~] threshold [LIMIT count]]
:这组选项用于控制流的最大长度或最小消息ID
。MAXLEN maxlen
:限制Stream
的最大长度。当长度达到maxlen
时,旧的消息会被自动删除。MINID minid
:指定最旧的消息ID
。当插入新消息时,如果已经存在比minid
更旧的消息,则会将这些消息删除。[=|~]
:操作符,=
表示精确匹配,~
表示小于等于(对于MINID
而言)或大于等于(对于MAXLEN
而言)。[LIMIT count]
:当使用MAXLEN
和~
时,指定需要保留的消息数量的最小值。
*|ID
:消息的ID
。使用*
表示自动生成一个唯一的ID
。如果不使用*
,则需要提供一个有效的消息ID
,它必须大于流中所有已存在的消息的ID
。field value [field value ...]
:消息的字段和值。可以指定一个或多个字段及其对应的值。
示例,插入消息:
localhost:0>XADD mystream * msg_1 100 msg_2 38
"1719279960591-0"
示例, 插入消息,并限制长度不超过 1000
条:
localhost:0>XADD mystream MAXLEN 1000 * msg_3 100 msg_4 38
"1719279971749-0"
查看控制台:
2.2 XRANGE
XRANGE
命令用于获取指定范围内的消息。
命令格式:
XRANGE key start end [COUNT count]
参数说明:
key
:指定Stream
的key
。start
:指定要检索的消息范围的起始ID
。可以使用特殊值-来表示最小值。end
:指定要检索的消息范围的结束ID
。可以使用特殊值+来表示最大值。[COUNT count]
:可选参数,用于限制返回的消息数量。
注意事项:
Stream
的消息ID
由两部分组成:一个时间戳和一个序列号。时间戳表示消息被添加到Stream
的时间,而序列号则用于在同一时间戳内区分不同的消息。XRANGE
命令返回的消息是按照它们在Stream
中的顺序排列的,即按照消息ID
的顺序。- 如果在检索消息时使用了
COUNT
参数,但指定的范围内的消息数量少于COUNT
指定的数量,那么只会返回范围内的所有消息。
示例,检索所有消息:
localhost:0>XRANGE mystream - +1) 1) "1719279960591-0"2) 1) "msg_1"2) "100"3) "msg_2"4) "38"2) 1) "1719279971749-0"2) 1) "msg_3"2) "100"3) "msg_4"4) "38"
示例,检索特定范围内的消息:
localhost:0>XRANGE mystream 1719279960591-0 1719279960600-01) 1) "1719279960591-0"2) 1) "msg_1"2) "100"3) "msg_2"4) "38"
示例,限制返回的消息数量:
localhost:0>XRANGE mystream - + COUNT 11) 1) "1719279960591-0"2) 1) "msg_1"2) "100"3) "msg_2"4)
2.3 XREVRANGE
XREVRANGE
命令与 XRANGE
命令类似,但它是按照消息 ID
的递减顺序(用于反向)获取指定范围内的消息。
命令格式:
XREVRANGE key end start [COUNT count]
示例,检索最后两个时间序列的消息:
localhost:0>XREVRANGE mystream + - COUNT 21) 1) "1719279971749-0"2) 1) "msg_3"2) "100"3) "msg_4"4) "38"2) 1) "1719279960591-0"2) 1) "msg_1"2) "100"3) "msg_2"4) "38"
2.4 XDEL
XDEL
命令用于从 Stream 中删除指定的消息。返回一个整数,表示被成功删除的消息数量。
命令格式:
XDEL key ID [ID ...]
参数说明:
key
:指定Stream
的key
。ID
:一个或多个要删除的消息的ID
。
注意事项:
- 在使用
XDEL
命令时,你需要确保提供的消息ID
是存在的,否则命令将不会删除任何消息,并返回0。 - 可以通过一次
XDEL
命令删除多个消息,只需在命令中提供多个消息ID
即可。 XDEL
命令不会改变Stream
的其他消息的顺序或ID
。
示例,删除消息:
localhost:0>XDEL mystream 1719280747405-0
"1"
2.5 XLEN
XLEN
命令用于获取指定 Stream
中包含的消息数量,即流的长度。如果 Stream
不存在或为空,则返回 0
。
命令格式:
XLEN key
示例:
localhost:0>XLEN mystream
"1"
2.6 XREAD
XREAD
命令是用于从 Stream
独立消费消息,支持阻塞等待新消息的到来。返回一个数组,其中每个元素都是一个包含 Stream key
和消息列表的数组。消息列表是一个包含消息 ID
和消息数据的数组。
命令格式:
XREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] ID [ID ...]
参数说明:
COUNT count
:指定一次读取的最大消息数量。如果未指定,则默认为1
。BLOCK milliseconds
:用于指定阻塞的时间(以毫秒为单位)。如果指定了此参数,并且Stream
中没有可消费的消息,客户端将在指定的时间内阻塞等待。如果设置为0
,则表示非阻塞模式,即如果没有消息可消费,则立即返回。STREAMS key [key ...]
:指定要从中读取消息的Stream
的key
。可以指定一个或多个。ID [ID ...]
:对于每个指定的key
,可以提供一个或多个消息ID
。这些ID
用于指定从哪个位置开始读取消息。如果某个key
后面没有指定ID
,则默认为从该Stream
的最新消息开始读取。
示例,非阻塞模式读取最新消息:
XREAD COUNT 1 STREAMS mystream $
示例,阻塞模式,读取最新消息并等待新消息:
XREAD COUNT 1 BLOCK 10000 STREAMS mystream $
2.7 XGROUP CREATE
XGROUP CREATE
命令用于在已存在的流(stream
)上创建一个新的消费者组(consumer group
)。消费者组允许多个消费者(consumer
)协作消费同一个流中的数据,并且每个消费者都可以从自己的位置开始读取流。
命令格式:
XGROUP CREATE <key> <groupname> <id> [MKSTREAM] [MKTABLE] [CREATECONSUMER <consumername>]
参数说明:
<key>
:流的名称。<groupname>
:消费者组的名称。<id>
:消费者组初始的最后一个条目ID
,即消费者组开始读取的起始点。可以使用$
表示流的最新条目,或者使用0
表示流的起始点,或者使用任何其他有效的ID
。[MKSTREAM]
:可选参数,如果流不存在,则创建它。[MKTABLE]
:在Redis 6.2
及更高版本中引入的可选参数,用于创建与流关联的二级索引表(secondary index table
)。这通常用于支持基于特定字段的查询。[CREATECONSUMER <consumername>]
:在Redis 6.2
及更高版本中引入的可选参数,用于在创建消费者组时同时创建一个消费者。
示例,创建一个新的消费者组,从流的最新条目开始读取:
localhost:0>XGROUP CREATE mystream mygroup $ MKSTREAM
"OK"
2.8 XACK
XACK
命令用于确消费者已经成功处理了一个或多个消息。这些消息通常是从流(Stream
)中读取的,并存储在消费者组的待处理条目列表(Pending Entry List
,PEL
)中。通过发送 XACK
命令,消费者通知 Redis
服务器它已经完成了一个或多个消息的处理,从而将这些消息从 PEL
中移除。
命令格式:
XACK <key> <groupname> <consumername> <ID> [<ID> ...]
参数说明:
<key>
:流的名称。<groupname>
:消费者组的名称。<consumername>
:消费者的名称。<ID>
:要确认的消息的ID
,可以指定一个或多个。
示例,假设消费者已经读取了一些消息,并决定它们已经被成功处理。现在,消费者想要确认这些消息:
XACK mystream mygroup myconsumer 1526569900000-0 1526569900002-0
在这个例子中,消费者确认了两个消息,它们的 ID
分别是 1526569900000-0
和 1526569900002-0
。
一旦消息被确认,它们将从该消费者组的 PEL
中移除,表示这些消息已经被成功处理。注意,即使消息被确认并从 PEL
中移除,它们仍然保留在流中,并且可以被其他消费者组或消费者读取。
如果消费者在处理消息时失败,或者需要稍后重试,它可以选择不发送 XACK
命令,这样消息将保持在 PEL
中,直到消费者准备好确认它们或它们因超时而被自动从 PEL
中移除(取决于消费者组的配置)。
2.9 XPENDING
XPENDING
命令用于查询消费者组中未确认消息的详细信息。允许你查看哪些消息正在等待被处理,以及哪些消费者拥有这些消息。
命令格式:
XPENDING <key> <groupname> [start end count] [consumername]
参数说明:
<key>
:流的名称。<groupname>
:消费者组的名称。[start end count]
:这三个参数是可选的,用于限制查询结果的范围。start
:查询的开始消息ID
。end
:查询的结束消息ID
。count
:要返回的消息数量。[consumername]
:可选参数,指定要查询的消费者的名称。如果不提供此参数,将返回消费者组中的所有未确认消息。
XPENDING
命令返回一个数组,其中包含以下信息:
- 总未确认消息数:整数,表示在指定范围内未确认的消息总数。
- 最小消息
ID
:字符串,表示在指定范围内未确认消息的最小ID
。 - 最大消息
ID
:字符串,表示在指定范围内未确认消息的最大ID
。 - 每个消费者的未确认消息:一个数组,其中每个元素都是一个包含消费者名称和该消费者拥有的未确认消息数的数组。
注意事项:
XPENDING
是一个只读命令,它不会修改任何数据。- 如果提供了
consumername
参数,则只返回该消费者的未确认消息信息。 - 如果提供了
[start end count]
参数,则只返回指定范围内的未确认消息信息。 - 通过
XPENDING
命令,你可以轻松地监控消费者组中的未确认消息,从而确保消息得到及时处理,并在必要时进行故障排除。
示例:
XPENDING mystream mygroup
2) "1526569900000-0" # 最小消息ID
3) "1526569900002-0" # 最大消息ID
4) 1) 1) "myconsumer" # 消费者名称 2) (integer) 2 # 该消费者拥有的未确认消息数
3. 应用场景
Redis Stream
主要用于消息队列,所以可以用来解决应用解耦,异步消息,流量削峰等问题,实现高性能,高可用,可伸缩和最终一致性架构。但是更推荐使用专业的消息队列,比如RabbitMQ
、RocketMQ
等,对于简单的应用场景,如果能满足需求,也可以使用Redis Stream
。
相关文章:

Redis 7.x 系列【14】数据类型之流(Stream)
有道无术,术尚可求,有术无道,止于术。 本系列Redis 版本 7.2.5 源码地址:https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 常用命令2.1 XADD2.2 XRANGE2.3 XREVRANGE2.4 XDEL2.5 XLEN2.6 XREAD2.7 XG…...

(四)opengl函数加载和错误处理
#include <glad/glad.h>//glad必须在glfw头文件之前包含 #include <GLFW/glfw3.h> #include <iostream>void frameBufferSizeCallbakc(GLFWwindow* window, int width, int height) {glViewport(0, 0, width, height);std::cout << width << &qu…...

RuoYi-Vue3不启动后端服务如何登陆?
RuoYi-Vue3不启动后端服务如何登陆?RuoYi-Vue3使用的前端技术栈 是:Vue3 + Element Plus + Vite。 github开源地址:https://github.com/yangzongzhuan/RuoYi-Vue3 前后的分离在线演示项目地址:https://vue.ruoyi.vip/ 这种方式是用若依提供的在线后端接口,可以在此基础上修…...

Typora(跨平台 Markdown 编辑器 )正版值得购买吗
Typora 是一款桌面 Markdown 编辑器,作为国人开发的优秀软件,一直深受用户的喜爱。 实时预览格式 Typora 是一款适配 Windows / macOS / Linux 平台的 Markdown 编辑器,编辑实时预览标记格式,所见即所得,轻巧而强大…...

springboot个人证书管理系统-计算机毕业设计源码16679
摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了个人证书管理系统的开发全过程。通过分析个人证书管理系统管理的不足,创建了一个计算机管理个人证书管理系统的方案。文章介绍了个人证书管理系统的系…...

读-改-写操作
1 什么是读-改-写操作 “读-改-写”(Read-Modify-Write,简称RMW)是一种常见的操作模式,它通常用于需要更新数据的场景。 这个模式包含三个基本步骤: 1.读(Read):首先读取当前的数据…...

海外仓系统应用教程:解决了小型海外仓哪些问题
大型海外仓通过对海外仓WMS系统的使用,大大提升了业务流程的效率和利润率。这也给很多小型海外仓造成了误区,觉得海外仓系统就是为大型海外仓设计的。其实小型海外仓对海外仓系统的需求同样强烈,现在也有很多专门转对中小型海外仓设计的WMS系…...

shell 脚本编程
简介: 用户通过shell向计算机发送指令的计算机通过shell给用户返回指令的执行结果 通过shell编程可以达到的效果 提高工作效率可以实现自动化 需要学习的内容: linuxshell的语法规范 编写shell的流程 第一步:用vi/vim创建一个.sh的文件…...

gin参数验证
一. 结构体验证 用gin框架的数据验证,可以不用解析数据,减少if else。如下面的代码,如果需要增加判断条件,就需要增加if或者if else。 type MyApi struct {a intb string }func checkMyApi(val *MyApi) bool {if val.a 0 {retur…...

【web3】分享一个web入门学习平台-HackQuest
前言 一直想进入web3行业,但是没有什么途径,偶然在电鸭平台看到HackQuest的共学营,发现真的不错,并且还接触到了黑客松这种形式。 链接地址:HackQuest 平台功能 学习路径:平台有完整的学习路径ÿ…...

Sectigo或RapidSSL DV通配符SSL证书哪个性价比更高?
在当前的网络安全领域,选择一款合适的SSL证书对于保护网站和用户数据至关重要。Sectigo和RapidSSL作为市场上知名的SSL证书提供商,以其高性价比和快速的服务响应而受到市场的青睐。本文将对Sectigo和RapidSSL DV通配符证书进行深入对比,帮助用…...

金蝶云星空字段之间连续触发值更新
文章目录 金蝶云星空字段之间连续触发值更新场景说明具体需求:解决方案 金蝶云星空字段之间连续触发值更新 场景说明 字段A配置了字段B的计算公式,字段B配置了自动C的计算公式,修改A的时候,触发了B的重算,但是C触发不…...

Python 获取字典中的值(八种方法)
Python 字典(dictionary)是一种可变容器模型,可以存储任意数量的任意类型的数据。字典通常用于存储键值对,每个元素由一个键(key)和一个值(value)组成,键和值之间用冒号分隔。 以下是 Python 字典取值的几…...

Day49
Day49 代理模式proxy 概念: 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式,即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能. 代理模式分为静态代理和动态代理…...

OpenCV 车牌检测
OpenCV 车牌检测 级联分类器算法流程车牌检测相关链接 级联分类器 假设我们需要识别汽车图像中车牌的位置,利用深度学习目标检测技术可以采取基于锚框的模型,但这需要在大量图像上训练模型。 但是,级联分类器可以作为预训练文件直接使用&…...

机器学习/pytorch笔记:time2vec
1 概念部分 对于给定的标量时间概念 t,Time2Vec 的表示 t2v(t)是一个大小为 k1的向量,定义如下: 其中,t2v(t)[i]是 t2v(t)的第 i 个元素,F是一个周期性激活函数,ω和 ϕ是可学习的参数。 以下是个人理解&am…...

降低开关电源噪声的设计总结
开关电源的特征就是产生强电磁噪声,若不加严格控制,将产生极大的干扰。下面介绍的技术有助于降低开关电源噪声,能用于高灵敏度的模拟电路。 电路和器件的选择 一个关键点是保持dv/dt和di/dt在较低水平,有许多电路通过减小dv/dt和…...

rust嵌入式开发2024
老的rust embedded book 其实过时了. 正确的姿势是embassy 入手. 先说下以前rust写嵌入怎么教学小白的. 第一步,从这里 svd2rust 工具,自己生成库第二部,有了这个库,相当于就有了pac外设访问文件,然后其实就可以搞起来了. 那么为啥不好搞了. 因为太乱了. 小白喜欢你告我咋弄…...

字符串
对应练习题:力扣平台 14. 最长公共前缀 class Solution { public:string longestCommonPrefix(vector<string>& strs) {string strs1strs[0];//初始前缀字符串for (int i 1; i < strs.size(); i) {while(strs[i].find(strs1)!0)//遍历找到共同最长前…...

mysql8 锁表与解锁
方法1不行,就按方法2来执行; (一) 解锁方法1 连接mysql ,直接执行UNLOCK TABLES,细节如下: – 查询是否锁表 SHOW OPEN TABLES WHERE in_use >0 ; – 查询进程 show processlist ; – 查询到相对应的进程…...

第2篇 区块链的历史和发展:从比特币到以太坊
想象一下,你住在一个小镇上,每个人都有一个大账本,记录着所有的交易。这个账本很神奇,每当有人买卖东西,大家都会在自己的账本上记一笔,确保每个人的账本都是一致的。这就是区块链的基本思想。而区块链的故…...

从理论到实践的指南:企业如何建立有效的EHS管理体系?
企业如何建立有效的EHS管理体系?对于任何企业,没有安全就谈不上稳定生产和经济效益,因此建立EHS管理体系是解决企业长期追求的建立安全管理长效机制的最有效手段。良好的体系运转,可以最大限度地减少事故发生。 这篇借着开头这个…...

内网和外网的区别及应用
内网和外网的区别及应用 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们来探讨一下计算机网络中的内网和外网,它们的区别以及在实际应用中的…...

电驱失效类型和风险分析,如何用精益思维提升电驱可靠性?
在电动车日益普及的今天,电驱系统作为电动车的“心脏”,其可靠性直接关系到整车的性能与用户体验。然而,电驱失效问题却一直困扰着电动车行业,如何提升电驱可靠性成为了业内关注的焦点。今天,深圳天行健精益管理咨询公…...

自动扫描范围在减少剂量多相CT肝脏成像中的应用:基于CNN和高斯模型| 文献速递-深度学习自动化疾病检查
Title 题目 Automatic scan range for dose-reduced multiphase CT imaging of theliver utilizing CNNs and Gaussian models 自动扫描范围在减少剂量多相CT肝脏成像中的应用:基于CNN和高斯模型 01 文献速递介绍 肝癌是全球癌症死亡的第四大原因,每…...

【机器学习】基于层次的聚类方法:理论与实践
🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 💫个人格言: "如无必要,勿增实体" 文章目录 基于层次的聚类方法:理论与实践引言1. 层次聚类基础1.1 概述1.2 距离…...

C# 验证PDF数字签名的有效性
数字签名作为PDF文档中的重要安全机制,不仅能够验证文件的来源,还能确保文件内容在传输过程中未被篡改。然而,如何正确验证PDF文件的数字签名,是确保文件完整性和可信度的关键。本文将详细介绍如何使用免费.NET控件通过C#验证PDF签…...

2小时动手学习扩散模型(pytorch版)【入门版】【代码讲解】
2小时动手学习扩散模型(pytorch版) 课程地址 2小时动手学习扩散模型(pytorch版) 课程目标 给零基础同学快速了解扩散模型的核心模块,有个整体框架的理解。知道扩散模型的改进和设计的核心模块。 课程特色…...

Centos7网络配置(设置固定ip)
文章目录 1进入虚拟机设置选中【网络适配器】选择【NAT模式】2 进入windows【控制面板\网络和 Internet\网络和共享中心\更改适配器设置】设置网络状态。3 设置VM的【虚拟网络编辑器】4 设置系统网卡5 设置虚拟机固定IP 刚安装完系统,有的人尤其没有勾选自动网络配置…...

英伟达被“压制”的25年
十九世纪中叶的美国西部,掀起了一场轰轰烈烈的淘金热,但最终赚到钱的,并不是拿命去赌的淘金者。一个名叫萨姆布瑞南的商人,通过向淘金者出售铲子,成了加州历史上第一位百万富翁。 每一次风口出现时,总有企…...