Spring Boot进阶(59):【实战教程】使用Spring Boot集成InfluxDB时序数据库,打造高效数据监控系统!

news2024/9/22 18:43:19

 1. 前言🔥

        前几期我们陆续讲解了Mysql、Redis、PostgreSQL、MongoDB等数据库集成及使用案例,接下来,bug菌继续给同学们介绍一种特殊的数据库,到底是什么数据库呢?它就是InfluxDB(时序数据库),InfluxDB是一款专门用于存储和查询时序数据的开源数据库,具有高效、可扩展等优点。在实时监控、IoT和大数据等领域得到广泛应用。而Spring Boot是一款快速开发的框架,可帮助我们快速构建基于Spring的应用程序,因其简洁、易用等优点,成为了开发者的首选。本文将介绍如何在Spring Boot项目中集成InfluxDB,并通过一个简单的示例演示其基本用法,希望能够帮助广大开发者更好地使用InfluxDB和Spring Boot开发时序数据应用。

        那么,这将又会是干货满满的一期,全程无尿点不废话只抓重点教,具有非常好的学习效果,拿好小板凳准备就坐!希望学习的过程中大家认真听好好学,学习的途中有任何不清楚或疑问的地方皆可评论区留言或私信,bug菌将第一时间给予解惑,那么废话不多说,直接开整!Fighting!! 

2. 环境说明🔥

本地的开发环境:

  • 开发工具:IDEA 2021.3
  • JDK版本: JDK 1.8
  • Spring Boot版本:2.3.1 RELEASE
  • Maven版本:3.8.2

3. 正文🔥 

3.1 InfluxDB简介

        InfluxDB是什么?它是一个用于存储和分析时间序列数据的开源数据库。由 Golang 语言编写,也是由 Golang 编写的软件中比较优秀的一个,在很多 Golang 的沙龙或者文章中都可能会把 InfluxDB 当标杆来介绍,这也间接帮助 InfluxDB 提高了知名度。

        对于时序数据而言,它是一组按照时间维度索引的数据。时序数据在日常生活中也是随处可见,比如整点的温度、湿度等天气数据,每分钟的股票价格数据等。我们常见到的曲线图、柱状图等形式,就可以用来展现时序数据,这也就是我们常常听到的“数据可视化”。

        时序数据库是一种非关系型数据库,以时间作为数据主键,专门用来存储时序数据。

        而且在市面上,目前比较流行的时序数据库有:InfluxDB、TDengine、Prometheus、OpenTSDB等,其中InfluxDB在行业内应用使用最广泛。与此同时,刚进入业内视野的国产时序数据库TDengine也是后起之秀。对于Prometheus,它则是Prometheus监控系统中自带的数据库。

3.2 InfluxDB与Mysql类比

        如下类比了关系型数据库Mysql,其实概念大差不差,辅助同学们更好的理解它。

mysql

influxdb

备注

database

database

数据库

table

measurement

数据库

record

point

一行记录数据

拓展:InfluxDB数据库由database、measurement、point等三部分构成。分别对应关系数据库中的数据库、表、数据行,具体概念分别如下:

  • database:数据库.同Mysql等关系型数据库中的"数据库Database"
  • measurement:数据表.相当于关系型数据库中的"表Table"
  • point:数据点.表示单条数据记录,相当于关系型数据库中的"一行数据"

        其中,Point是InfluxDB中独有的概念,一个Point由time、field、tags三类字段组成,其中三类字段及概念分别如下:

  • time:时间戳
  • fields:记录的值
  • tags:索引的属性

3.3 InfluxDB特点

  • 内置 HTTP 接口,使用方便。
  • 数据可以打标记,这样查询可以很灵活。
  • 类 SQL 的查询语句。
  • 安装管理很简单,并且读写数据很高效。
  • 能够实时查询,数据在写入时被索引后就能够被立即查出。

        在最新的 DB-ENGINES(全球知名的数据库流行度排行榜网站) 公布的时间序列数据库排行榜中,InfluxDB 位于榜首,可想而知,InfluxDB 会越来越得到开发者及社区的广泛使用,形势一片大好。

3.4 InfluxDB使用场景

        阅读完以上内容,想必同学们对时序数据库InfluxDB就有了一定的了解,那么,可能大家就会想它可以适用于那些场景呢?这可能是目前大家心里及其迫切想要知道的,必须学习个新东西,好歹要知道这个可以干什么用,用在那些地方,对吧。心急吃不了热豆腐,同学们接着往下看。

  • IOT行业:电力、化工等工业物联网数据监测。
  • 金融行业:各类金融产品及其衍生品、数字货币数据存储与量化研究。
  • IT行业:服务器、虚拟机、容器等的状态数据实时监测。
  • 互联网行业:用户行为轨迹,日志等数据。

        这样同学们心里就有个清楚的认知,它大概可以干嘛用了吧,其实更多的领域它一样也能派上用场,任何一个数据库被设计出来, 往往局限它的不是数据库本身,而是使用者。

4. InfluxDB安装🔥

 4.1 前言

        接下里,我们就进行数据库的安装教学啦。对于InfluxDB的安装,非常之简单,根据操作系统执行对应的安装命令即可。这里我以window10系统为例,给同学们演示一波Windows下如何安装InfluxDB。

4.2 下载

InfluxDB下载url:https://dl.influxdata.com/influxdb/releases/influxdb-1.7.4_windows_amd64.zip

chronograf 下载url:https://dl.influxdata.com/chronograf/releases/chronograf-1.7.8_windows_amd64.zip

注意:chronograf 是 InfluxDB的可视化后台管理端,虽然InfluxDB也提供了控制台命令端,如果你使用不习惯,可以使用chronograf 可视化工具进行操作,例如Navicat。

4.2 解压安装包

        本地下载好后,这里我们可以看到分别有两个压缩包,influxdb-1.7.4_windows_amd64.zip 与 chronograf-1.7.8_windows_amd64.zip,接下来是分别进行解压。

 4.2.1 解压influxdb

        influxdb-1.7.4_windows_amd64.zip解压后,我们可以看到influxDB的数据库文件非常简单。如下图所示:

 4.2.2 修改配置文件

       由于 InfluxDB 的数据存储主要有三个目录。默认情况下是 meta、wal 、 data 这三个目录,InfluxDB 应用程序启动后会自动生成,这个我们后续启动了再验证。

  • meta 用于存储数据库的一些元数据,meta 目录下有一个 meta.db 文件。
  • wal 目录存放预写日志文件,以 .wal 结尾。
  • data 目录存放实际存储的数据文件,以 .tsm 结尾。

由于配置文件指定的默认路径,我们需要将其改为我们自己自定义的路径,方便查阅。

所以接下来我们需要对influxdb.conf 配置文件进行修改,修改如下三个地方的路径指向。

这里我们直接在安装路径下的路径,比如:E:\InfluxDB\influxdb-1.7.4-1,这个改成你们本地安装路径即可。修改样例如下:

//第26行
原:dir = "/var/lib/influxdb/meta"
新:dir = "E:/InfluxDB/influxdb-1.7.4-1/meta"
//第45行
原:dir = "/var/lib/influxdb/data"
新:dir = "E:/InfluxDB/influxdb-1.7.4-1/data"
//第48行
原:wal-dir = "/var/lib/influxdb/wal"
新:wal-dir = "E:/InfluxDB/influxdb-1.7.4-1/wal"

4.2.3 修改端口

        InfluxDB服务默认端口为8086,如果你需要指定端口号,则可以修改如下配置。配置文件的第256行,将端口号设置放开并指定你想要的端口号即可,一般我是端口号默认即可。

 4.3 启动服务

        配置文件修改后,我们记得保存一下,如何启动InfluxDB服务?很坚定,直接运行Influxd.exe使用默认配置运行即可,这里也可以使用自定义的配置文件,则指定conf文件进行启动,自定义配置使用的启动命令如下:

先cmd 进入influxDB目录,然后执行以下命令即可:
influxd.exe -config influxdb.conf

如果就使用默认配置启动,则直接双击【Influxd.exe】即可启动。

双击【Influxd.exe】后会直接弹出一个小黑窗口,如果你的窗口内容看到如下输出,则就说明InfluxDB服务启动成功了。

 到此,InfluxDB服务就启动好了。

4.4 InfluxDB使用

        对于关系型数据库,例如Mysql,它有它自己的sql语法规则,而 InfluxDB 的也有它的sql语法---InfluxQL。InfluxQL是一种类似于SQL的查询语言,用于与InfluxDB数据库进行交互。

        如果你有使用关系数据库及SQL的基础,那么你可以非常快的掌握InfluxQL。但是,InfluxQL与SQL又不全一样,它缺乏SQL中的一些高级的语法,例如union,having、join等。

接下来,我们就来演示一下InfluxQL语言的使用方法。

 4.5 连接InfluxDB服务

        进入到InfluxDB安装目录后,选中文件全路径,输入cmd回车。会弹出小黑框。

然后在cmd小黑框中输入:influx 即可。

为此你就可以在该输入框中进行sql执行啦,接下来我带着大家进行学习并实践操作一下吧。 

4.6 数据库操作

4.6.1 数据库创建

这里我们先来创建一个名为influx_demo的数据库,数据库名你们随意。 

//创建数据库语句
 CREATE DATABASE influx_demo

 很明显是创建【influx_demo】数据库成功了。

4.6.2 查询所有数据库

 查询显示所有的数据库,命令如下:

 SHOW DATABASES

4.6.3 数据库删除

DROP DATABASE influx_demo

 对指定数据库进行删除,命令如下:

 这里我们先执行删除命令再查询核实,数据库确实不存在了。

4.6.4 数据库使用

对指定的数据库进行使用,命令如下:

USE influx_demo

4.7 表操作

4.7.1 创建表

        由于InfluxDB中没有专门创建表的命令sql,当插入一条数据point至某B表时,此B表会被自动创建,并且表的格式、字段名、字段类型也由此条插入命令决定。

4.7.2 修改表

        与创建表一样,InfluxDB中也没有修改表的命令sql,但当插入一条新数据point至某表B时,如果此point中的字段多于原B表的字段,会自动修改B表与此条插入数据的格式字段一致。

注意:此种情况仅限于新插入的数据字段与表B字段的交集即表B的情况,如果新插入数据字段与表A完全不同则会插入失败从而表结构也不变。

4.7.3 查询表

查询指定数据库下的表列表,前提是需要使用那个库,命令如下:

SHOW MEASUREMENTS

演示如下: 

4.7.4 删除表

删除表也是在使用某个数据库下进行操作的,删除表命令如下:

DROP MEASUREMENT "measurementName"

演示如下:删除名为"user"的表。

4.8 数据操作

4.8.1 插入数据

插入语句语法如下:

insert + measurement + "," + tag=value,tag=value + 空格 + field=value,field=value ;

tag与tag之间要用逗号[,]分隔;field与field之间用逗号[,]分隔; tag与field之间用空格[  ]分隔; tag都是string类型,不需要引号将value包裹; field如果是string类型,需要加引号;

我先来给大家举个新增数据的例子:

insert weather,altitude=1001,area=南 temperature=10,humidity=-4

具体可以看到数据已经被插入了。 且进行weather表查询了,也证实了weather表被自动创建了。

4.8.2 查询数据

查询语句格式与mysql 基本一致,使用select 关键字。

select * from weather

演示如下: 

4.8.3 修改数据

当 tags 和 timestamp 相同时数据会执行覆盖操作,相当于InfluxDB的更新操作。

现在我们来做个演示:我们针对第一条数据进行数据修改操作。

修改前:

修改后:

执行insert 语句:

insert weather,altitude=1001,area=南 humidity=-8,temperature=7 1691634804880043400

对比修改前,同条数据的humidity、temperature 内容已经被成功修改了。 

案例完整执行代码如下:

> select * from weather
name: weather
time                altitude area humidity temperature
----                -------- ---- -------- -----------
1691634804880043400 1001     南    -5       10
1691635565148254500 300      东    9        30
>
> insert weather,altitude=1001,area=南 humidity=-8,temperature=7 1691634804880043400
> select * from weather
name: weather
time                altitude area humidity temperature
----                -------- ---- -------- -----------
1691634804880043400 1001     南    -8       7
1691635565148254500 300      东    9        30
>

4.8.4 删除数据

删除语法与Mysql数据库的删除语法一样,都是使用delete关键字。

演示如下: 

根据时间删除: SQL如下: 

delete from weather where time = 1691634804880043400;

sql具体执行如下: 

根据网上众多资料提示可以根据 tags 进行删除,经过反复测试,删除失败了,并报err提示该字段不支持,执行语句如下:

 > delete from weather where altitude = 1001

 > delete from weather where area = 东

具体执行大家请看如下! 

所以这个删除语法暂时是不可取的,请大家避坑。

4.9 InfluxDB用户管理

        接下来给大家普及下InfluxDB数据库的用户管理相关知识,对于InfluxDB而言,默认管理员账号为admin,密码默认为为空,这里我们也可以添加用户和权限,如下我具体给同学们演示一下。

4.9.1 显示用户

显示当前所有的用户,语法如下:

> show users 

具体语句执行如下:

4.9.2 创建用户

如下演示下如何添加用户,具体语法如下:

> create user "test" with password '123456'

具体执行如下: 

4.9.3 创建管理员权限用户

创建一个管理员用户并赋予所有权限,语法如下:

> create user "test1" with password '123456' with all privileges 

 具体执行如下: 

4.9.4 删除用户

如下演示如何删除用户,具体如下:

> drop user "test"

具体执行如下: 

        以上就是对InfluxDB数据库操作的一些基本总结,如若了解更多可以其复杂用法可以上其官网专门学习,这里就不具体深入介绍实践了。 

5. Spring Boot集成InfluxDB🔥

        上一期,给大家介绍了InfluxDB数据库的安装和一些日常使用,接下来是给大家演示Spring Boot项目如何集成InfluxDB并实战使用,通过代码实现数据的增删改查,接下来请看是如何实现的,具有很好的教学意义,请同学们认真听,好好学哦。

5.1 创建Spring Boot项目

        这里创建一个基础的Spring Boot项目雏形,如果你还不清楚,这里推荐你参考我的这篇《Spring Boot项目如何快速搭建》

5.2 添加依赖

        接着在你项目的pom.xml配置文件中引入InfluxDB的官方SDK,这里需要注意,如果你使用的Spring Boot版本在 2以下或者更旧,就需要手动指明InfluxDB版本号,由于我是用的Spring Boot 2.3版本,在Spring Boot 2.x版本的parent中有维护InfluxDB的SDK版本,顾可以省略手动指定InfluxDB的SDK版本。

引入依赖配置如下:

<dependency>
    <groupId>org.influxdb</groupId>
    <artifactId>influxdb-java</artifactId>
</dependency>

5.3 配置InfluxDB连接

        这里需要在项目中配置InfluxDB的连接信息,比如连接地址、用户名、密码。

spring:
  influx:
    url: http://localhost:8086
    user: admin
    password:

注意:这里我们不需要再额外配置与其InfluxDB的连接属性了,虽然没有Spring data的支持,但在Spring Boot2.x版本中也实现了InfluxDB的自动化配置,所以这里只需要在配置中配置好如上三个属性即可正常使用了,具体配置属性如何注入且进行连接的可以去查看对于的源码:

org.springframework.boot.autoconfigure.influx.InfluxDbProperties

完成以上几步后,基础配置就完成了,接着我们就可以在代码中对其进行增删改查操作了。

5.4 模拟上报数据入库

        这里我们来简单模拟一个场景,创建一个定时任务来模拟数据的新增并保存到InfluxDB数据库中。具体演示代码如下:

package com.example.demo.service.impl;


import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.influxdb.InfluxDB;
import org.influxdb.dto.Point;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

import java.util.concurrent.TimeUnit;

@Service
@AllArgsConstructor
@Slf4j
public class InfluxDBMonitor {

    private InfluxDB influxDB;

    @Scheduled(fixedRate = 5000) //5秒执行一次
    public void InsertDataForInfluxDB() {
        //随机数字
        int count = (int) (Math.random() * 100);

        Point point = Point.measurement("test_count")     // 表名
                .tag("index", "index")  // 索引字段名
                .addField("count", count)        // 字段名1
                .addField("count_str", "str_" + count)        // 字段名2
                .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS)  // 时间
                .build();

        // 往test_count库插入数据
        influxDB.write("influx_demo", "autogen", point);

        log.info("写入数据库的count值为:" + count);
    }


}

如上定时插入数据的方法写好了,重启项目即可触发,但我们提前要先去准备创建好所对应的库。

5.5 测试

5.5.1 连接InfluxDB

先启动InfluxDB服务,不清楚具体如何启动的这里可以看我上一期教学《InfluxDB数据库如何本地搭建并使用》,如下就已经启动并连接ok了。

5.5.2 创建数据库

这里我们先创建好一个名为:Influx_demo 的库,具体语句如下:

//创建数据库语句
 CREATE DATABASE influx_demo

如上可见很明显是创建【influx_demo】数据库成功了。

注意: 数据库名称与上面代码方法InsertDataForInfluxDB()中定义的库名一致。 

5.5.3 查询数据库

5.5.4 启动Spring Boot项目

库已经创建好了,接着我们只需要触发我们刚写的定时插入数据的方法即可。

启动后,我们可以看到间隔5s就自动打印了一条count值,接下来,我们就是要验证数据是否被成功新增到【test_count】表中。

5.5.5 查询表数据

我们直接通过查询语句,验证数据是否被新增到【test_count】表中,查询语句如下:

select * from test_count;

如下是具体查询出来的结果: 

5.6 小结

        整体体验下来,最大的感触就是,如果项目的功能模块中用到对时间特性比较敏感的数据,例如性能监控,数据趋势走向等需求场景时,InfluxDB将会是一个不错的选择,虽然其很强很彪悍,但只要在使用的过程中遵循一定规范与适用场景,才能发挥其优秀的特性。

6. 热文推荐🔥

滴~如下推荐【Spring Boot 进阶篇】的学习大纲,请小伙伴们注意查收。

Spring Boot进阶(01):Spring Boot 集成 Redis,实现缓存自由

Spring Boot进阶(02):使用Validation进行参数校验

Spring Boot进阶(03):如何使用MyBatis-Plus实现字段的自动填充

Spring Boot进阶(04):如何使用MyBatis-Plus快速实现自定义sql分页

Spring Boot进阶(05):Spring Boot 整合RabbitMq,实现消息队列服务

Spring Boot进阶(06):Windows10系统搭建 RabbitMq Server 服务端

Spring Boot进阶(07):集成EasyPoi,实现Excel/Word的导入导出

Spring Boot进阶(08):集成EasyPoi,实现Excel/Word携带图片导出

Spring Boot进阶(09):集成EasyPoi,实现Excel文件多sheet导入导出

Spring Boot进阶(10):集成EasyPoi,实现Excel模板导出成PDF文件

Spring Boot进阶(11):Spring Boot 如何实现纯文本转成.csv格式文件?

Spring Boot进阶(12):Spring Boot 如何获取Excel sheet页的数量?

Spring Boot进阶(13):Spring Boot 如何获取@ApiModelProperty(value = “序列号“, name = “uuid“)中的value值name值?

Spring Boot进阶(14):Spring Boot 如何手动连接库并获取指定表结构?一文教会你

Spring Boot进阶(15):根据数据库连接信息指定分页查询表结构信息

Spring Boot进阶(16):Spring Boot 如何通过Redis实现手机号验证码功能?

Spring Boot进阶(17):Spring Boot如何在swagger2中配置header请求头等参数信息

Spring Boot进阶(18):SpringBoot如何使用@Scheduled创建定时任务?

Spring Boot进阶(19):Spring Boot 整合ElasticSearch

Spring Boot进阶(20):配置Jetty容器

Spring Boot进阶(21):配置Undertow容器

Spring Boot进阶(22):Tomcat与Undertow容器性能对比分析

Spring Boot进阶(23):实现文件上传

Spring Boot进阶(24):如何快速实现多文件上传?

Spring Boot进阶(25):文件上传的单元测试怎么写?

Spring Boot进阶(26):Mybatis 中 resultType、resultMap详解及实战教学

Spring Boot进阶(27):Spring Boot 整合 kafka(环境搭建+演示)

Spring Boot进阶(28):Jar包Linux后台启动部署及滚动日志查看,日志输出至实体文件保存

Spring Boot进阶(29):如何正确使用@PathVariable,@RequestParam、@RequestBody等注解?不会我教你,结合Postman演示

Spring Boot进阶(30):@RestController和@Controller 注解使用区别,实战演示

...

7. 文末🔥

        如果想系统性的学习Spring Boot,小伙伴们直接订阅bug菌专门为大家创建的Spring Boot专栏《滚雪球学Spring Boot》从入门到精通,从无到有,从零到一!以知识点+实例+项目的学习模式由浅入深对Spring Boot框架进行学习&使用。

        如果你有一定的基础却又想精进Spring Boot,那么《Spring Boot进阶实战》将会是你的最好的选择;此栏进行知识点+实例+项目的学习方式全面深入框架剖析及各种高阶玩法,励志打造全网最全最新springboot学习专栏,投资学习自己性价比最高。

        本文涉及所有源代码,均已上传至github开源,供同学们一对一参考,GitHub,同时,原创开源不易,欢迎给个star🌟,想体验下被加Star的感jio,非常感谢 ❗

       我是bug菌,一名想走👣出大山改变命运的程序猿。接下来的路还很长,都等待着我们去突破、去挑战。来吧,小伙伴们,我们一起加油!未来皆可期,fighting!

关注公众号,获取最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等硬核资源

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

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

相关文章

Docker vs. Podman: 选择容器技术的智慧之选

嗨&#xff0c;各位亲爱的程序员小伙伴们&#xff01;当我们步入容器技术的世界&#xff0c;往往会在众多选择中迷茫。两个备受瞩目的容器工具&#xff0c;Docker 和 Podman&#xff0c;都在业界掀起了一股风潮。今天&#xff0c;我将带你深入探索&#xff0c;为什么在 Docker …

day 40 | 139. 单词拆分

139. 单词拆分 首先要明确这个是求排列数&#xff0c;所以是先遍历背包&#xff0c;再遍历物品。 func wordBreak(s string, wordDict []string) bool {dp : make([]bool, len(s) 1)dp[0] truefor j : 1; j < len(s); j{for i : 0; i < len(wordDict); i{if j - len…

Sloare flare网卡信息

详细的安装信息 https://github.com/Xilinx-CNS/onload/tree/master/scripts 进行下载 Solarflare网卡开发:openonload 安装与调试_openonload安装_Erice_s的博客-CSDN博客 cns-sfnettest测试 cns-sfnettest 下载

李沐pytorch学习-BatchNormalization

一、意义 在使用较深的网络时&#xff0c;BatchNormalization&#xff08;批量归一化&#xff09;几乎是必需的&#xff0c;可以加速收敛。 对于图1所示的全连接层神经网络&#xff0c;输出节点的GroundTruth为&#xff0c;损失函数为&#xff0c;则损失对权重的梯度为&#xf…

char *str 与char str[]的区别与联系

char *str 与char str[]的区别与联系 常用以下两种方式定义字符串&#xff1a;一种是字符数组&#xff0c;另一种是指向字符串的指针。 文章目录 char *str 与char str[]的区别与联系一、基本概念区别二、名称含义区别三、底层属性区别1.char *str "abcdefgh"2.cha…

MDK 5.xx.0 + STM32F10x 笔记

天才脑袋比不上烂笔头, 写给自己看, 自用资料。 安装MDK STM32环境 Download MDK安装 MDK -> c:\keil_v5 用默认路径下载 ARMCC V5.06 Update 7 (build960) <- 长期稳定支持版本安装至 c:\keil_v5\arm\ARMCC开启 uVision.设定 预设编译程序版本 : V5.06 Update 7 (bui…

C# 学习笔记--个人学习使用 <1>

C# 学习笔记 Chapter 1 C# 比较软的基础部分Section 1 类与命名空间Part 1 命名空间 NameSpacePart 2 类 Class Section 2 基本元素Section 3 数据类型Part 1 什么是类型&#xff1f;Part 2 类型在 C Sharp 中的作用Part 3 C Sharp 中的数据类型 Section 4 变量、对象与内存Par…

GIthub 无法访问使用Watt Toolkit加速

一、使用 Watt Toolkit Watt Toolkit 是一款加速软件&#xff0c;原名是 Steam&#xff0c;后来改名为 Watt Toolkit&#xff0c;其可以让原本无法访问的 Steam 游戏社区、 GitHub 、谷歌验证码等国内难以访问的网页正常访问。 三种下载方式&#xff1a; Watt Toolkit 官网下…

STM32的时钟系统

今天&#xff0c;学习了STM32的时钟系统&#xff0c;如下为stm32的时钟树。

[牛客复盘] 牛客周赛 Round 9 20230827

[牛客复盘] 牛客周赛 Round 9 20230827 总结小美的外卖订单编号1. 题目描述2. 思路分析3. 代码实现 小美的加法1. 题目描述2. 思路分析3. 代码实现 小美的01串翻转1. 题目描述2. 思路分析3. 代码实现 小美的数组操作1. 题目描述2. 思路分析3. 代码实现 六、参考链接 总结 又是…

Linux c++开发-02-g++命令行编译

有如下的文件目录结构 格式一 swap.h swap.cpp main.cpp 编译方法和结果如下&#xff1a; 格式二 swap.cpp main.cpp 使用命令&#xff1a;g main.cpp src/swap.cpp -o main.exe 解决方法使用参数 -I 格式三-将swap.cpp生成一个静态库然后链接到main.cpp中 生成…

某人事系统架构搭建设计记录

首发博客地址 https://blog.zysicyj.top/ 先大致列一下基础情况 架构必须是微服务 场景上涉及大量查询操作&#xff0c;分析操作 并发并不高 对高可用要求较高&#xff0c;不能挂掉 对安全要求高 要能过等保测试等三方测试 使用人数并不多&#xff0c;十万内 涉及很多在线编辑&…

多线程学习之解决线程同步的实现方法

一、卖票的多线程实现 需求&#xff1a;共有100张票&#xff0c;而它有3个窗口卖票&#xff0c;请设计一个程序模拟该电影院卖票 代码实现&#xff1a; /*** Author&#xff1a;kkoneone11* name&#xff1a;SellTicket1* Date&#xff1a;2023/8/26 11:32*/ public class S…

mit s0681 lab2 Trace系统调用实现

实验一 实现一个用户级别的程序&#xff0c;功能为&#xff0c;指定系统调用后&#xff0c;跟踪程序的系统调用情况 分析实验 实验目标为实现一个程序去跟踪指定程序的系统调用。因此目标有两个 实现一个程序跟踪目标程序的系统调用 实现1&#xff0c;就需要在用户这边实…

六、Json 数据的交互处理

文章目录 一、JSON 数据的交互处理1、为什么要使用 JSON2、JSON 和 JavaScript 之间的关系3、前端操作 JSON3.1 JavaScript 对象与 JSON 字符串之间的相互转换 4、JAVA 操作 JSON4.1 Json 的解析工具&#xff08;Gson、FastJson、Jackson&#xff09;4.2 ResponseBody 注解、Re…

爬虫(bilibili热门课程记录)

什么是爬虫&#xff1f;程序蜘蛛&#xff0c;沿着互联网获取相关信息&#xff0c;收集目标信息。 一、python环境安装 1、先从Download Python | Python.org中下载最新版本的python解释器 2、再从Download PyCharm: Python IDE for Professional Developers by JetBrains中下…

关于msvcp140.dll丢失的解决方法,分享最简单详细的解决方法

今天&#xff0c;我将为大家详细介绍一种常见的问题——msvcp140.dll丢失&#xff0c;并提供四种不同的解决方法。希望通过这次分享&#xff0c;能够帮助大家解决这个问题&#xff0c;提高电脑使用效率。 首先&#xff0c;让我们来了解一下msvcp140.dll文件。msvcp140.dll是Mi…

JavaScript中的事件循环(Event Loop)

1. 概述 javaScript是单线程的&#xff0c;意味着它一次只能执行一个任务。然而&#xff0c;许多操作&#xff0c;如网络请求、定时器等&#xff0c;都会导致延迟&#xff0c;如果程序在等待这些操作完成时&#xff0c;可能会操作一个阻塞的效果&#xff0c;影响用户体验。这个…

设计模式之命令模式(Command)的C++实现

1、命令模式的提出 在软件开发过程中&#xff0c;“行为请求者”和“行为实现者”通常呈现一种“紧耦合”&#xff0c;如果行为的实现经常变化&#xff0c;则不利于代码的维护。命令模式可以将行为的请求者和行为的实现者进行解耦。具体流程是将行为请求者封装成一个对象&…

Git企业开发控制理论和实操-从入门到深入(六)|多人协作开发

前言 那么这里博主先安利一些干货满满的专栏了&#xff01; 首先是博主的高质量博客的汇总&#xff0c;这个专栏里面的博客&#xff0c;都是博主最最用心写的一部分&#xff0c;干货满满&#xff0c;希望对大家有帮助。 高质量博客汇总 然后就是博主最近最花时间的一个专栏…