「MongoDB」时序数据库和MongoDB第二部分-模式设计最佳实践

news2024/11/29 8:59:47

16a6cfe7b772dcc8de488a518e1dec4d.jpeg

在上一篇博客文章时间序列数据与MongoDB:第一部分-简介中,我们介绍了时间序列数据的概念,然后介绍了一些可以用于帮助收集时间序列应用程序需求的发现问题。对这些问题的回答有助于指导支持大容量生产应用程序部署所需的模式和MongoDB数据库配置。在这篇博客文章中,我们将重点讨论在读、写、更新和删除操作下,两种不同的模式设计如何影响内存和磁盘利用率。

在分析结束时,您可能会发现应用程序的最佳模式设计可能是利用模式设计的组合。通过遵循我们下面列出的建议,您将有一个良好的起点来为您的应用程序开发最佳模式设计,并适当调整您的环境大小。

设计一个时间序列模式

让我们首先说明,没有一种规范模式设计可以适用于所有应用程序场景。无论您开发的模式是什么,都要考虑权衡。理想情况下,您希望获得最佳的内存和磁盘利用率平衡,以产生最佳的读写性能,从而满足应用程序的需求,并支持数据摄取和时间序列数据流的分析。

在这篇博客文章中,我们将讨论各种模式设计配置。首先,为每个数据样本存储一个文档,然后使用每个时间序列时间范围的一个文档和每个固定大小的文档对数据进行封装。为每个文档存储一个以上的数据样本称为bucketing。这将在应用程序级别实现,不需要在MongoDB中进行任何配置。有了MongoDB灵活的数据模型,你可以优化存储你的数据,为你的应用程序的需求提供最好的性能和粒度。

这种灵活性还允许数据模型随着时间的推移适应新的需求——比如从不属于原始应用程序设计的新硬件传感器捕获数据。这些新的传感器提供了与原始设计中使用的传感器不同的元数据和属性。有了这些灵活性,您可能会认为MongoDB数据库是蛮荒的西部,任何东西都可以,您很快就会得到一个充满无序数据的数据库。MongoDB通过模式验证提供了您所需要的尽可能多的控制,允许您完全控制执行强制字段的存在和可接受值的范围等等。

为了帮助演示模式设计和bucketing如何影响性能,请考虑我们想要存储和分析历史股票价格数据的场景。我们的示例股票价格生成器应用程序每秒钟为它跟踪的给定数量的股票创建示例数据。1秒是本例中为每个股票行情收集的数据的最小时间间隔。如果您想在自己的环境中生成示例数据,可以在GitHub上使用StockGen工具。需要注意的是,尽管本文中的示例数据使用股票刻度作为示例,但您可以将这些相同的设计概念应用于任何时间序列场景,比如物联网传感器的温度和湿度读数。

用于生成示例数据的StockGen工具将生成相同的数据,并将其存储在两个不同的集合中:StockDocPerSecond和StockDocPerMinute,它们各自包含以下模式:

场景1:每个数据点一个文档

{
"_id" : ObjectId("5b4690e047f49a04be523cbd"),
"p" : 56.56,
"symbol" : "MDB",
"d" : ISODate("2018-06-30T00:00:01Z")
},
{
"_id" : ObjectId("5b4690e047f49a04be523cbe"),
"p" : 56.58,
"symbol" : "MDB",
"d" : ISODate("2018-06-30T00:00:02Z")
},
...

场景2:每分钟一个文档的基于时间的bucketing

{
"_id" : ObjectId("5b5279d1e303d394db6ea0f8"),
"p" : {
"0" : 56.56,
"1" : 56.56,
"2" : 56.58,

"59" : 57.02
},
"symbol" : "MDB",
"d" : ISODate("2018-06-30T00:00:00Z")
},
{
"_id" : ObjectId("5b5279d1e303d394db6ea134"),
"p" : {
"0" : 69.47,
"1" : 69.47,
"2" : 68.46,
...
"59" : 69.45
},
"symbol" : "TSLA",
"d" : ISODate("2018-06-30T00:01:00Z")
},
...

请注意,字段“p”包含一个子文档,其中包含每分钟每秒的值。

模式设计的比较

让我们根据StockGen工具生成的4周的数据来比较和对比存储大小和内存影响的数据库指标。在评估数据库性能时,度量这些指标非常有用。

对数据存储的影响

在我们的应用程序中,时间粒度的最小级别是秒。场景1中描述的每秒存储一个文档对于那些来自关系数据库背景的人来说是最合适的模型概念。这是因为我们为每个数据点使用一个文档,这类似于表格模式中为每个数据点使用一行。这种设计将在单位时间内产生最大数量的文档和集合大小,如图3和图4所示。

60af89201405e370ca92516c2cb74fd4.png

66a1b3d144633e3cbc050366996b2b65.png

图4显示了每个集合的两种大小。这个系列中的第一个值是存储在磁盘上的集合的大小,而第二个值是数据库中数据的大小。这些数字是不同的,因为MongoDB的WiredTiger存储引擎支持静态数据压缩。逻辑上每秒的收集是605MB,但是在磁盘上,它消耗了大约190 MB的存储空间。

对内存利用率的影响

大量的文档不仅会增加数据存储的消耗,还会增加索引的大小。在每个集合上创建索引,覆盖符号和日期字段。与一些将自己定位为时间序列数据库的键值数据库不同,MongoDB提供了二级索引,使您能够灵活地访问数据,并允许您优化应用程序的查询性能。

fa17405c0f6dd365077db6a4b645e934.png

图5:每秒和每分钟的索引大小(MB)比较

这两个集合中定义的索引的大小如图5所示。MongoDB的最佳性能发生在索引和最近使用的文档适合由WiredTiger缓存分配的内存时(我们称之为“工作集”)。在我们的示例中,我们在4周的时间内只生成了5只股票的数据。对于这个小测试用例,我们的数据已经为PerSecond场景生成了一个大小为103MB的索引。请记住,有一些优化(如索引前缀压缩)可以帮助减少索引的内存占用。然而,即使有了这些优化,正确的模式设计对于防止失控的索引大小也是很重要的。考虑到增长轨迹,对应用程序需求的任何更改,比如在我们的样例场景中跟踪超过5只股票或超过4周的价格,都将给内存带来更大的压力,最终需要将索引页出到磁盘。当这种情况发生时,您的性能将会下降。要缓解这种情况,可以考虑水平伸缩。

水平扩展

随着数据大小的增长,当MongoDB副本集中托管主mongod的服务器达到物理限制时,可能最终会水平伸缩。

通过MongoDB Sharding水平扩展,性能可以得到提高,因为索引和数据将分布在多个MongoDB节点上。查询不再针对特定的主节点。相反,它们是由一种称为查询路由器(mongos)的中间服务处理的,该服务将查询发送到包含满足查询的数据的特定节点。注意,这对应用程序是完全透明的——MongoDB为你处理所有的路由

场景3:基于大小的封装

在比较前面的场景时,最重要的一点是使用数据包具有显著的优势。场景2中描述的基于时间的bucketing将一分钟的数据存储到一个单一的文档中。在物联网等基于时间的应用中,传感器数据可能以不规则的间隔生成,一些传感器可能比其他传感器提供更多的数据。在这些场景中,基于时间的bucketing可能不是方案设计的最佳方法。另一种策略是基于大小的bucketing。使用基于大小的bucketing,我们将围绕每个发出的传感器事件的特定数目的一个文档来设计模式,或围绕一整天(以先发出的为准)来设计模式。

要了解基于大小的bucketing的实际运作,请考虑这样一个场景:您正在存储传感器数据,并将bucket大小限制为每个文档200个事件,或一天(以先到的方式)。注意:200的限制是一个任意的数字,可以根据需要进行更改,而不需要更改应用程序或模式迁移。

{
_id: ObjectId(),
deviceid: 1234,
sensorid: 3,
nsamples: 5,
day: ISODate("2018-08-29"),
first:1535530412,
last: 1535530432,
samples : [
{ val: 50, time: 1535530412},
{ val: 55, time : 1535530415},
{ val: 56, time: 1535530420},
{ val: 55, time : 1535530430},
{ val: 56, time: 1535530432}
]
}

图6显示了一个基于大小的桶示例。在这种设计中,试图将每个文档的插入限制为任意数量或特定的时间段可能会很困难;但是,使用upsert很容易做到,如下面的代码示例所示:

sample = {val: 59, time: 1535530450}
day = ISODate("2018-08-29")
db.iot.updateOne({deviceid: 1234, sensorid: 3, nsamples: {$lt: 200}, day: day},
{
$push: { samples: sample},
$min: { first: sample.time},
$max: { last: sample.time},
$inc: { nsamples: 1}
},
{ upsert: true }

)

当新的传感器数据进来时,它被简单地附加到文档中,直到样本数量达到200,然后由于我们的upsert:true子句创建一个新文档。

这个场景中的最佳索引是{deviceid:1,sensorid:1,day:1,nsamples:1}。当我们更新数据时,日期是精确匹配的,这是超级高效的。在查询时,我们可以在单个字段上指定日期或日期范围,这也很有效,还可以使用UNIX时间戳按第一个和最后一个进行过滤。注意,我们使用整数值来表示时间。这些时间实际上是作为UNIX时间戳存储的,只占用32位存储空间,而ISODate占用64位存储空间。虽然与ISODate相比查询性能差别不大,但如果您计划最终摄入tb级的数据,并且不需要存储小于1秒的粒度,那么将数据存储为UNIX时间戳可能很重要。

固定大小的Bucketing数据将产生非常相似的数据库存储和索引的改善,就像场景2中每次Bucketing所看到的那样。这是在MongoDB中存储稀疏物联网数据的最有效方法之一。

如何处理旧数据

我们应该永久存储所有数据吗?超过一定时间的数据对您的组织有用吗?旧数据的可访问性如何?当您需要它时,它是否可以简单地从备份中恢复,或者它是否需要在线并作为活动存档供用户实时访问,以便进行历史分析?正如我们在本博客系列的第1部分中所述,这些是在上线之前应该问的一些问题。

有多种处理旧数据的方法,根据您的特定需求,有些方法可能比其他方法更适用。选择一个最适合您的需求。

Pre-aggregation

对于几年前生成的每个事件,您的应用程序真的需要一个数据点吗?在大多数情况下,保持这种数据粒度的资源成本超过了能够随时查询到这个级别的好处。在大多数情况下,可以预先聚合和存储数据,以便进行快速查询。在我们的股票示例中,我们可能希望仅将每天的收盘价存储为一个值。在大多数架构中,预先聚合的值存储在一个单独的集合中,因为对历史数据的查询通常与实时查询不同。通常对于历史数据,查询查找的是一段时间内的趋势,而不是单个实时事件。通过将这些数据存储在不同的集合中,您可以通过创建更高效的索引(而不是在实时数据上创建更多索引)来提高性能。

离线归档策略

在对数据进行归档时,与数据检索相关的SLA是什么?恢复数据备份是可以接受的吗?还是需要数据处于在线状态并随时准备进行查询?回答这些问题将有助于推动您的档案设计。如果不需要对归档数据进行实时访问,那么可以考虑备份数据并将其从活动数据库中删除。生产数据库可以使用MongoDB Ops Manager进行备份,如果使用MongoDB Atlas服务,则可以使用完全托管的备份解决方案。

使用remove语句删除文档

一旦数据通过数据库备份或ETL过程复制到存档库,数据可以通过remove语句从MongoDB集合中删除,如下所示:

db.StockDocPerSecond.remove ( { "d" : { $lt: ISODate( "2018-03-01" ) } } )

在本例中,“d”字段上定义的日期在2018年3月1日之前的所有文档都将从StockDocPerSecond集合中删除。

您可能需要设置一个自动化脚本,以便经常运行以清除这些记录。或者,您可以通过定义一个生存时间(TTL)索引来避免在这个场景中创建自动化脚本。

使用TTL索引删除文档

TTL索引与常规索引类似,只是定义了从集合中自动删除文档的时间间隔。在我们的示例中,我们可以创建一个自动删除超过一周的数据的TTL索引。

db.StockDocPerSecond.createIndex( { "d": 1 }, { expireAfterSeconds: 604800 } )

尽管TTL索引很方便,但请记住,检查大约每分钟发生一次,不能配置间隔。如果您需要更多的控制以使删除不会在一天的特定时间发生,那么您可能希望调度一个执行删除操作的批处理作业,而不是使用TTL索引。

通过删除集合来删除文档

需要注意的是,使用remove命令或TTL索引将导致磁盘I/O偏高。对于已经处于高负载的数据库,这可能是不可取的。从活动数据库中删除记录的最有效和最快的方法是删除集合。如果可以将应用程序设计为每个集合代表一段时间,那么当需要归档或删除数据时,只需删除集合。这可能需要在您的应用程序代码中使用一些智能来知道应该查询哪些集合,但其好处可能大于此更改。当你发出一个删除命令时,MongoDB也必须从所有受影响的索引中删除数据,这可能需要一段时间,这取决于数据和索引的大小。

在线归档策略

如果仍然需要实时访问归档数据,请考虑这些查询发生的频率,以及只存储预先聚合的结果是否足够。

分片归档数据

归档数据并保持数据可实时访问的一种策略是使用分区分片对数据进行分区。切分不仅有助于跨多个节点横向扩展数据,还可以标记切分范围,以便将数据分区固定到特定的切分上。一种节省成本的措施是让归档数据驻留在运行低成本磁盘的碎片上,并定期调整碎片本身中定义的时间范围。这些范围将导致平衡器自动在这些存储层之间移动数据,为您提供分层的、多温度的存储。查看使用分区分片创建分层存储模式的教程,了解更多信息。

通过可查询的备份访问归档数据

如果您的存档数据不经常被访问,并且查询性能不需要满足任何严格的延迟sla,考虑备份数据并使用MongoDB Atlas或MongoDB OpsManager的可查询备份特性。可查询备份允许您连接到备份并向备份本身发出只读命令,而无需首先还原备份。

从数据湖查询数据

MongoDB是一种廉价的解决方案,不仅适用于长期归档,也适用于您的数据湖。投资Apache Spark等技术的公司可以利用MongoDB Spark连接器。这个连接器将MongoDB数据物化为与Spark和机器学习、图形、流和SQL api一起使用的数据数据库和数据集。

关键的要点

一旦应用程序在生产环境中运行并具有多个tb的大小,从资源的角度来看,任何重大更改都可能非常昂贵。考虑这样一个场景:您有6 TB的物联网传感器数据,并且以每秒50,000次插入的速度积累新数据。读取的性能开始成为一个问题,您意识到没有正确地扩展数据库。除非你愿意让应用程序宕机,否则这种配置模式的改变——例如从原始数据存储转移到bucket存储——可能需要构建垫片、临时暂存区域和各种临时解决方案来将应用程序转移到新的模式。这个故事的寓意是为增长做计划,并适当设计适合应用程序sla和需求的最佳时间序列模式。

本文分析了股票价格时序数据存储的两种不同模式设计。在您的场景中,最终获胜的股票价格数据库模式是最好的模式吗?也许吧。由于时间序列数据的性质和典型的数据快速摄入,答案实际上可能是利用以读或写重用例为目标的集合组合。好消息是,MongoDB灵活的模式很容易进行更改。实际上,您可以运行两个不同版本的应用程序,为同一个集合编写两个不同的模式。但是,不要等到查询性能开始下降时才去寻找最佳设计,因为将现有文档的TBs迁移到一个新的模式会花费时间和资源,并且会延迟应用程序的未来版本。在进行最终设计之前,您应该进行真实世界的测试。引用一句著名的谚语:“量两次,切一次。”

在下一篇博客文章“用MongoDB查询、分析和显示时间序列数据”中,我们将研究如何有效地从存储在MongoDB中的时间序列数据中获取价值。

关键提示:

  • MMAPV1存储引擎不赞成使用,因此使用默认的WiredTiger存储引擎。请注意,如果您阅读几年前的模式设计最佳实践,那么它们通常是在旧的MMAPV1技术上构建的。

  • 了解时间序列应用程序的数据访问需求。

  • 模式设计影响资源。关于模式设计和索引,“测量两次,削减一次”。

  • 如果可能的话,用真实的数据和真实的应用程序测试模式。

  • Bucketing数据减少了索引大小,因此大大减少了硬件需求。

  • 时间序列应用程序通常会捕获大量数据,因此只在对应用程序的查询模式有用的地方创建索引。

  • 考虑多个集合:一个集中在写重插入和最近的数据查询上,另一个集中在预聚合数据的历史查询上的bucket数据集合。

  • 当索引的大小超过托管MongoDB的服务器的内存量时,考虑横向扩展,将索引和负载分散到多个服务器上。

  • 确定数据在什么时候过期,以及采取什么操作,比如归档或删除。

本文 :https://architect.pub/time-series-data-and-mongodb-part-2-schema-design-best-practices
讨论:知识星球【首席架构师圈】或者加微信小号【ca_cto】或者加QQ群【792862318】
公众号

【jiagoushipro】
【超级架构师】
精彩图文详解架构方法论,架构实践,技术原理,技术趋势。
我们在等你,赶快扫描关注吧。
ef28b50af47cb882040d170eed76ec97.jpeg
微信小号

【ca_cea】
50000人社区,讨论:企业架构,云计算,大数据,数据科学,物联网,人工智能,安全,全栈开发,DevOps,数字化.

408036fc50e24f8249822da0e082faf6.jpeg

QQ群

【285069459】深度交流企业架构,业务架构,应用架构,数据架构,技术架构,集成架构,安全架构。以及大数据,云计算,物联网,人工智能等各种新兴技术。
加QQ群,有珍贵的报告和干货资料分享。

8276eadb2a508fe3e27c4550f08ef789.jpeg

视频号【超级架构师】
1分钟快速了解架构相关的基本概念,模型,方法,经验。
每天1分钟,架构心中熟。

3cc6ba12bb4bc77ccd10cd2523b48767.jpeg

知识星球【首席架构师圈】向大咖提问,近距离接触,或者获得私密资料分享。

80750495de5cc7c93ea7b63860aaf396.jpeg

喜马拉雅【超级架构师】路上或者车上了解最新黑科技资讯,架构心得。【智能时刻,架构君和你聊黑科技】
知识星球认识更多朋友,职场和技术闲聊。知识星球【职场和技术】
领英Harryhttps://www.linkedin.com/in/architect-harry/
领英群组领英架构群组
https://www.linkedin.com/groups/14209750/
微博‍‍【超级架构师】智能时刻‍
哔哩哔哩【超级架构师】

5097c5e1cf01e630ebec9622632a5a04.jpeg

抖音【cea_cio】超级架构师

b05eabf4b10af6935da0885baaa22cf3.jpeg

快手【cea_cio_cto】超级架构师

6659e089bfe9400eeec7c99b3b307d3e.jpeg

小红书【cea_csa_cto】超级架构师

332147523923d414c38c05c4a2fee98c.jpeg

网站CIO(首席信息官)https://cio.ceo
网站CIO,CTO和CDOhttps://cioctocdo.com
网站架构师实战分享https://architect.pub   
网站程序员云开发分享https://pgmr.cloud
网站首席架构师社区https://jiagoushi.pro
网站应用开发和开发平台https://apaas.dev
网站开发信息网https://xinxi.dev
网站超级架构师https://jiagou.dev
网站企业技术培训https://peixun.dev
网站程序员宝典https://pgmr.pub    
网站开发者闲谈https://blog.developer.chat
网站CPO宝典https://cpo.work
网站首席安全官https://cso.pub    ‍
网站CIO酷https://cio.cool
网站CDO信息https://cdo.fyi
网站CXO信息https://cxo.pub

谢谢大家关注,转发,点赞和点在看。

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

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

相关文章

基于深度学习PaddleOcr身份证识别

之前使用opencv机械学习处理图片,使用Testseract-OCR进行身份证和姓名识别,发现受背景图片的影响比较大,转PaddleOcr,识别成功率能达到使用要求。 PaddleOcr官网地址:飞桨PaddlePaddle-源于产业实践的开源深度学习平台…

Python爬虫-某跨境电商(AM)搜索热词

前言 本文是该专栏的第42篇,后面会持续分享python爬虫干货知识,记得关注。 关于某跨境电商(AM),本专栏前面有单独详细介绍过,获取配送地的cookie信息以及商品库存数据,感兴趣的同学可往前翻阅。 1. python爬虫|爬取某跨境电商AM的商品库存数据(Selenium实战) 2. Seleni…

偶数科技发布实时湖仓数据平台 Skylab 5.0

2023 年 4 月 11 日, 偶数发布了最新的实时湖仓数据平台 Skylab 5.0,平台各个组件进行了全面升级。新版 Skylab 的发布标志着偶数科技具有从数据存储、计算、管理到分析、应用和 AI 能力的完整的数据管理生态闭环,帮助用户实现批流一体、实时…

贴完车衣开车就走?

贴完车衣之后,你以为直接开走就好了吗? 大错特错!!! 正确流程,记得收藏起来! 1:膜开箱:这个当场开箱,防止偷梁换柱 2:装贴过程:确认施…

损失函数(Loss Function)一文详解-分类问题常见损失函数Python代码实现+计算原理解析

目录 前言 一、损失函数概述 二、损失函数分类 1.分类问题的损失函数 1.交叉熵损失函数(Cross Entropy Loss) 2.Hinge损失函数 3.余弦相似度损失函数(Cosine Similarity Loss) 4.指数损失函数(Exponential Los…

Next.js Polygon, Solidity,The Graph,IPFS,Hardhat web3博客系统

参考 源文档The Complete Guide to Full Stack Web3 Development - DEV Community 源码,源文章里的github项目无法直接运行,经过修改后可mac中可用GitHub - daocodedao/web3-blog: https://linzhji.blog.csdn.net/article/details/130125634 框架 博客…

python pandas数据处理excel、csv列转行、行转列(具体示例)

一、数据处理需求 对Excel或CSV格式的数据,我们经常都是使用pandas库读取后转为DataFrame进行处理。有的时候我们需要对其中的数据进行行列转换,但是不是简单的行列转换,因为数据中有重复的数据属性。比如我们的数据在Excel中的格式如下: 那么,我们如何将上面的数据格式转…

2023爱分析·商业智能应用解决方案市场厂商评估报告:数聚股份

目录 1. 研究范围定义 2. 商业智能应用解决方案市场分析 3. 厂商评估:数聚股份 4. 入选证书 1. 研究范围定义 商业智能(BI)是在实现数据集成和统一管理的基础上,利用数据存储和处理、分析与展示等技术,满足企…

Java多线程案例-Java多线程(3)

各位观众老爷们, 创作不易, 多多支持😶‍🌫️🙏😘 字数11223, 时间:2023年4月16日11:19:58 状态: 精神恍恍惚惚, 想打游戏🥵 目录(点击传送) 单例模式 饿汉模式 懒汉模式 单线程版 多线程版 阻塞队列 什么是阻塞队…

助力工业物联网,工业大数据之ODS层及DWD层建表语法【七】

文章目录ODS层及DWD层构建01:课程回顾02:课程目标03:数仓分层回顾04:Hive建表语法05:Avro建表语法ODS层及DWD层构建 01:课程回顾 一站制造项目的数仓设计为几层以及每一层的功能是什么? ODS&am…

Pytorch-gpu的安装

1.先安装cuda和cudnn 推荐安装cuda11.3和cuda10.2,因为这两个版本用的多。 安装教程可以看我的另一篇文章: cuda和cudnn安装教程 2.安装对应版本的Pytorch Pytorch的版本需要和cuda的版本相对应。具体对应关系可以去官网查看。这里先附上一张对应关系…

openpnp - 顶部相机 - 辅助光(环形灯)的电路原理图

文章目录openpnp - 顶部相机 - 辅助光(环形灯)的电路原理图概述ENDopenpnp - 顶部相机 - 辅助光(环形灯)的电路原理图 概述 同学帮我做的简易灯板设计不太合理, 发热量极大. 想看看商用的环形灯电路啥样的, 如果有可能, 自己做块灯板, 塞进商用环形灯外壳中. 拆解了一个环形灯…

数据库备份

数据库备份,恢复实操 策略一:(文件系统备份工具 cp)(适合小型数据库,是最可靠的) 1、停止MySQL服务器。 2、直接复制整个数据库目录。注意:使用这种方法最好还原到相同版本服务器中&…

【图像分类】【深度学习】ViT算法Pytorch代码讲解

【图像分类】【深度学习】ViT算法Pytorch代码讲解 文章目录【图像分类】【深度学习】ViT算法Pytorch代码讲解前言ViT(Vision Transformer)讲解patch embeddingpositional embeddingTransformer EncoderEncoder BlockMulti-head attentionMLP Head完整代码总结前言 ViT是由谷歌…

Spring Boot+Vue实现Socket通知推送

目录 Spring Boot端 第一步,引入依赖 第二步,创建WebSocket配置类 第三步,创建WebSocket服务 第四步,创建Controller进行发送测试 Vue端 第一步,创建连接工具类 第二步,建立连接 ​编辑 第三步&a…

xxl-job-2.3.1 本地编译jar包并部署

参考网上其他文章,总结步骤 一、官网地址 分布式任务调度平台XXL-JOB 二、源码地址 github: GitHub - xuxueli/xxl-job: A distributed task scheduling framework.(分布式任务调度平台XXL-JOB) gitee: xxl-job: 一个分布…

k8s v1.26.2 安装部署步骤

准备 开通端口 master需要开通的端口: TCP: 6443 2379 2380 10250 10259 10257 ,10250 30000~30010(应用) node需要开通的端口: TCP: 10250 30000~30010(应用) master加端口 firewall-cmd --permanent --add-port6443/tcp firewall-cmd --permanent --add-port2379/tcp fir…

数据库学习笔记 概念数据库的设计(2)

回顾上节课的内容 数据库的设计:概念设计:抽取实体和联系 逻辑设计:设计模式 设计模式 物理设计:设计数据库的内模式 和存储和存取相关的配置 sql创建索引可以做分表 将所有学生存入一张表或者每个学院一个表 根据某种条件进行分表 CSstudent 实体联系模型 叫ER图 实体(矩形)和…

城乡供水信息化平台建设-构建智慧美丽乡村

建设方案 城乡供水信息化系统是运用云计算、大数据等信息化手段,借助在线监测设备,并依托“城乡供水信息化平台”,实时感知供水系统的运行状态,实现对农村供水工程远程监控、在线监测、实时预警、智慧监管。 系统功能 水源地监测&…

springboot+vue职称评审管理系统(源码+文档)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的职称评审管理系统。项目源码请联系风歌,文末附上联系信息 。 目前有各类成品java毕设,需要请看文末联系方式 …