基于 Netty + SpringBoot + Vue 的高并发实时聊天系统设计与实现
一、系统架构设计
1.1 整体架构图
+------------------+ WebSocket (wss) +------------------+ Netty TCP +------------------+
| Vue前端 | <-------------------------> | SpringBoot网关 | <------------------> | Netty服务集群 |
| (WebSocket客户端)| 消息加密/心跳 | (WebSocket适配层) | 长连接 | (业务逻辑处理) |
+------------------+ 心跳检测 +------------------+ 管理 +------------------+↓+------------------+| Redis集群 || (在线状态同步) |+------------------+
1.2 技术选型解析
• SpringBoot:提供REST API网关、用户认证、消息路由
• Netty:核心通信框架,处理10W+级长连接,支持自定义协议
• Vue:实现实时消息推送的SPA前端,使用WebSocket API通信
• Redis:存储在线状态、离线消息、分布式Session
• Protobuf:二进制序列化协议,提升传输效率
二、核心原理剖析
2.1 WebSocket协议优势
• 双向全双工通信,避免了HTTP轮询的开销
• 减少TCP连接次数,建立一次连接即可持续通信
• 支持文本/二进制数据传输,适合JSON/Protobuf格式
2.2 Netty高性能架构
线程模型
+------------------+ +------------------+ +------------------+
| BossGroup | | WorkerGroup | | SubReactor |
| (Acceptor线程) | <---> | (I/O处理线程) | <---> | (业务处理线程) |
+------------------+ +------------------+ +------------------+
• BossGroup:处理TCP三次握手,建立连接
• WorkerGroup:处理Channel读写事件
• SubReactor:多线程处理业务逻辑,避免阻塞
关键组件
• ChannelPipeline:消息处理流水线,包含编解码器、业务处理器
• EventLoop:单线程处理多个Channel,保证IO操作的原子性
• MemoryManager:内存池化技术,减少GC压力
三、实战开发指南
3.1 后端实现(SpringBoot + Netty)
3.1.1 依赖配置
<dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.86.Final</version>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
3.1.2 Netty服务端核心代码
public class ChatServer {private final int port;public ChatServer(int port) {this.port = port;}public void run() throws InterruptedException {EventLoopGroup bossGroup = new NioEventLoopGroup(2);EventLoopGroup workerGroup = new NioEventLoopGroup();try {ServerBootstrap b = new ServerBootstrap();b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class).childHandler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) {ch.pipeline().addLast(new HttpServerCodec()) // HTTP编解码.addLast(new HttpObjectAggregator(65536)) // HTTP聚合.addLast(new WebSocketServerProtocolHandler("/ws")) // WebSocket协议升级.addLast(new ProtobufDecoder(ChatMessage.getDefaultInstance())) // Protobuf解码.addLast(new ChatServerHandler()); // 自定义业务处理器}});ChannelFuture f = b.bind(port).sync();f.channel().closeFuture().sync();} finally {bossGroup.shutdownGracefully();workerGroup.shutdownGracefully();}}
}
3.1.3 消息处理器实现
public class ChatServerHandler extends SimpleChannelInboundHandler<ChatMessage> {private static final AttributeKey<String> USER_ID = AttributeKey.valueOf("userId");@Overrideprotected void channelRead0(ChannelHandlerContext ctx, ChatMessage msg) {String userId = ctx.channel().attr(USER_ID).get();RedisUtils.setOnlineStatus(userId, ctx.channel());// 消息路由:广播给所有在线用户broadcastMessage(msg);}private void broadcastMessage(ChatMessage message) {ChannelGroup channels = ChatServer.getChannelGroup();channels.writeAndFlush(message).addListener(future -> {if (!future.isSuccess()) {System.err.println("消息发送失败: " + future.cause());}});}
}
3.2 前端实现(Vue3 + WebSocket)
3.2.1 WebSocket连接管理
// src/utils/websocket.js
class WebSocketClient {constructor(url) {this.url = url;this.ws = null;this.reconnectTimer = null;}connect() {return new Promise((resolve, reject) => {this.ws = new WebSocket(this.url);this.ws.onopen = () => {console.log('WebSocket连接成功');resolve();};this.ws.onmessage = (event) => {const message = JSON.parse(event.data);this.handleMessage(message);};this.ws.onclose = () => {console.log('连接关闭,尝试重连...');this.reconnect();};});}reconnect() {this.reconnectTimer = setInterval(() => {console.log('尝试重新连接...');this.connect().catch(err => console.error(err));}, 5000);}
}
3.2.2 Vue组件集成
<template><div class="chat-container"><div v-for="msg in messages" :key="msg.id" class="message">{{ msg.sender }}: {{ msg.content }}</div><input v-model="newMessage" @keyup.enter="sendMessage" /></div>
</template><script setup>
import { ref, onMounted } from 'vue';
import WebSocketClient from '@/utils/websocket';const wsClient = new WebSocketClient('wss://api.example.com/ws');
const messages = ref([]);
const newMessage = ref('');onMounted(async () => {await wsClient.connect();wsClient.onMessage = (data) => {messages.value.push(data);};
});const sendMessage = () => {if (newMessage.value.trim()) {wsClient.send(JSON.stringify({type: 'CHAT',content: newMessage.value}));newMessage.value = '';}
};
</script>
四、性能测试报告
4.1 测试环境
组件 | 配置 |
---|---|
服务器 | 4核8G CentOS 7.9 |
Netty版本 | 4.1.86.Final |
并发用户数 | 50,000 |
消息大小 | 1KB JSON |
测试工具 | JMeter 5.6 + WebSocketSampler |
4.2 测试结果
指标 | 数值 |
---|---|
最大连接数 | 85,000+ |
吞吐量 (msg/s) | 122,300 |
平均延迟 | 38ms |
CPU利用率峰值 | 68% |
内存消耗 | 1.2GB/10万连接 |
4.3 性能优化措施
- 内存优化:启用Netty内存池,减少GC频率至每分钟3次
- 线程调优:根据CPU核数动态调整EventLoopGroup线程数
- 协议优化:使用Protobuf替代JSON,消息体积减少62%
- 连接保活:配置心跳机制(读超时60s,写超时30s)
五、扩展功能实现
5.1 消息可靠性保证
// 消息持久化到MySQL
@Async
public void saveMessage(ChatMessage message) {chatMessageRepository.save(message);
}// 离线消息存储到Redis
public void storeOfflineMessage(String userId, ChatMessage message) {redisTemplate.opsForList().rightPush("offline:"+userId, JSON.toJSONString(message));
}
5.2 安全增强
// SSL/TLS配置
SslContext sslContext = SslContextBuilder.forServer(new File("server.crt"), new File("server.key")
).build();// 消息鉴权拦截器
public class AuthHandler extends ChannelInboundHandlerAdapter {@Overridepublic void channelActive(ChannelHandlerContext ctx) {if (!validateToken(ctx)) {ctx.close();}}
}
六、总结与展望
本文实现的系统在5万并发下仍能保持亚秒级响应,验证了Netty在高并发场景下的可靠性。未来可扩展方向:
- 引入MQTT协议支持物联网设备接入
- 使用gRPC-Web实现双向流式通信
- 集成WebSocket网关集群(如Spring Cloud Gateway)
- 实现消息轨迹追踪(ELK日志分析)
相关文章:
基于 Netty + SpringBoot + Vue 的高并发实时聊天系统设计与实现
一、系统架构设计 1.1 整体架构图 ------------------ WebSocket (wss) ------------------ Netty TCP ------------------ | Vue前端 | <-------------------------> | SpringBoot网关 | <------------------> | Netty服务集…...
根据当前日期计算并选取上一个月和上一个季度的日期范围,用于日期控件的快捷选取功能
代码如下: <el-date-picker v-model"value" type"monthrange" align"right" unlink-panels range-separator"至"start-placeholder"开始月份" end-placeholder"结束月份" :picker-options"pic…...
Spring Boot 使用 jasypt配置明文密码加密
引入依赖 <dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.4</version> </dependency>添加配置 jasypt:encryptor:password: pssw0rd&Hubt2ec…...
ubuntu下docker安装mongodb-支持单副本集
1.mogodb支持事务的前提 1) MongoDB 版本:确保 MongoDB 版本大于或等于 4.0,因为事务支持是在 4.0 版本中引入的。 2) 副本集配置:MongoDB 必须以副本集(Replica Set)模式运行,即使是单节点副本集&#x…...
科技赋能,开启现代健康养生新潮流
在科技与生活深度融合的当下,健康养生也迎来了全新的打开方式。无需传统医学的介入,借助现代科学与智能设备,我们能以更高效、精准的方式守护健康。 饮食管理步入精准化时代。利用手机上的营养计算 APP,录入每日饮食࿰…...
《安徽日报》聚焦珈和科技AI创新:智慧虫情测报护航夏粮提质丰产
5月7日,《安徽日报》焦点新闻版块以《高科技助力田管,确保夏粮丰收——为4300多万亩小麦守好防线》为题,深度报道了农业科技在夏粮生产中的关键作用。其中,珈和科技自主研发的AI虫情测报一体机作为绿色防控、农业智慧化的标杆被重…...
企业级 Go 多版本环境部署指南-Ubuntu CentOS Rocky全兼容实践20250520
🛠️ 企业级 Go 多版本环境部署指南-Ubuntu / CentOS / Rocky 全兼容实践 兼顾 多版本管理、安全合规、最小权限原则与 CI/CD 可复现性,本指南以 Go 官方 toolchain 为主,结合 asdf 实现跨语言统一管理,并剔除已过时的 GVM。支持 …...
MCP 协议传输机制大变身:抛弃 SSE,投入 Streamable HTTP 的怀抱
在技术的江湖里,变革的浪潮总是一波接着一波。最近,模型上下文协议(MCP)的传输机制就搞出了大动静,决定和传统的服务器发送事件(SSE)说拜拜,转身拥抱 Streamable HTTP,这…...
Windows 上配置 Docker,Docker 的基本原理和用途,以及如何在 Docker 中运行程序
Windows 系统上的 Docker 安装与使用指南 1. Windows 上配置 Docker 检查系统要求:使用 64 位 Windows 10/11,BIOS 已启用硬件虚拟化(VT-x/AMD-V)。Windows 版本最好更新到 2004 及以上(内部版本19041)&am…...
CBCharacteristic:是「特征」还是「数据通道」?
目录 名词困惑:两种中文译法的由来官方定义 & 开发者视角乐高类比:文件夹与文件智能手表实例:Characteristic 长什么样?iOS 代码实战:读 / 写 / 订阅小结 & Best Practice 1. 名词困惑:为什么有两…...
【JavaEE】多线程
线程 在Java中,鼓励多线程编程。进程可以满足并发编程,但是效率不高(创建、销毁、调度时间都比较长,这些都消耗在申请资源上了),而线程就不一样。 线程也叫“轻量级进程”,创建、销毁、调度都更…...
docker- Harbor 配置 HTTPS 协议的私有镜像仓库
Harbor通过配置 HTTPS 协议,可以确保镜像传输的安全性,防止数据被窃取或篡改。本文将详细介绍如何基于 Harbor 配置 HTTPS 协议的私有镜像仓库。 1.生成自建ca证书 [rootdocker01 ~]# mkdir -p /liux/softwares/harbor/certs/custom/{ca,server,client…...
[SpringBoot]Spring MVC(5.0)----留言板
Spring留言板实现 预期结果 可以发布并显示点击提交后,显示并清除输入框并且再次刷新后,不会清除下面的缓存 约定前后端交互接口 Ⅰ 发布留言 url : /message/publish . param(参数) : from,to,say . return : true / false . Ⅱ 查询留言 url : /messag…...
Jules 从私有预览阶段推向全球公测
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
vLLM框架高效原因分析
vLLM框架在模型推理中以高效出名,主要基于以下核心原理和技术优化,这些设计使其在处理大语言模型时显著提升性能: 一、PagedAttention:动态显存管理技术 vLLM的核心创新在于PagedAttention,灵感源自操作系统的虚拟内存…...
【Git】常用命令大全
以下是 Git 的常用命令大全,分为几个常见类别,便于理解和使用: 1. 初始化与克隆 初始化本地仓库:git init克隆远程仓库到本地:git clone <repository_url> 2. 添加与提交 添加指定文件到暂存区:git…...
pycharm无需科学上网工具下载插件的解决方案
以下是两种无需科学上网即可下载 PyCharm 插件的解决思路: 方法 1:设置 PyCharm 代理 打开 PyCharm选择菜单:File → Settings → Appearance & Behavior → System Settings → HTTP Proxy在代理设置中进行如下配置: 代理地…...
学习threejs,使用Physijs物理引擎,使用DOFConstraint自由度约束,模拟小车移动
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️Physijs 物理引擎1.1.1 ☘️…...
仓颉开发语言入门教程:常见UI组件介绍和一些问题踩坑
幽蓝君发现一个问题,仓颉开发语言距离发布马上一年了,一些知名App已经使用仓颉开发了许多功能,但是网络上关于仓颉开发语言的教程少之又少,系统性的教程更是没有,仓颉官网的文档也远远不如ArkTS详尽。 现阶段对于想学…...
[Git] 初识 Git 与安装入门
告别文件噩梦:初识 Git 与安装入门 嘿,朋友!不知道你是不是也遇到过这样的情况:你在写一份重要的文档、报告,或者更常见的,一段代码时,为了安全起见,怕改错了回不去,或者…...
海康威视摄像头C#开发指南:从SDK对接到安全增强与高并发优化
一、海康威视SDK核心对接流程 1. 开发环境准备 官方SDK获取:从海康开放平台下载最新版SDK(如HCNetSDK.dll、PlayCtrl.dll)。依赖项安装:确保C运行库(如vcredist_x86.exe)与S…...
大语言模型 14 - Manus 超强智能体 开源版本 OpenManus 上手指南
写在前面 Manus 是由中国初创公司 Monica.im 于 2025 年 3 月推出的全球首款通用型 AI 智能体(AI Agent),旨在实现“知行合一”,即不仅具备强大的语言理解和推理能力,还能自主执行复杂任务,直接交付完整成…...
使用 LibreOffice 实现各种文档格式转换(支持任何开发语言调用 和 Linux + Windows 环境)[全网首发,保姆级教程,建议收藏]
以下能帮助你可以使用任何开发语言,在任何平台都能使用 LibreOffice 实现 Word、Excel、PPT 等文档的自动转换,目前展示在 ASP.NET Core 中为 PDF的实战案例,其他的文档格式转换逻辑同理。 📦 1. 安装 LibreOffice 🐧…...
CentOS Stream 9 中部署 MySQL 8.0 MGR(MySQL Group Replication)一主两从高可用集群
🐇明明跟你说过:个人主页 🏅个人专栏:《MySQL技术精粹》🏅 🔖行路有良友,便是天堂🔖 目录 一、前言 1、MySQL 8.0 中的高可用方案 2、适用场景 二、环境准备 1、系统环境说明…...
软考中级软件设计师——计算机网络篇
一、计算机网络体系结构 1.OSI七层模型 1. 物理层(Physical Layer) 功能:传输原始比特流(0和1),定义物理介质(如电缆、光纤)的电气、机械特性。 关键设备:中继器&#…...
RK3568 OH5.1 源码编译及问题
安装编译器和二进制工具 在源码根目录下执行prebuilts脚本,安装编译器及二进制工具。 bash build/prebuilts_download.sh在源码根目录执行如下指令安装hb编译工具: python3 -m pip install --user build/hb使用build.sh脚本编译源码 进入源码根目录&…...
【razor】回环结构导致的控制信令错位:例如发送端收到 SR的问题
一、razor的echo程序 根据对 yuanrongxi/razor 仓库的代码和 echo 测试程序相关实现的分析,下面详细解读 echo 程序中 RTCP sender report(SR)、receiver report(RR)回显的问题及项目的解决方式。 1. 问题背景 在 RTP/RTCP 体系下,SR(Sender Report)由发送端周期性发…...
leetcode hot100:三、解题思路大全:哈希(两数之和、字母异位词分组、最长连续序列)、双指针(移动零、盛最多水的容器、三数之和、接雨水)
哈希 两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。 你可以按任意顺序返…...
MySQL 8.0 OCP 1Z0-908 161-170题
Q161.Examine this command, which executes successfully: cluster.addInstance ( ‘:’,{recoveryMethod: ‘clone’ 1}) Which three statements are true? (Choose three.) A)The account used to perform this recovery needs the BACKUP_ ADMIN privilege. B)A target i…...
onlyoffice 源码 调试说明 -ARM和x86双模式安装支持
很多用户在调试onlyoffice源码最大的问题是如何搭建环境,这个难度很高,下面提供一键安装的方式,让普通用户也能快速调试源码。 OnlyOffice Document Server 基于源码运行的容器调试模式,凭借 Docker 容器化技术的核心优势,为开发者提供了跨平台、高兼容性…...
workflow:高效的流式工作架构
引言 workflow是sougou的一款开源框架 主要是以请求回应的模式解决各自网络/IO任务而发明的 一.workflow的任务流 1.workflow都封装了哪些任务流 以请求回应的模式来解释 ① 网络层 服务端 在服务端的request 相当于发送了一个获取客户端请求的请求,response相当…...
音视频之H.265/HEVC速率控制
H.265/HEVC系列文章: 1、音视频之H.265/HEVC编码框架及编码视频格式 2、音视频之H.265码流分析及解析 3、音视频之H.265/HEVC预测编码 4、音视频之H.265/HEVC变换编码 5、音视频之H.265/HEVC量化 6、音视频之H.265/HEVC环路后处理 7、音视频之H.265/HEVC熵编…...
jsmpeg+java+ffmpeg 调用摄像头RTSP流播放
原理就是这样,明白吧。本次用springboot netty起这个2个服务,执行拉代码执行即可 <!-- netty --><dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.68.Final</ver…...
深度剖析ZooKeeper
1. ZooKeeper架构总览 ZooKeeper 是一个分布式协调服务,广泛用于分布式系统中的配置管理、命名服务、分布式锁和领导选举等场景。以下是对 ZooKeeper 架构、通信机制、容错处理、数据一致性与可靠性等方面的详细剖析。 一、ZooKeeper 主从集群 ZooKeeper 采用 主从…...
Zookeeper 集群安装与脚本化管理详解
安装之前:先关闭所有服务器的防火墙!!!!!!!!!!!! systemctl stop firewalld 关闭防火墙 systemctl disable firewalld 开机不启动防火…...
第10天-Python操作MySQL数据库全攻略:从基础连接到高级应用
一、环境准备 1. 安装MySQL驱动 bash 复制 下载 # 官方推荐驱动 pip install mysql-connector-python# 或使用PyMySQL(兼容性更好) pip install pymysql 2. 创建测试数据库 sql 复制 下载 CREATE DATABASE python_db; USE python_db;CREATE TABLE users (id INT AU…...
Spring Cloud Gateway深度解析:原理、架构与生产实践
文章目录 前言一、概述二、核心架构设计及设计原理2.1 分层架构模型网络层(I/O模型)核心处理层 2.2 核心组件协作流程路由定位阶段过滤器执行阶段 2.3 响应式编程模型实现Reactor上下文传递背压处理机制 2.4 动态路由设计原理2.5 异常处理体系2.6 关键路…...
Trae 04.22版本深度解析:Agent能力升级与MCP市场对复杂任务执行的革新
我正在参加Trae「超级体验官」创意实践征文,本文所使用的 Trae 免费下载链接:Trae - AI 原生 IDE 目录 引言 一、Trae 04.22版本概览 二、统一对话体验的深度整合 2.1 Chat与Builder面板合并 2.2 统一对话的优势 三、上下文能力的显著增强 3.1 W…...
股指期货模型,简单易懂的套利策略
在股指期货投资领域,有不少实用的模型和策略,今天咱们就用大白话来唠唠其中几个重要的概念。 一、跨期套利:合约间的“差价游戏” 跨期套利简单来说,就是投资者以赚取期货合约之间的价差为目的,在同一个期货品种的不…...
MySQL 故障排查与生产环境优化
目录 1. MySQL单实例故障排查 2. MySQL 主从故障排查 3. MySQL 优化 3.1 硬件方面 3.2 MySQL 配置文件 3.3 SQL 方面 1. MySQL单实例故障排查 (1) 故障现象1 ERROR 2002 (HY000): Cant connect to local MySQL server through socket /data/mysql…...
Java泛型 的详细知识总结
一、泛型的核心作用 类型安全:在编译期检查类型匹配,避免运行时的ClassCastException。代码复用:通过泛型逻辑统一处理多种数据类型。消除强制转换:减少显式的类型转换代码。 二、泛型基础语法 1. 泛型类/接口 定义:…...
k8s 配置 Kafka SASL_SSL双重认证
说明 kafka提供了多种安全认证机制,主要分为SASL和SSL两大类。 SASL: 是一种身份验证机制,用于在客户端和服务器之间进行身份验证的过程,其中SASL/PLAIN是基于账号密码的认证方式。 SSL: 是一种加密协议,…...
电商虚拟户:重构资金管理逻辑,解锁高效归集与智能分账新范式
一、电商虚拟户的底层架构与核心价值 在数字经济浪潮下,电商交易的复杂性与日俱增,传统账户体系已难以满足平台企业对资金管理的精细化需求。电商虚拟户作为基于银行或持牌支付机构账户体系的创新解决方案,通过构建“主账户子账户”的虚拟账户…...
从混乱到高效:我们是如何重构 iOS 上架流程的(含 Appuploader实践)
从混乱到高效:我们是如何重构 iOS 上架流程的 在开发团队中,有一类看不见却至关重要的问题:环境依赖。 特别是 iOS App 的发布流程,往往牢牢绑死在一台特定的 Mac 上。每次需要发版本,都要找到“那台 Mac”ÿ…...
01 基本介绍及Pod基础
01 查看各种资源 01-1 查看K8s集群的内置资源 [rootmaster01 ~]# kubectl api-resources NAME SHORTNAMES APIVERSION NAMESPACED KIND bindings v1 …...
DAY31-文件的规范拆分和写法
知识点回顾 规范的文件命名规范的文件夹管理机器学习项目的拆分编码格式和类型注解 (一)文件拆分 思考:如何把一个文件,拆分成多个具有着独立功能的文件,然后通过import的方式,来调用这些文件。这样具有几个…...
[创业之路-369]:企业战略管理案例分析-9-战略制定-差距分析的案例之华为
一、综合案例 在战略制定中,华为通过差距分析明确战略方向,以应对市场挑战和实现长期发展目标。 以下为具体案例与分析: 1、案例背景 华为在通信设备领域崛起过程中,始终将差距分析作为战略制定的核心环节。面对国际竞争对手&…...
【华为鸿蒙电脑】首款鸿蒙电脑发布:MateBook Fold 非凡大师 MateBook Pro,擎云星河计划启动
文章目录 前言一、HUAWEI MateBook Fold 非凡大师(一)非凡设计(二)非凡显示(三)非凡科技(四)非凡系统(五)非凡体验 二、HUAWEI MateBook Pro三、预热…...
深入理解Redis Cluster:架构、原理与实践
Redis 是一个高性能的键值存储数据库,广泛应用于缓存、会话存储、消息队列等场景。随着数据量和并发量的增长,单机 Redis 可能面临性能瓶颈和单点故障问题。为了解决这些问题,Redis 提供了 Redis Cluster,一种分布式解决方案&…...
分析 redis 的 exists 命令有一个参数和多个参数的区别
在 redis 中,exists 命令是用来查询某个或多个 key 是否存在的,返回存在的 key 的个数。 由于 redis 是按照键值对方式存储数据的,于是一个 key 只能对应一组数据,那么上述的 key 的个数指的即是需要查询的 key 中有几个 key 是存…...