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

Java-常见面试题收集(十三)

二十二 Redis

1 Redis 作用

  Redis,全称Remote Dictionary Server,即远程字典服务,是一个开源的使用ANSI C语言编写的、支持网络的、基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。它主要用于缓存数据的计算结果、页面内容、数据库查询结果等,以提高数据访问速度和响应速度,从而提升系统性能和用户体验。

  Redis具有多种应用场景,包括但不限于:
    缓存:通过缓存热点数据,减少数据库查询次数,提高访问速度。
    消息队列:实现异步处理和解耦,提高系统的可扩展性和灵活性。
    分布式锁:作为分布式锁的存储层,通过缓存锁信息和锁状态,实现分布式锁和并发控制。
    计数器:通过原子操作实现计数器的自增和自减,支持高并发的计数操作,可用于实现各种排行榜和统计功能。

  Redis支持多种数据类型,包括字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set),这使得Redis可以根据不同的场景选择合适的数据类型来实现各种功能。此外,Redis还提供持久化服务,使得数据在重启或崩溃后不会丢失,进一步增强了其作为缓存和数据库使用的可靠性。

2 Redis 的数据类型

1.String(字符串):这是 Redis 最基本的数据类型,一个 key 对应一个 value。Redis 的字符串是二进制安全的,这意味着你可以在一个字符串中存储任何数据,比如 JPEG 图片或者序列化的对象。2.Hash(哈希):Redis hash 是一个键值对集合。Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。3.List(列表):Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。4.Set(集合):Redis 的集合是 string 类型元素的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。5.Zset(有序集合):Redis 有序集合和集合一样也是 string 类型元素的集合,并且集合成员是唯一的。不同的是每个元素都会关联一个 double 类型的分数。Redis 正是通过分数来为集合中的元素从小到到大进行从小到大的排序。6.Streams(流):Redis StreamsRedis 5.0 版本引入的新数据类型,用于实现消息队列系统。Streams 是一个包含零个或多个消息的可持久化、可复制的日志。7.Bitmaps(位图):虽然位图不是 Redis 的一种独立数据类型,但 Redis 提供了位操作命令,允许用户将字符串键当作位数组(bit array)或位图(bitmap)来处理,实现一些高效的位运算操作。8.HyperLogLog(超对数日志):HyperLogLogRedis 的一种基数统计数据类型,它提供了在允许一定误差的情况下,使用极少的内存空间来统计大量数据的基数的功能。9.Geospatial(地理空间):Redis 的地理空间索引用于地理位置信息的查询和计算,比如获取某个位置附近的其它位置等。虽然 Redis 支持多种数据类型,但每个 key 只能对应一种数据类型。也就是说,你不能将一个 key 同时设置为字符串和哈希。此外,Redis 的数据类型并不是固定不变的,随着版本的更新,Redis 可能会引入新的数据类型或改进现有数据类型的功能。

3 Redis 如何实现消息队列功能

  1.基于 List 实现的队列Redis 的 List 数据结构可以很方便地用来实现队列。List 提供了从头部插入(LPUSH)和从尾部弹出(RPOP)或者从尾部插入(RPUSH)和从头部弹出(LPOP)元素的原语操作,这些操作都是原子性的,因此可以很容易地实现一个线程安全的队列。
  生产者:使用 LPUSH 或 RPUSH 将消息放入队列。
  消费者:使用 RPOP 或 LPOP 从队列中取出消息。
  如果需要处理多个消费者竞争同一个消息的情况,可以使用 BLPOP 或 BRPOP 命令,这些命令在队列为空时会阻塞,直到有消息可用。

  2.发布/订阅模型: Pub/Sub,Redis 的发布/订阅模式允许发送者(发布者)发送消息到频道,而接收者(订阅者)可以订阅一个或多个频道以接收消息。
  发布者:使用 PUBLISH 命令将消息发布到指定的频道。
  订阅者:使用 SUBSCRIBE 命令订阅一个或多个频道,并使用 PSUBSCRIBE 命令订阅匹配特定模式的频道。当有消息发布到这些频道时,订阅者会收到消息。
  需要注意的是,发布/订阅模式中的消息是即时发送的,如果订阅者当前不在线,那么它就不会收到这些消息。因此,这种模式更适用于实时通信或事件通知等场景。

  3.Redis 5.0 新增的队列: Stream,Redis 5.0 引入了 Stream 数据类型,它是一个持久化的、可靠的消息队列。Stream 提供了消息的持久化存储,并且支持消费者组的概念,使得多个消费者可以协作处理消息队列。
  生产者:使用 XADD 命令将消息添加到 Stream 中。每个消息都有一个唯一的 ID,并且可以按照时间顺序排列。
消费者组:消费者可以加入一个或多个消费者组,并从 Stream 中读取消息。每个消费者组都有一个或多个消费者,它们共同处理 Stream 中的消息。
  消息确认:消费者处理完消息后,需要发送一个确认信号(XACK 命令),以告知 Stream 该消息已经被处理。如果消费者在处理消息时崩溃,那么未确认的消息可以被其他消费者重新处理。
  Stream 还提供了多种查询和监控功能,使得开发者可以更方便地管理和维护消息队列。

  基于 List 的实现简单直观,适用于简单的队列需求;发布/订阅模型适用于实时通信和事件通知等场景;而 Stream 则提供了更强大和灵活的消息队列功能,适用于复杂的业务场景。

4 Redis 的持久化机制

  1.RDB 持久化:RDB 持久化方式能够在指定的时间间隔能对你的数据进行快照存储。 在默认情况下, Redis 将数据库快照保存在名字为 dump.rdb 的二进制文件中。 在Redis 运行时, RDB 程序将当前内存中的数据库快照保存到磁盘文件中, 在Redis 重启动时, RDB 程序可以通过载入 RDB 文件来还原数据库的状态。

# RDB 自动持久化规则
# 当 900 秒内有至少有 1 个键被改动时,自动进行数据集保存操作
save 900 1
# 当 300 秒内有至少有 10 个键被改动时,自动进行数据集保存操作
save 300 10
# 当 60 秒内有至少有 10000 个键被改动时,自动进行数据集保存操作
save 60 10000

  RDB 的优点:与 AOF 相比,在恢复大的数据集的时候,RDB 方式会更快一些。与 AOF 相比,文件比较小。
  RDB 的缺点:但有可能会产生长时间的数据丢失。

  2.AOF 持久化:Redis 在执行命令的时候,按照配置的策略,定期把命令原本的语句记录一个appendonly.aof 的文件当中,然后通过 fsync 策略,将命令执行后的数据持久化到磁盘中」(不包括读命令)

# AOF 持久化的三种策略
always: 每次有新命令追加到 AOF 文件时就执行一次 fsync :非常慢,也非常安全everysec: 每秒 fsync 一次:足够快,并且在故障时只会丢失 1 秒钟的数据。推荐(并且也是默认)的措施为每秒 fsync 一次, 这种 fsync 策略可以兼顾速度和安全性。no: 从不 fsync :将数据交给操作系统来处理,由操作系统来决定什么时候同步数据。更快,也更不安全的选择。

  AOF 的优点:AOF 可以[更好的保护数据不丢失],一般 AOF 会以每隔 1 秒,通过后台一个线程去执行 fsync 操作,如果 Redis 进程挂了,最多丢失 1 秒的数据AOF 是将命令直接追加到文件末尾的,顺序写,写入性能非常高AOF 日志文件的命令通过非常可读的方式进行记录,这个非常适合做灾难性的误删除紧急回复,如果某人不小心用 flushall 命令清空了所有数据,那么可以将日志文件中的 flushall 删除,然后进行恢复.
  AOF 的缺点:对于同一份数据源来说,一般情况下,AOF 文件比 RDB 数据快照要大由于.aof 的每次命令都会写入,相对于 RDB 来说需要消耗性能也就更多数据恢复比较慢,不适合做冷备

  3.混合持久化:重启 Redis 时,我们很少使用 rdb 来恢复内存状态,因为会丢失大量数据。我们通常使用 AOF 日志重写,
但是 AOF 重写性能相对 rdb 来说要慢很多,这样在 Redis 实例很大的情况下,启动需要花费很长的时间。Redis 4.0 为了解决这个问题,带来了一个新的持久化选项——混合持久化。
  AOF 在进行文件重写(aof 文件里可能有太多没用指令,所以 aof 会定期根据内存的最新数据生成 aof 文件)时将重写这一刻之前的内存 rdb 快照文件的内容和增量的 AOF 修改内存数据的命令日志文件存在一起,都写入新的 aof 文件,新的文件一开始不叫 appendonly.aof,等到重写完新的AOF 文件才会进行改名,原子的覆盖原有的 AOF 文件,完成新旧两个 AOF 文件的替换。

# 混合持久化配置
aof-use-rdb-preamble yes

5 Redis 过期键删除策略

  对于过期键一般有三种删除策略
  定时删除:在设置键的过期时间的同时,创建一个定时器(timer),让定时器在键的过期时间来临时,立即执行对键的删除操作;
  惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键;如果没有过期,那就返回该键;
  定期删除:每隔一段时间,程序就对数据库进行一次检查,删除里面的过期键。至于删除多少过期键,以及要检查多少个数据库,则由算法决定。

  三种策略的优缺比较:

  定时删除策略对内存是最友好的:通过使用定时器,定时删除策略可以保证过期键会尽可能快地被删除,并释放过期键所占用的内存;但另一方面,定时删除策略的缺点是,他对 CPU 是最不友好的:在过期键比较多的情况下,删除过期键这一行为可能会占用相当一部分 CPU 时间,在内存不紧张但是 CPU 时间非常紧张的情况下,将 CPU 时间用在删除和当前任务无关的过期键上,无疑会对服务器的响应时间和吞吐量造成影响;

  惰性删除策略对 CPU 时间来说是最友好的:程序只会在取出键时才对键进行过期检查,这可以保证删除过期键的操作只会在非做不可的情况下进行;惰性删除策略的缺点是,它对内存是最不友好的:如果一个键已经过期,而这个键又仍然保留在数据库中,那么只要这个过期键不被删除,它所占用的内存就不会释放;定时删除占用太多 CPU 时间,影响服务器的响应时间和吞吐量;惰性删除浪费太多内存,有内存泄漏的危险。

  定期删除策略是前两种策略的一种整合和折中:定期删除策略每隔一段时间执行一次删除过期键操作,并通过限制删除操作执行的时长和频率来减少删除操作对 CPU 时间的影响;通过定期删除过期键,定期删除策略有效地减少了因为过期键而带来的内存浪费;定期删除策略的难点是确定删除操作执行的时长和频率。

  Redis 的过期键删除策略:Redis 服务器实际使用的是惰性删除和定期删除两种策略。

6 Redis 八种淘汰策略

1.noeviction(默认策略):当内存不足以容纳新写入数据时,新写入操作会报错。这个策略会保证不会删除任何数据,但是会拒绝所有的写入请求并返回错误给客户端。
2.volatile-lru:针对设置了过期时间的key,使用LRU(Least Recently Used,最近最少使用)算法进行淘汰。这意味着最久未使用的key会被优先删除。
3.volatile-lfu:同样针对设置了过期时间的key,使用LFU(Least Frequently Used,最不经常使用)算法进行淘汰。LFU算法会淘汰那些访问频率最低的key。
4.volatile-ttl:这个策略会淘汰那些设置了过期时间且剩余生存时间(TTL)最短的key。
5.volatile-random:随机淘汰设置了过期时间的key。
6.allkeys-lru:使用LRU算法淘汰所有key中最近最少使用的那些数据。这个策略不区分key是否设置了过期时间。
7.allkeys-lfu:使用LFU算法淘汰所有key中访问频率最低的那些数据。同样,这个策略也不区分key是否设置了过期时间。
8.allkeys-random:加入键的时候如果过限,从所有 key 随机删除

相关文章:

Java-常见面试题收集(十三)

二十二 Redis 1 Redis 作用 Redis,全称Remote Dictionary Server,即远程字典服务,是一个开源的使用ANSI C语言编写的、支持网络的、基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。它主要用于缓存数据的计算…...

第二证券策略:股指预计维持震荡格局 关注汽车、工程机械等板块

第二证券指出,指数自今年2月份阶段低点反弹以来,3月份持续高位整理。进入4月份之后面对年报和一季报的双重财报发表期,预计指数短期保持高位整理概率比较大。前期缺乏成绩支撑的概念股或有回落的危险,主张重视成绩稳定、估值低、分…...

hcia datacom课程学习(6):路由与路由表基础

1.路由的作用 不同网段的设备互相通信需要具有路由功能的设备进行转发 具有路由功能的设备不一定是路由器,交换机可以有路由功能,同样的,路由器也可以有交换功能,像家里常用的路由器就是集路由功能和交换功能于一体的 2.路由相…...

AI PC元年,华为的一张航海图、一艘渡轮和一张船票

今天,从学术研究者到产业投资者,无不认为大模型掀起了一场人工智能的完美风暴。 所谓“完美风暴”,指的是一项新技术的各个要素,以新的方式互相影响、彼此加强,组合在一起形成了摧枯拉朽般的力量。 而我们每个人&#…...

NAT技术

网络技术深似海呀,一段时间不用又忘。 是什么 NAT技术是网络防火墙技术的一部分,可以作用在linux防火墙或者设备防火墙,NAT技术可以实现地址和端口的转换,主要还是为了网络连通性。 作用 存在以下三个IP,A(10.234.…...

新能源汽车“价格战”之后,充电桩主板市场将会怎样?

2024年2月底,国内新能源汽车市场开启了一场前所未有的“价格战”↓ 比亚迪率先抛出“王炸”车型——秦PLUS荣耀版和驱逐舰05荣耀版,起售价低至7.98万元,打响了价格战的“第一枪”,引爆了平静的汽车市场。 “电比油低”就此拉开序…...

appium driver install uiautomator2 安装失败

报错 Installing ‘uiautomator2’ using NPM install spec ‘appium-uiautomator2-driver’ Error: Encountered an error when installing package: npm command ‘install --save-dev --no-progress --no-audit --omitpeer --save-exact --global-style --no-package-lock…...

学浪已购买视频怎么下载到本地?

许多学习者在学浪购买了丰富的课程,然而,一些课程存在时间限制,使得学习者希望将其下载并永久保存。在这里,我们将介绍一款名为小浪助手的工具,它能够帮助你轻松将学浪已购买的视频下载到本地,让学习变得更…...

k8s-pod设置执行优先级

Pod的优先级管理是Kubernetes调度中的一个重要特性,通过PriorityClass(优先级类)的设置,我们可以为Pod指定不同的优先级,从而在资源有限的情况下更精细地调整调度顺序 什么是PriorityClass? PriorityClass是…...

const修饰指针

const修饰指针 常量指针 特点为指针的指向可以改,但是指针指向的值不可以修改 int a 10; int b 20; const int *p &a; *p 20; //错误,指针的指向的值不可更改 p &b; //正确 指针常量 特点是指针的指向不可以改,指针指向的值…...

php关于序列化r的指向

在PHP中,序列化字符串的索引是根据序列化过程中值的出现顺序来确定的。每个值(包括数组的键和值)在序列化字符串中都会被赋予一个顺序索引。为了理解这个顺序,我们需要知道以下几点: 序列化时,数组的键和值…...

从0到1实现RPC | 11 丰富测试案例

测试案例主要针对服务消费者consumer,复杂逻辑都在consumer端。 常规int类型,返回User对象 参数类型转换,主要实现逻辑都在TypeUtils工具类中。 测试方法重载,同名方法,参数不同 方法签名的实现,主要逻辑…...

在前端开发中用到了哪些设计模式?

在前端开发中用到了哪些设计模式? 1.单例模式2.观察者模式3.工厂模式4.适配器模式5.装饰器模式6.命令模式7.迭代器模式8.组合模式9.策略模式10.发布订阅模式 1.单例模式 确保一个类只有一个实例,提供一个全局访问点,vue就是一个单例模式&…...

ES6 的解构赋值

解构赋值(Destructuring assignment)是一种方便快捷的方式,可以从对象或数组中提取数据,并将数据赋值给变量。解构赋值是ES6中一项强大且常用的特性. 1. 基本数组解构 首先,让我们看看如何对数组进行解构赋值。假设我…...

蓝桥杯物联网竞赛_STM32L071KBU6_全部工程及国赛省赛真题及代码

包含stm32L071kbu6全部实验工程、源码、原理图、官方提供参考代码及国、省赛真题及代码 链接:https://pan.baidu.com/s/1pXnsMHE0t4RLCeluFhFpAg?pwdq497 提取码:q497...

关于UCG游戏平台的一些思考

UCG游戏平台,全称User Generated Content,即用户生成内容。它涵盖了所有玩家可以自主编辑的部分,包含并不限于换装、捏脸、关卡摆放等内容。 UCG概念在最近又火了起来,但这个模式出现的并不早。早在10多年前,war3编辑器…...

一起学习python——基础篇(20)

前言,之前经常从网上找一些免费的接口来测试,有点受制于人的感觉。想了想还不如直接写一个接口,这样方便自己测试。自己想返回什么格式就返回什么样子,不用担心服务报错,因为自己就可以完全掌控。然后宿舍二哥告诉我py…...

云服务器安装Mysql、MariaDB、Redis、tomcat

前置工作 进入根目录 cd / 创建java文件夹 mkdir java 进入java文件夹 cd java 上传压缩包 rz 压缩包 Mysql 1.下载并安装MySQL官方的 Yum Repository wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm rpm -ivh mysql-community-release-el7-5.noa…...

Android笔记--MediaCodec(二)

这一节主要了解MediaCodec处理音频,MediaCodec直译媒体解码器,用于访问媒体编解码器,即编码器/解码器组件,它是 Android 多媒体支持基础设施的一部分;从广义上讲,编解码器处理输入数据以生成输出数据。它异…...

【Java探索之旅】方法重载 递归

🎥 屿小夏 : 个人主页 🔥个人专栏 : Java编程秘籍 🌄 莫道桑榆晚,为霞尚满天! 文章目录 📑前言一、方法重载1.1 为什么要有方法重载1.2 方法重载的概念与使用1.3 方法签名 二、递归2…...

多输入多输出 | Matlab实现XGboost多输入多输出预测

多输入多输出 | Matlab实现XGboost多输入多输出预测 目录 多输入多输出 | Matlab实现XGboost多输入多输出预测预测效果基本介绍程序设计往期精彩参考资料 预测效果 基本介绍 Matlab实现XGboost多输入多输出预测 1.data为数据集,10个输入特征,3个输出变量…...

【设计模式】3、builder 建造者模式

文章目录 三、builder 模式(生成器)3.1 build 房屋3.1.1 builder.go3.1.2 director.go3.1.3 director_test.go3.1.4 house.go3.1.5 igloo_builder.go3.1.6 normal_builder.go3.1.7 测试 3.2 option3.2.1 pool_test.go3.3.2 pool.go3.3.3 option.go 3.3 自…...

使用ROCm的HIP API向量加法程序

一、向量加法程序 Radeon Open Compute (ROCm) 是一个开源平台,用于加速高性能计算 (HPC) 和机器学习应用程序。它支持包括GPUs在内的多种硬件,并提供HIP (Heterogeneous-compute Interface for Portability) 作为CUDA代码的便捷转换工具。为了提供一个…...

Vue3---基础7(Props)

props&#xff0c;用于给子组件传递父组件的值的方法 代码示例&#xff1a; 父组件 <template><Text1 :list"personList"/> </template><script lang"ts" setup namae"App">import Text1 from ./components/text2.vu…...

第一节:什么是操作系统

什么是操作系统 一、一台计算机的组成部分1、计算机能干啥2、谈谈计算机硬件 二、什么是操作系统三、学习操作系统的层次 一、一台计算机的组成部分 如下图所示&#xff1a; 这就是就是构成一台计算机的组成部分 1、计算机能干啥 ∙ \bullet ∙计算机是我们专业吃饭的家伙&a…...

Day:007(1) | Python爬虫:高效数据抓取的编程技术(scrapy框架使用)

Scrapy的介绍 Scrapy 是一个用于抓取网站和提取结构化数据的应用程序框架&#xff0c;可用于各种有用的应用程序&#xff0c;如数据挖掘、信息处理或历史存档。 尽管 Scrapy 最初是为网络抓取而设计的&#xff0c;但它也可用于使用API提取数据或用作通用网络爬虫。 Scrapy的优势…...

Echarts使用dataTool写可自定义横坐标的盒须图(箱线图)

在vue2中的完整盒须图组件代码 可自适应浏览器窗体变化&#xff0c;可自定义横坐标&#xff0c;无需写箱线图数据处理逻辑。dataTool是echarts自带的&#xff0c;无需额外安装&#xff0c;只要引入。 <template><span><div ref"BoxPlotChart" id&qu…...

SpringBoot编写一个SpringTask定时任务的方法

1&#xff0c;在启动类上添加注解 EnableScheduling//开启定时任务调度 2&#xff0c; 任务&#xff08;方法&#xff09;上也要添加注解&#xff1a; Scheduled(cron " 0 * * * * ? ") //每分钟执行一次 域&#xff1a; 秒 分 时 日 月 周 &#xff08;年&#…...

【Qt编译】ARM环境 Qt5.14.2-QtWebEngine库编译 (完整版)

ARM 编译Qt5.14.2源码 1.下载源码 下载Qt5.14.2源代码&#xff08;可根据自己的需求下载不同版本&#xff09; 下载网站&#xff1a;https://download.qt.io/new_archive/qt/5.14/5.14.2/single/ 2.相关依赖(如果需要的话) 先参考官方文档的需求进行安装&#xff1a; 官方…...

vue简单使用二(循环)

目录 属性绑定 if判断&#xff1a; for循环&#xff1a; 属性绑定 代码的形式来说明 三元表达式的写法&#xff1a; if判断&#xff1a; for循环&#xff1a; 完整代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"…...

做视频网站视频/电脑优化工具

Linux指令篇:文件打印--lpd(转)名称&#xff1a; lpd使用权限&#xff1a; 所有使用者使用方式&#xff1a;lpd [-l] [#port]lpd 是一个常驻的打印机管理程序&#xff0c;它会根据 /etc/printcap 的内容来管理本地或远端的打印机。/etc/printcap 中定义的每一个打印机必须在 /v…...

常州网站建设公司方案/怎样弄一个自己的平台

在开发中免不了和他人一起团队协作提交代码&#xff0c;为了防止大家每次提交代码时&#xff0c;git commit -m ’ 的提交信息不明所以&#xff0c;所以Angular 团队提出了 Git 约定式提交。这只是一种约定规范&#xff0c;并不是强制要求&#xff0c;具体可参考&#xff1a;An…...

做网站资源/ 今日头条

为什么需要技术KPI 在业务技术团队&#xff0c;有一个不好的趋势&#xff0c;就是团队越来越业务&#xff0c;越来越没有技术味道。每个人都在谈业务&#xff0c;技术大会上在谈业务&#xff0c;周会上在聊业务&#xff0c;周报里写的是业务项目...... 唯独少被谈及的是技术本身…...

烟台网站建设推荐企汇互联见效付款/在线网站建设平台

文章目录题目原文Input Specification:Output Specification:Sample Input:Sample Output:题目大意:强烈推荐,刷PTA的朋友都认识一下柳神–PTA解法大佬本文由参考于柳神博客写成 柳神的CSDN博客,这个可以搜索文章 柳神的个人博客,这个没有广告,但是不能搜索 PS 题目原文 T…...

武进网站建设价格/技术教程优化搜索引擎整站

有时候数组要转为对象操作&#xff0c;用对象的指向操作符&#xff0c;有两种方法 方法一&#xff1a; $arr[a>10,b>100,c>Hello];$obj(Object)$arr;echo output:.$obj->c;方法二&#xff1a;$arr[a>10,b>100,c>Hello];$arr0 json_encode($arr);$arr1 j…...

淄博哪里有做网站的/seo工具包

回想Engineer类的数据成员&#xff0c;有眼镜、背包等。某Engineer的眼镜、背包&#xff0c;是Glass、Bag类的对象。类中的数据成员&#xff0c;其类型可以是简单类型&#xff0c;也可以是类。通过这种方式&#xff0c;将某些类组合到另外的类中&#xff0c;当作其中的一个“部…...