04 Redis之命令(Hash型Value命令+List型Value命令+Set型Value命令+有序集合ZSET型Value命令)

news2024/11/19 11:25:02

3.4 Hash型Value命令

Hash 表就是一个映射表 Map,也是由键-值对构成,为了与整体的 key 进行区分,这里的键称为 field,值称为 value。注意,Redis 的 Hash 表中的 field-value 对均为 String 类型。

3.4.1 hset

 格式: HSET key field1 value1 [field2 value2 …]
 功能:将哈希表 key 中的字段 field 的值设为 value 。
 返回值:
a. 若仅修改返回0 ;
b. 仅新增 , 同时新增和修改时, 返回新增的个数
c. 若key已存在, 且并不是哈希表, 返回错误
 说明:如果 key 不存在,一个新的哈希表被创建并进行 HSET 操作。如果字段 field 已经存在于哈希表中,旧值将被覆盖。
在这里插入图片描述

3.4.2 HGET

 格式:HGET key field
 功能:返回哈希表 key 中给定字段 field 的值。
 返回值:当给定字段不存在或是给定 key 不存在时,返回 nil 。

3.4.3 HMSET

就是HSET的多键值对版本, 可以一次向哈希表key中插入多个键值对, 但从4.0版本之后 , HSET可以也可以实现插入多个键值对, HMSET不再推荐使用.

3.4.4 HMGET

 格式:HMGET key field [field …]
 功能:按照给出顺序返回哈希表 key 中一个或多个字段的值。
 返回值:当给定字段不存在或是给定 key 不存在时,返回 nil 。

3.4.5 HGETALL

 返回值:
a. 返回哈希表key中的所有键值对, 每个字段(field name)之后是字段的值(value),所以返回值的长度是哈希表大小的两倍。
b .当给定字段不存在或是给定 key 不存在时,返回 nil 。

阻塞系统 . 生产环境中一般不使用该命令,而使用 hscan 命令代替。

3.4.6 HSETNX

 格式:HSETNX key field value
 功能:仅为哈希表key中不存在的字段field赋值
 返回值:
a, 若字段 field 已经存在,该操作无效。返回0
b. 若哈希表key 不存在,一个新哈希表被创建并执行 HSETNX 命令。返回1

3.4.7 HDEL

 格式:HDEL key field1 [field2 …]
 功能:删除哈希表 key 中的一个或多个指定字段,不存在的字段将被忽略。
 返回值:被成功移除的字段的数量,不包括被忽略的字段。

3.4.8 HEXISTS

 格式:HEXISTS key field
 功能:查看哈希表 key 中给定字段 field 是否存在。
 返回值:如果哈希表含有给定字段,返回 1 。如果不含有给定字段,或 key 不存在,返回 0 。

3.4.9 HINCRBY 与 HINCRBYFLOAT

 格式:HINCRBY key field increment
 功能:为哈希表 key 中的字段 field 的值加上增量 increment 。hincrby 命令只能增加整数值,而 hincrbyfloat 可以增加小数值。增量也可以为负数,相当于对给定字段进行减法操作。
 返回值:
a. 如果 哈希表key 不存在,一个新的哈希表被创建并执行 HINCRBY 命令。并返回执行后字段字段field的value
b. 如果字段 field 不存在,那么在执行命令前,字段的值被初始化为 0。并返回执行后字段field的value
c. 对储存字符串值的字段 field 执行 HINCRBY 命令 , 将返回一个错误。

3.4.10 HKEYS 与 HVALS

 格式:HKEYS key 或 HVALS key
 功能:返回哈希表 key 中的所有字段/值。
 返回值:当 key 不存在时,返回空表提示HKEYS fake_key (empty list or set)。

3.4.11 HLEN

 格式:HLEN key
 功能:返回哈希表 key 中字段的数量。
 返回值:当 哈希表key 不存在时,返回 0 。

3.4.12 HSTRLEN

 格式:HSTRLEN key field
 功能:返回哈希表 key 中, 与给定字段 field 相关联的值的字符串长度(string length)。
 返回值:如果给定的键key或者字段field不存在, 那么命令返回 0 。

3.4.13 应用场景

Hash 型 Value 非常适合存储对象数据。key 为对象名称,value 为描述对象属性的 Map,对对象属性的修改在 Redis 中就可直接完成。

作为对比 :
一个普通的对象, 必须将其序列化为JSON后才能存储进String 型 Value 中. 因此, 若要修改对象属性, 先要读出String型Value值, 然后将其反序列化回对象后再修改,修改后再序列化为 JSON 串后写入到 Redis, 可以看出非常复杂。

然而, 在实际应用中, 为了操作命令的统一, 包括hash / list / set /zset 所有都用String类型解决.


3.5 List型Value命令

List型Value, 即value属性中存储的是一个String型的列表, 列表中的数据会按照插入顺序进行排序。不过,该列表的底层实际是一个无头节点的双向链表,所以对列表表头与表尾的操作性能较高,但对中间元素的插入与删除的操作的性能相对较差。

3.5.1 LPUSH/RPUSH

 格式: LPUSH key value1 [value2 …] 或 RPUSH key value1 [value1 …]
 功能:将一个或多个值 value 插入到列表 key 的表头/表尾(表头在左表尾在右)
 说明:
如果有多个 value 值,对于 LPUSH 来说,各个 value 会按从左到右的顺序依次插入到表头;对于 RPUSH 来说,各个 value 会按从左到右的顺序依次插入到表尾。执行成功时返回列表的长度。
如果 key不存在,一个空列表会被创建并执行操作。
当 key 存在但不是列表类型时,返回一个错误。

在这里插入图片描述

3.5.2 LSET

 格式:LSET key index value
 功能:将列表 key 下标为 index 的元素的值设为 value 。
 说明:当 index 参数超出范围,或对一个空列表(key 不存在)进行 LSET 时,返回一个错误。

3.5.3 LLEN

 格式:LLEN key
 功能:返回存储在 key 中的列表长度。 。
 说明:
a. 如果 key 不存在,则 key 被解释为一个空列表,返回 0 。
b. 如果 key 不是列表类型,返回一个错误。

3.5.4 LINDEX

 格式:LINDEX key index
 功能:返回列表 key 中,下标为 index 的元素。列表从 0 开始计数。
 说明:如果 index 参数的值不在列表的区间范围内(out of range),返回 nil 。

3.5.5 LRANGE

 格式:LRANGE key start stop
 功能:返回列表 key 中指定区间[start, stop]内的元素,即包含两个端点。
 返回值:
可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素。
超出范围的下标值不会引起错误。
如果 start 下标比列表的最大下标还要大,那么 返回一个空列表。
如果 stop 下标比最大下标还要大,Redis将数组stop改为数组最后一个元素下标后执行。

3.5.6 LPUSHX 与 RPUSHX

 格式:LPUSHX key value 或 RPUSHX key value
 功能:仅当 key 存在并且是一个列表时, 将值 value 插入到列表 key 的表头/表尾
 说明:
a. 当 key 不存在时,命令什么也不做。
b. 若执行成功,则输出表的长度。

3.5.7 LINSERT

 格式:LINSERT key BEFORE|AFTER pivot value
 功能:将值 value 插入到列表 key 当中,位于元素 pivot 之前或之后。
 返回值:
a. 当 key 不存在时, key 被视为空列表,不执行任何操作,返回 0;
b. 当 pivot 元素不存在于列表中时,不执行任何操作,返回-1;
c. 如果 key 不是列表类型,返回一个错误;
d. 如果命令执行成功,返回插入操作完成之后,列表的长度。

3.5.8 LPOP / RPOP

 格式:LPOP key [count] 或 RPOP key [count]
 功能:从列表 key 的表头/表尾移除 count 个元素,并返回移除的元素。count 默认值 1
 返回值:当 key 不存在时,返回 nil

3.5.9 BLPOP / BRPOP

 格式:BLPOP key1 [key2 …] timeout 或 BRPOP key1 [key2 …] timeout
 功能:BLPOP/BRPOP 是列表的阻塞式(blocking)弹出命令。它们是 LPOP/RPOP 命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被 BLPOP/BRPOP 命令阻塞,直到等待 timeout 超时或发现可弹出元素为止。当给定多个 key 参数时,按参数 key的先后顺序依次检查各个列表,弹出第一个非空列表的头元素。timeout 为阻塞时长,单位为秒,其值若为 0,则表示只要没有可弹出元素,则一直阻塞。
 说明:假如在指定时间内没有任何元素被弹出,则返回一个 nil 和等待时长。反之,返回一个含有两个元素的列表,第一个元素是被弹出元素所属的 key ,第二个元素是被弹出元素的值。

3.5.10 LTRIM

 格式:LTRIM key start stop
 功能:对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
 说明:
可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
当 key 不是列表类型时,返回一个错误。
如果 start 下标比列表的最大下标 end ( LLEN list 减去 1 )还要大,或者 start > stop , LTRIM 返回一个空列表,因为 LTRIM 已经将整个列表清空。
如果 stop 下标比 end 下标还要大,Redis 将 stop 的值设置为 end 。

3.5.X 应用场景

Value 为 List 类型的应用场景很多,主要是通过构建不同的数据结构来实现相应的业务功能。这里仅对这些数据结构的实现方式进行总结,不举具体的例子。

(1) 栈
通过 LPUSH + LPOP 可以实现栈数据结构效果:先进后出。通过 LPUSH 从列表左侧插入数据,通过 LPOP 从列表左侧取出数据。当然,通过 RPUSH + RPOP 也可以实现相同效果,只不过操作的是列表右侧。

(2) 队列
通过 LPUSH + RPOP 可以实现队列数据结构效果:先进先出。通过 LPUSH 从列表左侧插入数据,通过 RPOP 从列表右侧取出数据。当然,通过 RPUSH + LPOP 也可以实现相同效果,只不过操作的方向正好相反。

(3) 阻塞式消息队列
通过 lpush + brpop 可以实现阻塞式消息队列效果。作为消息生产者的客户端使用 lpush从列表左侧插入数据,作为消息消费者的多个客户端使用 brpop 阻塞式“抢占”列表尾部数据进行消费,保证了消费的负载均衡与高可用性。brpop 的 timeout 设置为 0,表示只要没有数据可弹出,就永久阻塞。

(4) 动态有限集合
通过 lpush + ltrim 可以实现有限集合。通过 lpush 从列表左侧向列表中添加数据,通过ltrim 保持集合的动态有限性。像企业的末位淘汰、学校的重点班等动态管理,都可通过这种动态有限集合来实现。当然,通过 rpush + ltrim 也可以实现相同效果,只不过操作的方向正好相反。


3.6 Set 型 Value 操作命令

Redis 存储数据的 Value 可以是一个 Set 集合,且集合中的每一个元素均 String 类型。
Set与 List 在表现上非常相似,但实质却非常不同:
a. Set底层是一个Hash表, List底层是一个无头结点的双向链表
b. 因此, Set 中的元素具有无序性与不可重复性,而 List 则具有有序性与可重复性。

3.6.1 sadd

 格式:SADD key member1 [member2 …]
 功能:将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member元素将被忽略。
 返回值:
a. 若 key 不存在,则创建一个只包含 member 元素作成员的集合, 并返回添加到集合里元素的数量。
b. 若 key 不是集合类型,返回一个错误。

3.6.2 SMEMBERS

 格式:SMEMBERS key
 功能:返回集合 key 中的所有成员。
 说明:
a. 不存在的 key 被视为空集合。
b. 若 key 中包含大量元素,则该命令可能会阻塞 Redis服务。所以生产环境中一般不使用该命令,而使用 sscan 命令代替。

3.6.3 SCARD

 格式:SCARD key
 功能:返回 Set 集合的长度
 说明:当 key 不存在时,返回 0 。

3.6.4 SISMEMBER

 格式:SISMEMBER key member

 功能:判断 member 元素是否集合 key 的成员。

 说明:
a. 如果 member 元素是集合的成员,返回 1 。
b. 如果 member 元素不是集合的成员,或 key 不存在,返回 0 。

3.6.5 SMOVE

 格式:SMOVE source destination member

 功能:将 member 元素从 source 集合移动到 destination 集合。

 说明:
a. 如果 source 集合不存在或不包含指定的 member 元素,则 SMOVE 命令不执行任何操作,仅返回 0 。
b. 当 destination 集合已经包含 member 元素时, SMOVE命令只是简单地将 source 集合中的 member 元素删除。
c. 当 source 或 destination 不是集合类型时,返回一个错误。
d. 一切正常, 则 member 元素从 source 集合中被移除,并添加到destination 集合中去,返回 1。

3.6.6 SREM

 格式:SREM key member1 [member2 …]

 功能:移除集合 key 中的一个或多个 member 元素,不存在的 member 元素会被忽略,且返回成功移除的元素个数。

 说明:当 key 不是集合类型,返回一个错误。

3.6.7 SRANDMEMBER

 格式:SRANDMEMBER key [count]

 功能:返回集合中的 count 个随机元素。count 默认值为 1。

 说明:
a. 若 count 为正数,且小于集合长度,那么返回一个包含 count 个元素的数组,数组中的元素各不相同。
b. 如果 count 大于等于集合长度,那么返回整个集合。
c. 如果count 为负数,那么返回一个包含 count 绝对值个元素的数组,但数组中的元素可能会出现重复。

3.6.8 SPOP

 格式:SPOP key [count]

 功能:移除并返回集合中的 count 个随机元素。count 必须为正数,且默认值为 1。

 说明:
a. count为0或负数时返回空
b. count合适时, 返回所有被随机删除的元素
c. 如果 count 大于等于集合长度,那么移除并返回整个集合。

3.6.9

3.7 有序集合ZSET

Redis 存储数据的 Value 可以是一个有序 Set,这个有序 Set 中的每个元素均 String 类型。有序 Set 与 Set 的不同之处是,有序 Set 中的每一个元素都有一个分值 score,Redis 会根据score 的值对集合进行由小到大的排序。其与 Set 集合要求相同,元素不能重复,但元素的score 可以重复。由于该类型的所有命令均是字母 z 开头,所以该 Set 也称为 ZSet。

3.7.1 ZADD

 格式:ZADD key score1 member1 [[score2 member2]

 功能:将一个或多个 member 元素及其 score 值加入到有序集 key 中的适当位置。

 说明:score 值可以是整数值或双精度浮点数。
a. 如果 key 不存在,则创建一个空的有序集并执行 ZADD 操作。
b. 当 key 存在但不是有序集类型时,返回一个错误。
c. 若写入的 member 值已经存在,但 score 值不同,则新的 score 值将覆盖老 score。
c. 如果命令执行成功,则返回被成功添加的新成员的数量,不包括那些被更新的、已经存在的成员。

3.7.2 ZRANGE 与 ZREVRANGE

 格式:ZRANGE key start stop [WITHSCORES] 或 ZREVRANGE key start stop [WITHSCORES]

 功能:返回有序集 key 中,指定区间内的成员。zrange 命令会按 score 值递增排序, zrevrange命令会按score递减排序。具有相同 score 值的成员按字典序/逆字典序排列。可以通过使用 WITHSCORES 选项,来让成员和它的 score 值一并返回。

 说明:
a. 可以使用负数下标,-1 表示最后一个成员,-2 表示倒数第二个成员,以此类推。超出范围的下标并不会引起错误, 处理逻辑与之前LRANGE命令一致.
b.可能会阻塞 Redis 服务。所以生产环境中如果要查询有序集合中的所有元素使用 zscan 命令代替。

3.7.3 ZRANGEBYSCORE 与 ZREVRANGEBYSCORE

 格式:ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]

 功能:返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或max )的成员。有序集成员按 score 值递增/递减次序排列。具有相同 score 值的成员按字典序/逆字典序排列。可选的 LIMIT 参数指定返回结果的数量及区间(就像 SQL 中的SELECT LIMIT offset, count ),注意当 offset 很大时,定位 offset 的操作可能需要遍历整个有序集,此过程效率可能会较低。可选的 WITHSCORES 参数决定结果集是单单返回有序集的成员,还是将有序集成员及其 score 值一起返回。

 说明:min 和 max 的取值是正负无穷大的。默认情况下,区间的取值使用闭区间 (小于等于或大于等于),也可以通过给参数前增加左括号“(”来使用可选的开区间 (小于或大于)。

3.7.15 应用场景

有序 Set 最为典型的应用场景就是排行榜,例如音乐、视频平台中根据播放量进行排序的排行榜;电商平台根据用户评价或销售量进行排序的排行榜等。将播放量作为 score,将作品 id 作为 member,将用户评价积分或销售量作为 score,将商家 id 作为 member。使用zincrby 增加排序 score,使用 zrevrange 获取 Top 前几名,使用 zrevrank 查询当前排名,使用zscore 查询当前排序 score 等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1417374.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Arm AArch64 alignment(对齐)

数据和指令必须与合适的边界保持对齐(alignment)。访问是否对齐会影响ARM核的性能,并且在将代码从早期的体系结构移植到ARMv8-A时可能会出现可移植性问题。出于性能原因,或者在移植代码时,都值得去注意下对齐问题。本文将讲述了ARMv8-A AArch…

【electron】打包问题处理

目录 项目无法在win7执行场景尝试处理 项目无法在win7执行 场景 使用electron25.0.1、electron-builder24.2.1,打出来的项目在win7系统上跑不起来,报错无法定位程序输入点DiscardVirtualMemoty于动态链接库KERNEL32.dll上。 尝试处理 通过百度发现ele…

flask框架制作前端网页作为GUI

一、语法和原理 (一)、文件目录结构 需要注意的问题:启动文件命名必须是app.py。 一个典型的Flask应用通常包含以下几个基本文件和文件夹: app.py:应用的入口文件,包含了应用的初始化和配置。 requirem…

【漏洞复现】中移铁通禹路由器弱口令漏洞

Nx01 产品简介 中移禹路由器支持宽带拨号、动态IP和静态IP三种上网模式,一般中国移动宽带的光猫都是智能光猫也就是光猫带路由器功能,中移禹路由器作为二级路由使用。 Nx02 漏洞描述 中移禹路由器存在默认口令(admin),攻击者可利用该漏洞获取敏感信息。 Nx03 产品…

用Python编写的简单双人对战五子棋游戏

本文是使用python创建的一个基于tkinter库的GUI界面,用于实现五子棋游戏。编辑器使用的是spyder,该工具。既方便做数据分析,又可以做小工具开发, 首先,导入tkinter库:import tkinter as tk,这…

Qt无边框窗口拖拽和阴影

先看下效果: 说明 自定义窗口控件的无边框,窗口事件由于没有系统自带边框,无法实现拖拽拉伸等事件的处理,一种方法就是重新重写主窗口的鼠标事件,一种时通过nativeEvent事件处理。重写事件相对繁琐,我们这里推荐nativeEvent处理。注意后续我们在做win平…

HarmonyOS4.0系统性深入开发29层叠布局

层叠布局(Stack) 概述 层叠布局(StackLayout)用于在屏幕上预留一块区域来显示组件中的元素,提供元素可以重叠的布局。层叠布局通过Stack容器组件实现位置的固定定位与层叠,容器中的子元素(子组…

maven中的version加不加SNAPSHOT的区别

我们平时开发时经常看到maven的pom.xml文件里面的包有两种 因为maven的远程仓库一般分为public(Release)和SNAPSHOT,前者代表正式版本,后者代表快照版本。 具体有什么区别呢: 举例说明,你开发了一个基础功能,打包发布…

bxCAN 主要特性

bxCAN 主要特性 ● 支持 2.0 A 及 2.0 B Active 版本 CAN 协议 ● 比特率高达 1 Mb/s ● 支持时间触发通信方案 发送 ● 三个发送邮箱 ● 可配置的发送优先级 ● SOF 发送时间戳 接收 ● 两个具有三级深度的接收 FIFO ● 可调整的筛选器组: — CAN1 和…

Execution failed for task ‘:app:compileFlutterBuildDebug‘. 解决

前言 项目场景:在Flutter项目中 或 在嵌入Flutter模块的Android原生项目; 启动场景:在Android原生端 编译 或 运行 项目时,可能出现这个异常; 异常 Build窗口并没有追踪到,引发异常代码位置,…

微信小程序Skyline在手机端不渲染的问题之一及其解决方式

问题:电脑端是skyline渲染,手机端是webview渲染?如何解? 开发者工具 当前渲染模式:Skyline 当进行预览时手机端却是: 请注意看轮播图的显示情况 请注意看轮播图的显示情况 请注意看轮播图的显示情况 从轮播图上来看,手机端是webview渲染…

[设计模式Java实现附plantuml源码~结构型]树形结构的处理——组合模式

前言: 为什么之前写过Golang 版的设计模式,还在重新写Java 版? 答:因为对于我而言,当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言,更适合用于学习设计模式。 为什么类图要附上uml 因为很…

聊聊Git合并和变基

一、 Git Merge 合并策略 1.1 Fast-Forward Merge&#xff08;快进式合并&#xff09; //在分支1下操作&#xff0c;会将分支1合并到分支2中 git merge <分支2>最简单的合并算法&#xff0c;它是在一条不分叉的两个分支之间进行合并。快进式合并是默认的合并行为&#…

【BUG】联想Y7000电池电量为0且无法充电解决方案汇总

因为最近火灾很多&#xff0c;所以昨天夜晚睡觉的时候把插线板电源关掉了&#xff0c;电脑也关机了。 各位一定要注意用电安全&#xff0c;网上的那些事情看着真的很难受qvq。 第二天早上起床的时候一看发现电脑直接没电了&#xff0c;插上电源后也是显示 你一定要冲进去啊(ू˃…

TypeScript(三) 声明变量

1.声明变量 1.1. typescript变量声明 变量是一种使用方便的占位符&#xff0c;用于引用计算机内存地址。   我们可以把变量看做存储数据的容器。   typescript变量的命名规则&#xff1a; &#xff08;1&#xff09;变量名称可以包含数字和字母。 &#xff08;2&#xff0…

flask初体验

1、定义 Flask是一个Python编写的Web 微框架,让我们可以使用Python语言快速实现一个网站或Web服务。 中文官网 2、初步上手 1、安装flask pip3 install flask 2、创建flask应用 # -*- coding = utf-8 -*- # @Time : 2024/1/28 23:02 # @Author: Frank # @File: main.py…

unity36——原神等手游常用的物理bone(弹簧)裙摆,与Cloth(布料)裙摆插件 Magica Cloth 使用教程(一)

目前我们手游开发&#xff0c;经常会遇到头发&#xff0c;双马尾&#xff0c;长裙&#xff0c;飘带等。以前我们都是在三维软件中制作骨骼后&#xff0c;自己手动K针。这样做有一些弊端&#xff0c;时间长&#xff0c;并且K帧的飘带效果没法随着游戏中角色的移动&#xff0c;旋…

HarmonyOS鸿蒙ArkTS,封装http网络请求

HarmonyOS鸿蒙ArkTS&#xff0c;封装http网络请求 前提&#xff1a; 要想使用http请求&#xff0c;系统必须要具备ohos.permission.INTERNET权限&#xff0c;在model.json5文件中的module模块下添加如下请求权限&#xff1a; 在module.json5文件中 配置 "requestPermi…

构建外卖跑腿系统:技术实现与架构设计

在当今数字化时代&#xff0c;外卖跑腿系统已成为人们生活中不可或缺的一部分。本文将探讨如何利用先进的技术和架构设计&#xff0c;开发一个高效、可靠的外卖跑腿系统。 1. 技术选型 在开发外卖跑腿系统之前&#xff0c;我们需要仔细选择适合的技术栈&#xff0c;以确保系…

HCIP复习课(三层架构)

1、ip配置 R1&#xff1a; R2&#xff1a; SW1&#xff1a; SW2: 2、vlanif配置&#xff1a; SW1&#xff1a; SW2&#xff1a; 3、ospf配置&#xff1a; R1&#xff1a; SW1&#xff1a; SW2&#xff1a; 4、vlan配置 SW1&#xff1a; SW2&#xff1a; SW3&#xff1a; SW…