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

【开发】中间件——MongoDB

MongoDB是一个基于分布式(海量数据存储)文件存储的数据库。

MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的,它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。

实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

官网:https://www.mongodb.com/


MongoDB

  • 简介
  • 基本使用
  • JavaAPI
  • SpringBoot整合

MongoDB

基本概念

SQL术语MongoDB术语解释/说明
databasedatabase数据库
tablecollection数据库表/集合
rowdocument数据记录行/文档
columnfield数据字段/域
indexindex索引
table joins表连接,MongoDB不支持
primary keyprimary key主键,MongoDB自动将_id字段设置为主键

命令行操作

docker安装MongoDB

#拉取镜像
docker pull mongo#创建容器
docker create --name mongodb -p 27017:27017 -v /data/mongodb-data:/data/db mongo#启动容器
docker start mongodb#进入容器
docker exec -it mongodb /bin/bash
#使用MongoDB客户端进行操作
mongo#查询所有的数据库
show dbs

表操作

#查看所有的数据库
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB#通过use关键字切换数据库
> use admin
switched to db admin#创建数据库
#说明:在MongoDB中,数据库是自动创建的,通过use切换到新数据库中,进行插入数据即可自动创建数据库
> use testdb #并没有创建数据库
switched to db testdb
> show dbs 
admin 0.000GB
config 0.000GB
local 0.000GB> db.user.insert({id:1,name:'zhangsan'}) #插入数据
WriteResult({ "nInserted" : 1 })
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
testdb 0.000GB #数据库自动创建#查看表
> show tables
user
> show collections
user#删除集合(表)
> db.user.drop()
true #如果成功删除选定集合,则 drop() 方法返回 true,否则返回 false。#删除数据库
> use testdb #先切换到要删除的数据中
switched to db testdb> db.dropDatabase() #删除数据库
{ "dropped" : "testdb", "ok" : 1 }
> show dbs
admin 0.000GB
config 0.000GB
local 0.000G

新增数据

在MongoDB中,存储的文档结构是一种类似于json的结构,称之为bson(全称为:Binary JSON)

语法:db.COLLECTION_NAME.insert(document)

> db.user.insert({id:1,username:'zhangsan',age:20})
WriteResult({ "nInserted" : 1 })
> db.user.save({id:2,username:'lisi',age:25})
WriteResult({ "nInserted" : 1 })> db.user.find() #查询数据
{ "_id" : ObjectId("5c08c0024b318926e0c1f6dc"), "id" : 1, "username" : "zhangsan",
"age" : 20 }
{ "_id" : ObjectId("5c08c0134b318926e0c1f6dd"), "id" : 2, "username" : "lisi",
"age" : 25 }

查询数据

db.user.find([query],[fields])

query :可选,使用查询操作符指定查询条件
fields :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)

db.col.find().pretty() 以格式化的方式来显示所有文档

含义格式范例
等于{\<key>:\<value> }db.col.find({“by”:“黑马程序员”}).pretty()
小于{<key>:{$lt: <value>}} db.col.find({“likes”: {$lt:50}}).pretty()
小于或 等于{<key>:{$lte: <value>}} db.col.find({“likes”: {$lte:50}}).pretty()
大于{<key>:{$gt: <value>}}db.col.find({“likes”: {$gt:50}}).pretty()
大于或 等于{<key>:{$gte: <value>}}db.col.find({“likes”: {$gte:50}}).pretty()
不等于{<key>:{$ne: <value>}}db.col.find({“likes”: {$ne:50}}).pretty()
#查询全部数据
db.user.find() #只查询id与username字段
db.user.find({},{id:1,username:1})#查询数据条数
db.user.find().count() #查询id为1的数据
db.user.find({id:1}) #查询小于等于21的数据
db.user.find({age:{$lte:21}})#and查询,age小于等于21并且id大于等于2
db.user.find({age:{$lte:21}, id:{$gte:2}})#查询id=1 or id=2
db.user.find({$or:[{id:1},{id:2}]}) #分页查询:Skip()跳过几条,limit()查询条数
db.user.find().limit(2).skip(1) #跳过1条数据,查询2条数据db.user.find().sort({id:-1}) #按照age倒序排序,-1为倒序,1为正序

更新数据

update() 方法用于更新已存在的文档

db.collection.update(<query>,<update>,[upsert: <boolean>,multi: <boolean>,writeConcern: <document>]
)  
  • query : update的查询条件
  • update : update的对象和一些更新的操作符(如 inc…)等,
  • upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
  • multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条
    记录全部更新。
  • writeConcern :可选,抛出异常的级别
> db.user.update({id:1},{$set:{age:22}}) #更新数据
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
  • nMatched:数据匹配数量
  • nUpserted:匹配不存在时更新数量
  • nModified:修改数量
#注意:如果这样写,会删除掉其他的字段
> db.user.update({id:1},{age:25})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })> db.user.find()
{ "_id" : ObjectId("5c08c0024b318926e0c1f6dc"), "age" : 25 }
{ "_id" : ObjectId("5c08c0134b318926e0c1f6dd"), "id" : 2, "username" : "lisi",
"age" : 25 }
#更新不存在的字段,会新增字段
> db.user.update({id:2},{$set:{sex:1}}) #更新数据
> db.user.find()
{ "_id" : ObjectId("5c08c0024b318926e0c1f6dc"), "age" : 25 }
{ "_id" : ObjectId("5c08c0134b318926e0c1f6dd"), "id" : 2, "username" : "lisi",
"age" : 25, "sex" : 1 }
#更新不存在的数据,默认不会新增数据
> db.user.update({id:3},{$set:{sex:1}})
WriteResult({ "nMatched" : 0, "nUpserted" : 0, "nModified" : 0 })> db.user.find()
{ "_id" : ObjectId("5c08c0024b318926e0c1f6dc"), "age" : 25 }
{ "_id" : ObjectId("5c08c0134b318926e0c1f6dd"), "id" : 2, "username" : "lisi",
"age" : 25, "sex" : 1 }#如果设置第一个参数为true,就是新增数据
> db.user.update({id:3},{$set:{sex:1}},true)
WriteResult({
"nMatched" : 0,
"nUpserted" : 1,
"nModified" : 0,
"_id" : ObjectId("5c08cb281418d073246bc642")
})

删除数据

db.collection.remove(<query>,{justOne: <boolean>,writeConcern: <document>}
)  
  • query :(可选)删除的文档的条件。
  • justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。
  • writeConcern :(可选)抛出异常的级别。
> db.user.remove({age:25})
WriteResult({ "nRemoved" : 2 }) #删除了2条数据#插入4条测试数据
db.user.insert({id:1,username:'zhangsan',age:20})
db.user.insert({id:2,username:'lisi',age:21})
db.user.insert({id:3,username:'wangwu',age:22})
db.user.insert({id:4,username:'zhaoliu',age:22})> db.user.remove({age:22},true)
WriteResult({ "nRemoved" : 1 }) #删除了1条数据#删除所有数据
> db.user.remove({})
#说明:为了简化操作,官方推荐使用deleteOne()与deleteMany()进行删除数据操作。
db.user.deleteOne({id:1})
db.user.deleteMany({}) #删除所有数据

索引

MongoDB在读取数据时必须扫描集合中的每个文件并选取
那些符合查询条件的记录。这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。

索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构 ,索引通常能够极大的提高查询的效率

查看索引

#查看索引
> db.user.getIndexes()
[{"v" : 2,#索引版本"key" : {#索引字段"_id" : 1 #正序还是倒序},"name" : "_id_",#索引名"ns" : "testdb.user" #命名空间}
]
#说明:1表示升序创建索引,-1表示降序创建索引

创建索引

#创建索引
> db.user.createIndex({'age':1})
{"createdCollectionAutomatically" : false,"numIndexesBefore" : 1,"numIndexesAfter" : 2,"ok" : 1
}

删除索引

#删除索引
db.user.dropIndex("age_1")
#或者,删除除了_id之外的索引
db.user.dropIndexes()

创建联合索引

#创建联合索引
db.user.createIndex({'age':1, 'id':-1})

查看索引大小

#查看索引大小,单位:字节
db.user.totalIndexSize()

执行详情

MongoDB 查询分析可以确保我们建议的索引是否有效,是查询语句性能分析的重要工具

MongoDB内部使用的是JS引擎,编写JS脚本执行循环语句

#插入1000条数据
for(var i=1;i<1000;i++)db.users.insert({id:100+i,username:'name_'+i,age:10+i})
#查看执行计划
> db.user.find({age:{$gt:100},id:{$lt:200}}).explain(){"queryPlanner" : {"plannerVersion" : 1,"namespace" : "testdb.user","indexFilterSet" : false,"parsedQuery" : {"$and" : [{"id" : {"$lt" : 200}},{"age" : {"$gt" : 100}}]},"winningPlan" : { #最佳执行计划"stage" : "FETCH", #查询方式,
#COLLSCAN/全表扫描 < IXSCAN/索引扫描 < FETCH/根据索引去检索文档 < SHARD_MERGE/合并分片结果 < IDHACK/针对_id进行查询"inputStage" : {"stage" : "IXSCAN","keyPattern" : {"age" : 1,"id" : -1},"indexName" : "age_1_id_-1","isMultiKey" : false,"multiKeyPaths" : {"age" : [ ],"id" : [ ]},"isUnique" : false,"isSparse" : false,"isPartial" : false,"indexVersion" : 2,"direction" : "forward","indexBounds" : {"age" : ["(100.0, inf.0]"],"id" : ["(200.0, -inf.0]"]}}},"rejectedPlans" : [ ]},"serverInfo" : {"host" : "c493d5ff750a","port" : 27017,"version" : "4.0.3","gitVersion" : "7ea530946fa7880364d88c8d8b6026bbc9ffa48c"},"ok" : 1
}

GUI——robo 3T

通过javaApi操作

创建工程

com-mongodb

com-mongodb

pom.xml

<dependencies><dependency><groupId>org.mongodb</groupId><artifactId>mongodb-driver-sync</artifactId><version>3.9.1</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.4</version></dependency>
</dependencies><build><plugins><!-- java编译插件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.2</version><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin></plugins>
</build>

Demo

如何连接到MongoDB,如何选择数据库、表,进行查询的操作

package com.mongodb;import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;public class MongodbDemo {public static void main(String[] args) {//建立连接MongoClient mongoClient = MongoClients.create("mongodb://8.140.130.91:27017");//选择数据库MongoDatabase mongoDatabase = mongoClient.getDatabase("testdb");//选择表MongoCollection<Document> userCollection = mongoDatabase.getCollection("user");//查询表for (Document document : userCollection.find().limit(10)) {System.out.println(document.toJson());}mongoClient.close();}
}

CRUD操作

初始化建立连接

package com.mongodb;import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Filters;
import org.bson.Document;
import org.junit.Before;
import org.junit.Test;public class TestCRUD {private MongoCollection<Document> mongoCollection;@Beforepublic void init(){//建立连接MongoClient mongoClient = MongoClients.create("mongodb://8.140.130.91:27017");//选择数据库MongoDatabase mongoDatabase = mongoClient.getDatabase("testdb");//选择表this.mongoCollection = mongoDatabase.getCollection("users");}
}

查询

  • 组合查询
// 复杂查询age<=50并且id>=100的用户信息,并且按照id倒序排序,只返回id,age字段,不返回_id字段
@Test
public void testQuery(){for (Document document : this.mongoCollection.find(Filters.and(Filters.lte("age",50),Filters.gte("id",100)))) {System.out.println(document);}
}

在这里插入图片描述

  • 排序
// 复杂查询age<=50并且id>=100的用户信息,并且按照id倒序排序,只返回id,age字段,不返回_id字段
@Test
public void testQuery(){for (Document document : this.mongoCollection.find(Filters.and(Filters.lte("age",50),Filters.gte("id",100))).sort(Sorts.descending("id"))//降序) {System.out.println(document);}
}

在这里插入图片描述

  • 指定属性
// 复杂查询age<=50并且id>=100的用户信息,并且按照id倒序排序,只返回id,age字段,不返回_id字段
@Test
public void testQuery(){for (Document document : this.mongoCollection.find(Filters.and(Filters.lte("age",50),Filters.gte("id",100))).sort(Sorts.descending("id"))//降序.projection(Projections.fields(Projections.include("id","age"),Projections.excludeId()//排除ObjectID))) {System.out.println(document);}
}

在这里插入图片描述

新增数据

@Test
public void testInsert(){Document document = new Document("id",10002).append("name", "张三").append("age", 30);this.mongoCollection.insertOne(document);System.out.println("插入数据");for (Document document1 : this.mongoCollection.find(Filters.eq("id",10002))) {System.out.println(document1.toJson());}
}

在这里插入图片描述

测试删除

@Test
public void testDelete(){DeleteResult result = this.mongoCollection.deleteOne(Filters.eq("id",10002));System.out.println(result);
}

在这里插入图片描述

测试更新

@Test
public void testUpdate(){UpdateResult result = this.mongoCollection.updateOne(Filters.eq("id",10001), Updates.set("age",25));System.out.println(result);for (Document doc : this.mongoCollection.find(Filters.eq("id", 10001))) {System.out.println(doc.toJson());}
}

在这里插入图片描述

面向对象操作

前面对MongoDB的操作都是基于Document对象操作,操作略显繁琐

创建Person、Address

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person {private ObjectId id;private String name;private int age;private Address address;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Address {private String street;private String city;private String zip;
}

建立连接

MongoCollection<Person> personCollection;@Before
public void init(){//定义对象的解码注册器CodecRegistry pojoCodecRegistry = CodecRegistries.fromRegistries(MongoClientSettings.getDefaultCodecRegistry(),CodecRegistries.fromProviders(PojoCodecProvider.builder().automatic(true).build()));//建立连接MongoClient mongoClient = MongoClients.create("mongodb://8.140.130.91:27017");//选择数据库 并且 注册解码器MongoDatabase mongoDatabase = mongoClient.getDatabase("testdb").withCodecRegistry(pojoCodecRegistry);//选择表this.personCollection = mongoDatabase.getCollection("person",Person.class);
}

新增一条数据

@Test
public void testInsert(){Person person = new Person(ObjectId.get(), "张三", 20,new Address("人民路", "上海市", "666666"));this.personCollection.insertOne(person);System.out.println("插入数据成功");System.out.println("======");for (Person person1 : this.personCollection.find(Filters.eq("name", "张三"))) {System.out.println(person1);}
}

在这里插入图片描述

新增很多数据

@Test
public void testInserts() {List<Person> personList = Arrays.asList(new Person(ObjectId.get(), "张三", 20, new Address("人民路", "上海市", "666666")),new Person(ObjectId.get(), "李四", 21, new Address("北京西路", "上海市", "666666")),new Person(ObjectId.get(), "王五", 22, new Address("南京东路", "上海市", "666666")),new Person(ObjectId.get(), "赵六", 23, new Address("陕西南路", "上海市", "666666")),new Person(ObjectId.get(), "孙七", 24, new Address("南京西路", "上海市", "666666")));this.personCollection.insertMany(personList);System.out.println("插入数据成功");System.out.println("=====");testQuery();
}

在这里插入图片描述

删除单条数据

@Test
public void testDelete(){DeleteResult result = this.personCollection.deleteOne(Filters.eq("name","张三"));System.out.println(result);
}

在这里插入图片描述

SpringBoot整合MongoDB

spring-data对MongoDB做了支持,使用spring-data-mongodb可以简化MongoDB的操作

https://spring.io/projects/spring-data-mongodb

导入依赖

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.4.3</version>
</parent><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope>
</dependency>

配置文件

# Spring boot application
spring.application.name = example-mongodb
spring.data.mongodb.uri=mongodb://8.140.130.91:27017/testdb

PersonDao

package com.mongodb.spring.dao;import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;
import com.mongodb.pojo.Person;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Component;
import org.springframework.data.mongodb.core.query.Query;import java.util.List;@Component
public class PersonDao {@AutowiredMongoTemplate mongoTemplate;public Person savePerson(Person person){//默认集合名与实体名同名Person savedPerson = this.mongoTemplate.save(person);return savedPerson;}public List<Person> queryPersonListByName(String name) {Query query = Query.query(Criteria.where("name").is(name));return this.mongoTemplate.find(query,Person.class);}/** 分页查询* */public List<Person> queryPersonListByPage(Integer page, Integer rows) {Query query = new Query().limit(rows).skip((page - 1) * rows);return this.mongoTemplate.find(query, Person.class);}/** 更新数据* */public UpdateResult update(Person person){Query query = Query.query(Criteria.where("id").is(person.getId()));Update update = Update.update("age",person.getAge());return this.mongoTemplate.updateMulti(query,update,Person.class);}/** 删除数据* */public DeleteResult deleteResultById(String id){Query query = Query.query(Criteria.where("id").is(id));return this.mongoTemplate.remove(query,Person.class);}
}

编写启动类

package com.mongodb.spring;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class MongoApplication {public static void main(String[] args) {SpringApplication.run(MongoApplication.class,args);}
}

测试单元

package com.mongodb.spring;import com.mongodb.client.result.UpdateResult;
import com.mongodb.spring.dao.PersonDao;
import com.mongodb.pojo.Address;
import com.mongodb.pojo.Person;
import org.bson.types.ObjectId;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;import java.util.List;@RunWith(SpringRunner.class)
@SpringBootTest
public class TestPersonDao {@Autowiredprivate PersonDao personDao;/** 新增* */@Testpublic void testSave(){Person person =new Person(ObjectId.get(), "张三", 20, new Address("人民路", "上海市", "666666"));System.out.println(this.personDao.savePerson(person));;}@Testpublic void testQuery() {List<Person> personList = this.personDao.queryPersonListByName("张三");for (Person person : personList) {System.out.println(person);}}@Testpublic void testQueryByPage(){List<Person> personList = this.personDao.queryPersonListByPage(1,3);for (Person person : personList) {System.out.println(person);}}@Testpublic void testUpdate() {Person person = new Person();person.setId(new ObjectId("60667404d8d68907198c10f3"));person.setAge(30);UpdateResult updateResult = this.personDao.update(person);System.out.println(updateResult);}@Testpublic void testDelete(){System.out.println(this.personDao.deleteResultById("6065d8edaccf9851f047b2d3"));}
}

相关文章:

【开发】中间件——MongoDB

MongoDB是一个基于分布式&#xff08;海量数据存储&#xff09;文件存储的数据库。 MongoDB是一个介于关系数据库和非关系数据库之间的产品&#xff0c;是非关系数据库当中功能最丰富&#xff0c;最像关系数据库的&#xff0c;它支持的数据结构非常松散&#xff0c;是类似json…...

C++进阶 — 【C++11】

目录 一、 C11简介 二、 统一的列表初始化 1.&#xff5b;&#xff5d;初始化 2. initializer_list 三、声明 1. auto 2. decltype 3. nullptr 四、范围for循环 五、STL中一些变化 1. 提供了一些新容器 2.容器中增加了一些新方法 六、右值引用和移动语义 1. 左值引用和右…...

Mac安装Homebrew

1.前往Homebrew官网&#xff0c;复制官网的安装命令 https://brew.sh/ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"安装结束后&#xff0c;记得仔细看脚本执行最后的提示&#xff0c;需要我们复制两行命令执…...

【详细】利用VS2019创建Web项目,并发送到IIS,以及IIS与ASP.NET配置

一、打开VS2019选择创建新项目【最好以管理员身份运行VS2019&#xff0c;后面发布网站时需要以管理员身份&#xff0c;避免后面还要重启&#xff0c;可以一开始就以管理员身份运行】 二、选择语言为C#&#xff0c;然后选择“ASP.NET Web应用程序&#xff08;.NET Framework&…...

FasterRcnn,Yolov2,Yolov3中的Label Assignment机制 和 ATSS

一般把anchor到gt之间如何匹配的方法称为label assignment&#xff0c;也就是给预设的anchor打上正负样本等标签&#xff0c;方便我们后续进一步回归。 其实RPN和Yolo有各自的label assignment方法&#xff0c; 在Faster rcnn&#xff0c;yolo&#xff0c;RetinaNet中&#xf…...

使用Java技术WebSocket创建聊天、群聊,实现好友列表,添加好友,好友分组,聊天记录查询功能。

文章目录 引入依赖主要代码配置WebSocket创建通讯完整后台项目代码下载WebSocket的由来: 之前只有一个http协议,http协议是请求响应,存在缺陷,就是请求只能由客户端发起,然后请求到服务器,服务器做响应,但是如果服务器状态做了改变,客户端并不能即使的更新,之前的是按照…...

【Redis07】Redis基础:Bitmap 与 HyperLogLog 相关操作

Redis基础学习&#xff1a;Bitmap 与 HyperLogLog 相关操作继续进行 Redis 基础部分的学习&#xff0c;今天我们学习的是两种另外的数据类型。说是数据类型&#xff0c;但其实它们实际上使用的都是 String 类型做为底层基础&#xff0c;只不过是在存储的时候进行了一些特殊的操…...

华为路由器 VRRP主备配置

组网需求 如下图所示&#xff0c;PC1通过SW1双归属到R1和R2。为保证用户的各种业务在网络传输中不中断&#xff0c;需在R1和R2上配置VRRP主备备份功能。 正常情况下&#xff0c;主机以R1为默认网关接入Internet&#xff0c;当R1故障时&#xff0c;R2接替R1作为网关继续进行工作…...

docker容器安装ES

1.拉取镜像 docker pull elasticsearch:6.5.42.修改别名 docker tag [容器ID] es65:6.5.42.启动应用 docker run -it -d -p 9200:9200 -p 9300:9300 --name es -e ES_JAVA_OPTS"-Xms128m -Xmx128m" es65:6.5.43.拷贝配置文件到宿主机 docker cp es:/usr/share/ela…...

Python Module — prompt_toolkit CLI 库

目录 文章目录目录prompt_toolkit示例化历史记录热键自动补全多行输入Python 代码高亮自定义样式prompt_toolkit prompt_toolkit 是一个用于构建 CLI 应用程序的 Python 库&#xff0c;可以让我们轻松地构建强大的交互式命令行应用程序。 自动补全&#xff1a;当用户输入命令…...

springboot mybatis-plus 调用 sqlserver 的 存储过程 返回值问题

问题&#xff1a; 在使用 mybatis-plus 调用sqlserver 存储过程 没有返回值 经过资料查找 注意点 此处使用Map传参&#xff0c;原因在于存储过程的返回值&#xff0c;通常在参数定义中实现&#xff0c;如In 入参、out 出参。 这样当执行后有结果返回时&#xff0c;则可以将结…...

【0180】PG内核读取pg_hba.conf并创建HbaLine记录(1)

文章目录 1. pg_hba.conf文件是什么?2. postmaster何时读取pg_hba.conf?2.1 pg内核使用pg_hba.conf完成客户端认证的原理2.2 读取pg_hba.conf的几个模块3. pg内核读取pg_hba.conf过程3.1 VFD机制获取文件描述符3.2 根据fd读取文件内容相关阅读: 【0178】DBeaver、pgAdmin I…...

【原型设计工具】​​上海道宁为您提供Justinmind,助力您在几分钟内形成原型,并现场测试,无需编写任何代码

Justinmind是用于 Web和应用程序的原型制作工具 在几分钟内形成原型 并在现场进行测试 无需编写任何代码 单击一下即可轻松在线获取您的设计 并与整个团队共享 享受高效的沟通和快速反馈 以实现持续改进和利益相关者的支持 开发商介绍 JustinMind是由西班牙JustinMind公…...

计算机网络中---HDLP协议和PPP协议

目录 HDLC协议PPP协议HDLC协议和PPP协议HDLC协议 HDLC协议【高级数据链路控制协议】是一种数据链路层协议,用于在两个节点之间传输数据。以下是HDLC协议的重点知识: HDLC协议定义了一种标准的帧格式,包括起始标志、地址字段、控制字段、信息字段、校验字段和结束标志。HDLC…...

k8s之节点kubelet预留资源配置

k8s之kubelet预留资源配置1 前言2 预留资源Kube-reservedSystem-reservedEviction Thresholds实施节点可分配约束3 Pod优先级4 生产应用配置文件重启kubelet服务查看节点资源1 前言 最近k8s在使用过程中遇到这样一个问题 由于Pod没有对内存及CPU进行限制&#xff0c;导致Pod在…...

机器学习笔记之前馈神经网络(四)反向传播算法[数学推导过程]

机器学习笔记之前馈神经网络——反向传播算法[数学推导过程]引言回顾&#xff1a;感知机算法非线性问题与多层感知机反向传播算法(BackPropagation,BP\text{BackPropagation,BP}BackPropagation,BP)场景构建求解各权重更新量图示描述反向传播过程总结引言 上一节介绍了M-P\tex…...

vscode+elementui校园跑腿系统 nodejs+vue

本系统从用户的角度出发&#xff0c;结合当前的校园环境而开发的&#xff0c;在开发语言上是使用的Java语言&#xff0c;在框架上我们是使用的Vue框架&#xff0c;数据库方面使用的是MySQL数据库&#xff0c;开发工具为IDEA。 基于Vue的校园跑腿管理系统中的管理员配送用户都可…...

[蓝桥杯单片机8]定时器的简单应用

1、本实验内容 利用51单片机的定时/计数器T0的模式1实现间隔定时&#xff0c;每隔1秒L1指示灯闪烁一下&#xff0c;也就是点亮0.5秒&#xff0c;熄灭0.5秒&#xff1b;每隔2秒L8指示灯闪烁一下&#xff0c;即点亮1秒&#xff0c;熄灭1秒。2、基础知识 定时/计数器&#xff0c;是…...

node-HTTP协议

文章目录一. 概念二. 请求报文的组成三.HTTP请求行四.HTTP请求头五.HTTP的请求体六.响应报文的组成七.创建HTTP服务八.获取HTTP请求报文九.HTTP设置响应十.GET和POST请求的区别一. 概念 HTTP协议. 中文叫超文本传输协议; 是一种基于TCP/IP的应用层通信协议; 这个协议详细规定了…...

基于springboot+vue的地方美食分享网站

081-springboot基于vue的地方美食分享网站开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&am…...

MCP协议实战:为AI智能体构建标准化地址查询工具

1. 项目概述与核心价值最近在折腾AI应用开发&#xff0c;特别是想给大语言模型&#xff08;LLM&#xff09;装上“手”和“眼睛”&#xff0c;让它能主动去操作外部系统、查询实时数据。在这个过程中&#xff0c;一个绕不开的概念就是“工具调用”&#xff08;Tool Calling&…...

STM32的RTC掉电还能走时?深入聊聊后备域和纽扣电池那点事

STM32的RTC掉电还能走时&#xff1f;深入聊聊后备域和纽扣电池那点事 当你在深夜调试STM32的RTC功能时&#xff0c;是否曾好奇过这个小巧的实时时钟为何能在主电源断开后依然精准走时&#xff1f;这背后隐藏着STM32芯片设计中一个精妙的电源管理机制——后备域&#xff08;Back…...

告别日志硬编码:BizLog组件在SpringBoot中的实战应用指南

1. 为什么我们需要BizLog组件 记得去年接手一个电商项目时&#xff0c;遇到一个典型问题&#xff1a;产品经理要求在用户下单、修改订单、取消订单等关键操作时&#xff0c;都要记录详细的操作日志。刚开始我直接在业务代码里写日志记录逻辑&#xff0c;结果不到一个月就发现代…...

AI智能体操作系统Agent-OS:架构、实现与生产部署指南

1. 项目概述&#xff1a;一个为AI智能体设计的操作系统最近在AI智能体开发领域&#xff0c;一个名为“Agent-OS”的项目引起了我的注意。这个项目由 factspark23-hash 团队开源&#xff0c;它不是一个传统意义上的操作系统&#xff0c;比如Windows或Linux&#xff0c;而是一个专…...

深度解析Beyond Compare 5密钥生成:从逆向工程到高效激活的实用指南

深度解析Beyond Compare 5密钥生成&#xff1a;从逆向工程到高效激活的实用指南 【免费下载链接】BCompare_Keygen Keygen for BCompare 5 项目地址: https://gitcode.com/gh_mirrors/bc/BCompare_Keygen 在软件授权验证领域&#xff0c;Beyond Compare 5的RSA加密机制一…...

Microsoft Defender for Cloud AI工作负载安全:防范越狱攻击的终极方案

Microsoft Defender for Cloud AI工作负载安全&#xff1a;防范越狱攻击的终极方案 【免费下载链接】Microsoft-Defender-for-Cloud Welcome to the Microsoft Defender for Cloud community repository 项目地址: https://gitcode.com/gh_mirrors/mi/Microsoft-Defender-for…...

技术Leader的“预期管理”艺术:承诺80分,交付100分

在软件测试领域&#xff0c;我们擅长用技术手段管理缺陷、管理风险&#xff0c;却常常忽略一项更重要的软技能——管理上级的预期。许多测试Leader带着一身硬本领走上管理岗位&#xff0c;却在“预期差”上栽了跟头&#xff1a;明明团队加班加点测出了所有P0级缺陷&#xff0c;…...

Cursor插件开发实战:基于LSP与静态分析的代码导航增强

1. 项目概述&#xff1a;一个为开发者“减负”的Cursor插件如果你和我一样&#xff0c;日常开发重度依赖Cursor这款AI驱动的代码编辑器&#xff0c;那你肯定也经历过这样的时刻&#xff1a;面对一个陌生的代码库&#xff0c;想快速了解某个函数、类或者变量的定义位置&#xff…...

Godot引擎集成Wwise音频中间件:从原理到实战的完整指南

1. 项目概述&#xff1a;当AAA级音频引擎遇见开源游戏引擎如果你是一位使用Godot引擎的游戏开发者&#xff0c;并且对游戏音频的品质有追求&#xff0c;那么你很可能听说过Wwise。Wwise&#xff0c;全称Audiokinetic Wwise&#xff0c;是游戏音频领域的行业标准&#xff0c;从《…...

粒子物理实验中的异构计算与AI技术应用

1. 粒子物理实验的计算挑战与机遇 粒子物理实验正经历前所未有的数据爆炸时代。以大型强子对撞机&#xff08;HL-LHC&#xff09;为例&#xff0c;其升级后的数据采集率将达到每秒数PB级别&#xff0c;这相当于每天产生约1亿张高清照片的数据量。传统基于CPU的串行计算架构已无…...