九:爬虫-MongoDB基础
MongoDB介绍
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
为什么要使用nosql?
Nosql简介NoSQL,指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。NoSQL用于超大规模数据的存储。(例如谷歌或Facebook每天为他们的用户收集万亿比特的数据)。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。
- 发展现状
- 现今的计算机体系结构在数据存储方面要求应用架构具备庞大的水平扩展性,而
NoSQL正在致力于改变这一现状。目前新浪微博的Redis和Google的Bigtable以及Amazon的SimpleDB使用的就是NoSQL型数据库 NoSQL项目的名字上看不出什么相同之处,但是,它们通常在某些方面相同:它们可以处理超大量的数据- 这场革命目前仍然需要等待。
NoSQL对大型企业来说还不是主流,但是,一两年之后很可能就会变个样子。在NoSQL运动的最新一次聚会中,来自世界各地的 150 人挤满了CBS Interactive的一间会议室。分享他们如何推翻缓慢而昂贵的关系数据库的暴政,怎样使用更有效和更便宜的方法来管理数据 - 关系型数据库给你强加了太多东西。它们要你强行修改对象数据,以满足数据库系统的需要。在
NoSQL拥护者们来看,基于NoSQL的数据库替代方案“只是给你所需要的”
- 现今的计算机体系结构在数据存储方面要求应用架构具备庞大的水平扩展性,而
Nosql特点- 1 它可以处理超大量的数据
- 2 它运行在便宜的 PC 服务器集群上 PC
- 集群扩充起来非常方便并且成本很低,避免了传统商业数据库“
sharding”操作的复杂性和成本。
- 集群扩充起来非常方便并且成本很低,避免了传统商业数据库“
- 3 它击碎了性能瓶颈
NoSQL的支持者称,通过NoSQL架构可以省去将Web或Java应用和数据转换成SQL格式的时间,执行速度变得更快。“SQL并非适用于所有的程序代码”,对于那些繁重的重复操作的数据,SQL值得花钱。但是当数据库结构非常简单时,SQL可能没有太大用处
- 4 它没有过多的操作
- 虽然
NoSQL的支持者也承认关系型数据库提供了无可比拟的功能集合,而且在数据完整性上也发挥绝对稳定,他们同时也表示,企业的具体需求可能没有那么复杂
- 虽然
- 5 它的支持者源于社区
- 因为
NoSQL项目都是开源的,因此它们缺乏供应商提供的正式支持。这一点它们与大多数开源项目一样,不得不从社区中寻求支持
- 因为
- MongoDB特点
- 1 面向集合(
Collenction-Orented)- 意思是数据被分组存储在数据集中, 被称为一个集合(
Collenction)。每个集合在数据库中都有一个唯一的标识名,并且可以包含无限数目的文档。集合的概念类似关系型数据库里的表(table),不同的是它不需要定义任何模式(schema)
- 意思是数据被分组存储在数据集中, 被称为一个集合(
- 2 模式自由(
schema-free)- 意味着对于存储在
MongoDB数据库中的文件,我们不需要知道它的任何结构定义。提了这么多次"无模式"或"模式自由",它到是个什么概念呢?例如,下面两个记录可以存在于同一个集合里面:{"welcome" : "Beijing"} {"age" : 25}
- 意味着对于存储在
- 3 文档型
- 意思是我们存储的数据是键-值对的集合,键是字符串,值可以是数据类型集合里的任意类型,包括数组和文档. 我们把这个数据格式称作 “
BSON” 即 “Binary Serialized document Notation.”
- 意思是我们存储的数据是键-值对的集合,键是字符串,值可以是数据类型集合里的任意类型,包括数组和文档. 我们把这个数据格式称作 “
- 1 面向集合(
MongoDB下载与安装
MongoDB官网
- 下载地址:https://www.mongodb.com/try/download/community
- 指定版本,操作系统下载:

- 安装步骤参考地址: https://blog.csdn.net/weixin_41466575/article/details/105326230
启动MongoDB
终端命令: mongod --dbpath C:\Program Files\MongoDB\Server\4.4\data

连接MongoDB
- 在环境变量设置好的前提下,在终端输入命令
mongo就可以进入到mongo的操作终端了。
配置环境变量参考如下: https://blog.csdn.net/Alisa_Sheng/article/details/122621415
- 图例所示:

MongoDB概念解析
不管我们学习什么数据库都应该学习其中的基础概念,在mongodb中基本的概念是文档、集合、数据库,下面我们挨个介绍
下表将帮助您更容易理解Mongo中的一些概念:

MongoDB三要素
- 数据库:一个集合的物理容器,一个数据库可以包含多个文档(一个服务器通常有多个数据库)。
- 文档:就是关系型数据库中的一行。文档是一个对象,由键值对构成,是
json的扩展形式 - 集合:类似于关系型数据库中的表,集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性
MongoDB数据类型
String:字符串,必须是有效的UTF-8Boolean:存储一个布尔值,true或者falseInteger:整数可以是32位或64位,这取决于服务器Double:存储浮点数Arrays:数组或列表Object:嵌入式文档Null:存储Null值Timestamp:时间戳, 表示从1970-1-1到现在的总秒数Object ID是一个12字节的十六进制数
MongoDB操作数据库的常用命令(掌握)
show dbs查看所有数据库

db查看现在用的数据库 (MongoDB中默认的数据库为test,如果你没有创建新的数据库,集合将存放在test数据库中。)

cls清屏的命令use admin如果数据库不存在,则创建数据库,否则切换到指定数据库。

注意: 我们刚创建的数据库 demo01并不在数据库的列表中, 要显示它,我们需要向 demo01数据库插入一些数据

db.dropDatabase()要删除某个数据库 需要切换到该数据库 通过use和db进行切换

MongoDB创建集合与查看集合
- 手动创建集合之不带关键字创建

- 手动创建集合之带关键字创建集合
关键字参数用法:


整个集合空间大小 **5 B, **文档最大个数为 3个。 如果设置的大小小于256就默认是256自动创建集合。
- 自动创建集合
- 在
MongoDB中,你不需要创建集合。当你插入一些文档时,MongoDB会自动创建集合。
- 在

MongoDB删除集合

MongoDB插入文档(简单的理解就是在集合/表中插入数据)
insert插入单条数据

insert插入多条数据
for(i=3;i<10;i++)db.test01.insert({x:i})


- 参数说明:
BulkWriteResult.writeErrors
文档数组,其中包含有关更新操作期间遇到的与写入问题无关的任何错误的信息。该writeErrors数组包含每个错误的写入操作的错误文档
- BulkWriteResult.writeConcernError
描述与写关注有关的错误的文档
- BulkWriteResult.nInserted
使用该Bulk.insert() 方法插入的文档数。对于通过带Bulk.find.upsert()选项的操作插入的文档
- BulkWriteResult.nUpserted
通过带Bulk.find.upsert()选项的操作插入的文档数 。
- BulkWriteResult.nMatched
选择用于更新或替换的现有文档数。如果更新/替换操作未更改现有文档
- BulkWriteResult.nModified
已更新或替换的现有文档数。如果更新/替换操作未更改现有文档
- BulkWriteResult.nRemoved
删除的文件数。
- BulkWriteResult.upserted
文档数组,包含有关通过带Bulk.find.upsert() 选项的操作插入的每个文档的信息。
- 详情可以参考: https://mongodb.net.cn/manual/reference/method/BulkWriteResult/
MongoDB查询数据
db.stu.insert([{"name" : "张三", "hometown" : "长沙", "age" : 20, "gender" : true },
{"name" : "老李", "hometown" : "广州", "age" : 18, "gender" : false },
{"name" : "王麻子", "hometown" : "北京", "age" : 18, "gender" : false },
{"name" : "刘六", "hometown" : "深圳", "age" : 40, "gender" : true },
{"name" : "jerry", "hometown" : "长沙", "age" : 16, "gender" : true },
{"name" : "小永", "hometown" : "广州 ", "age" : 45, "gender" : true },
{"name" : "老amy", "hometown" : "衡阳", "age" : 18, "gender" : true }])
db.stu.find()查询数据/可以在括号里面精确查找

db.stu.find().pretty()格式化文档打印

db.stu.find({name:'jerry'}).pretty()精确查找并格式化打印

db.stu.findOne()格式化打印第一条查询的数据

db.stu.find({age:18})

db.stu.findOne({age:18})把满足结果的第一条数据进行返回

db.stu.find({age:18,gender:true})在find中进行多条件查询

- 查询之比较运算符
- 等于:默认是等于判断,没有运算符
- 小于:
$lt - 小于等于:
$lte - 大于:
$gt - 大于等于:
$gte- 查询年龄大于18的元素
db.stu.find({age:{$gt:18}})
- 查询年龄大于18的元素

- 查询年龄大于18的元素且hometown是长沙的元素- db.stu.find({age:{$gt:18},hometown:"长沙"})

- 查询之范围运算符
- 使用
$in,$nin判断是否在某个范围内- 查询年龄为18和年龄28的学生
- 使用

- **查询之逻辑运算符 **
or: 使用$or,值为数组,数组中每个元素为json- 查询年龄大于18或者
gender为flase的db.stu.find({$or:[{age:{$gt:18}},{gender:false}]})

- 查询之自定义查询
- 查询年龄大于18的学生
db.stu.find({$where:function(){return this.age>18}})
- 查询年龄大于18的学生

MongoDB操作查询数据
count查出数据求总和 也可以精确查找想要的总和

limit用于读取指定数量的文档

skip用于跳过指定数量的文档

limit和skip同时使用

- 映射:指定返回的字段,如果为1则返回该字段 如果为0则除了该字段外所有字段返回。
id如果没写会默认返回

- 将
id去除

- 映射多个值
- 比如只要年龄和性别不去除
id
- 比如只要年龄和性别不去除

- 排序
- 升序

- 降序

- 根据find()精确查找然后进行排序

MongoDB更新文档
db.集合名称.update({query}, {update}, {multi: boolean})- 参数
query:查询条件 - 参数
update:更新操作符 - 参数
multi:可选,默认是false,表示只更新找到的第一条数据,值为true表示把满足条件的数据全部更新
- 参数
db.stu.update({name:'jerry'},{name:'杰瑞'})这种情况下 会改变name 但是其他的会被删除、

db.stu.update({name:'张三'},{$set:{name:'张三丰'}})这种情况下 会改变name并且其他的信息也不会变化

- 更新多条 比如说将所有的gender变成0 此时会发现 如果没有gender这个属性会进行添加

MongoDB删除文档
remove()方法的基本语法db.collection.remove(<query>, <justOne> )query: 删除的文档的条件。justOne: 如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档
- 删除符合条件的第一条数据

- 删除符合条件的多条数据

- 删除表/集合
- 语法:
db.集合名.drop()
- 语法:

MongoDB练习
测试数据:
var persons = [{name:"jim",age:25,email:"75431457@qq.com",c:89,m:96,e:87,country:"USA",books:["JS","C++","EXTJS","MONGODB"]
},
{name:"tom",age:25,email:"214557457@qq.com",c:75,m:66,e:97,country:"USA",books:["PHP","JAVA","EXTJS","C++"]
},
{name:"lili",age:26,email:"344521457@qq.com",c:75,m:63,e:97,country:"USA",books:["JS","JAVA","C#","MONGODB"]
},
{name:"zhangsan",age:27,email:"2145567457@qq.com",c:89,m:86,e:67,country:"China",books:["JS","JAVA","EXTJS","MONGODB"]
},
{name:"lisi",age:26,email:"274521457@qq.com",c:53,m:96,e:83,country:"China",books:["JS","C#","PHP","MONGODB"]
},
{name:"wangwu",age:27,email:"65621457@qq.com",c:45,m:65,e:99,country:"China",books:["JS","JAVA","C++","MONGODB"]
},
{name:"zhaoliu",age:27,email:"214521457@qq.com",c:99,m:96,e:97,country:"China",books:["JS","JAVA","EXTJS","PHP"]
},
{name:"piaoyingjun",age:26,email:"piaoyingjun@uspcat.com",c:39,m:54,e:53,country:"Korea",books:["JS","C#","EXTJS","MONGODB"]
},
{name:"lizhenxian",age:27,email:"lizhenxian@uspcat.com",c:35,m:56,e:47,country:"Korea",books:["JS","JAVA","EXTJS","MONGODB"]
},
{name:"lixiaoli",age:21,email:"lixiaoli@uspcat.com",c:36,m:86,e:32,country:"Korea",books:["JS","JAVA","PHP","MONGODB"]
},
{name:"zhangsuying",age:22,email:"zhangsuying@uspcat.com",c:45,m:63,e:77,country:"Korea",books:["JS","JAVA","C#","MONGODB"]
}]for(var i = 0;i<persons.length;i++){db.persons.insert(persons[i])
}var persons = db.persons.find({name:"jim"})
while(persons.hasNext()){obj = persons.next();print(obj.books.length)
}
练习问题:
1.查询年龄大于25小于27的name,age
db.persons.find({age:{$gt:25,$lt:27}})2.查询出不是美国的name
db.persons.find({country:{$ne:'USA'}})
db.persons.find({country:{$ne:'USA'}},{name:1})
db.persons.find({country:{$ne:'USA'}},{name:1,country:1})3.查询国籍是中国或者美国的学生信息
db.persons.find({$or:[{country:'USA'},{country:'China'}]})
db.persons.find({$or:[{country:'USA'},{country:'China'}]},{country:1}) 数据有点多映射国家4.查询语文成绩大于85或者英语成绩大于90的学生信息
db.persons.find({$or:[{c:{$gt:85}},{e:{$gt:90}}]})5.查询出名字中存在"li"的学生信息
db.persons.find({name:/li/},{name:1})6.查询喜欢看MONGODB和PHP的学生
db.persons.find({books:{$all:['MONGODB','PHP']}},{books:1})
db.persons.find({books:{$all:['MONGODB','PHP']}},{books:1,name:1})7.查询第二本书是JAVA的学生信息
db.persons.find({},{books:1})
db.persons.find({'books.1':'JAVA'},{name:1,books:1}) 'books.1'代表的是索引8.查询喜欢的书数量是4本的学生
db.persons.find({books:{$size:4}},{books:1})9.查询出persons中一共有多少国家分别是什么
db.persons.find({},{country:1})v
db.persons.distinct('country')
MongoDB创建索引
测试数据集
for(i=0;i<100000;i++){db.test.insert({name:'test'+i,age:i})}
为什么要用到索引 ?
- 索引通常能够极大的提高查询的效率,如果没有索引,
MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。 - 这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。
- 索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构
创建索引前:
db.test.find({name:'test9999'})
db.test.find({name:'test9999'}).explain('executionStats') # 显示查询操作的详细信息"executionTimeMillis" : 39, 测试结果 "executionTimeMillis" : 37, 这个结果不唯一
怎么去创建索引:
db.test.ensureIndex({name:1})
创建索引后:
db.test.find({name:'test9999'}).explain('executionStats')"executionTimeMillis" : 6, 测试结果
"executionTimeMillis" : 0,
查看所有的索引:
db.test.getIndexes()
默认情况下_id是集合的索引
删除索引:
语法:db.集合名.dropIndex({'索引名称':1})
db.test.dropIndex({name:1})
db.test.getIndexes()
注意:
在 3.0.0 版本前创建索引方法为 db.collection.ensureIndex(),之后的版本使用了 db.collection.createIndex() 方法,ensureIndex() 还能用,但只是 createIndex() 的别名。
拓展: 关于mongodb资料参考:https://www.runoob.com/mongodb/mongodb-indexing.html
python与MongoDB交互(掌握插入)
数据库的连接:
from pymongo import MongoClient# 连接
client = MongoClient()
MongoDB交互的增删改查:
import pymongo
from pymongo import MongoClientclass Mongo_python:# 初始化方法def __init__(self, HOST, PORT):self.HOST = HOSTself.PORT = PORT# 连接self.client = MongoClient(HOST, PORT)# 插入数据def insert_data(self):# 插入单条数据# self.client.school.teacher.insert_one({"name": "李璐2", "role": "兼职老师"})# 插入多条数据self.client.school.teacher.insert_many([{"name": "晨刚"}, {"name": "郭丽丽"}])# 查询数据def query_data(self):try:teachers = self.client.school.teacher.find()# print(list(teachers),type(teachers))# for one in teachers:# print("查找多条数据:", one["_id"], one["name"])teacher = self.client.school.teacher.find_one({"name": "李璐2"})print("查找单条数据:", teacher["_id"], teacher["name"])except Exception as e:print(e)# 修改数据def set_data(self):# 修改多条数据# self.client.school.teacher.update_many(# {}, {"$set": {"role": "班主任11111"}}## )# 修改单条数据# self.client.school.teacher.update_one({"name": "晨刚"}, {"$set": {"sex": "女"}})# push() 方法可向数组的末尾添加一个或多个元素,并返回新的长度。self.client.school.teacher.update_one({"name": "晨刚"}, {"$push": {"sdarole": "年级主任"}})# 删除数据def delete_data(self):try:# 删除单条数据# self.client.school.teacher.delete_one({"name": "晨刚"})# 删除多条数据# 第一个参数是一个查询对象,用于定义要删除的文档query = {"name": '李璐2'}self.client.school.teacher.delete_many(query)except Exception as e:print(e)if __name__ == '__main__':mg = Mongo_python('localhost', 27017)# mg.insert_data()# mg.query_data()# mg.set_data()mg.delete_data()
相关文章:
九:爬虫-MongoDB基础
MongoDB介绍 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其…...
机器学习之实验过程01
import pandas as pd import numpy as np import matplotlib.pyplot as plt data_path /home/py/Work/labs/data/SD.csv # 请确保您的数据文件路径是正确的 df pd.read_csv(data_path) df.head() # 创建散点图 # 创建散点图 plt.figure(figsize(10, 6)) plt.scatter…...
【【迭代16次的CORDIC算法-verilog实现】】
迭代16次的CORDIC算法-verilog实现 -32位迭代16次verilog代码实现 CORDIC.v module cordic32#(parameter DATA_WIDTH 8d32 , // we set data widthparameter PIPELINE 5d16 // Optimize waveform)(input …...
IntelliJ IDEA 2023.3 安装教程
引言 IntelliJ IDEA,通常简称为 IDEA,是由 JetBrains 开发的一款强大的集成开发环境,专为提升开发者的生产力而设计。它支持多种编程语言,包括 Java、Kotlin、Scala 和其他 JVM 语言,同时也为前端开发和移动应用开发提…...
Go 错误处理
Go 错误处理 Go 语言通过内置的错误接口提供了非常简单的错误处理机制。 error类型是一个接口类型,这是它的定义: type error interface {Error() string }我们可以在编码中通过实现 error 接口类型来生成错误信息。 函数通常在最后的返回值中返回错误…...
HarmonyOS构建第一个ArkTS应用(Stage模型)
构建第一个ArkTS应用(Stage模型) 创建ArkTS工程 若首次打开DevEco Studio,请点击Create Project创建工程。如果已经打开了一个工程,请在菜单栏选择File > New > Create Project来创建一个新工程。 选择Application应用开发…...
故障排查利器-错误日志详解
目录 什么是错误日志 错误日志的作用 错误日志的内容 错误日志的格式 错误日志的生成方式 错误日志的解析和处理 错误日志的最佳实践 小结 错误日志是软件开发和运维中非常重要的一部分,记录了应用程序运行过程中发生的错误和异常信息,如错误类型…...
微信小程序(uniapp)api讲解
Uniapp是一个基于Vue.js的跨平台开发框架,可以同时开发微信小程序、H5、App等多个平台的应用。下面是Uniapp常用的API讲解: Vue.js的API Uniapp采用了Vue.js框架,因此可以直接使用Vue.js的API。例如:v-show、v-if、v-for、comput…...
overtureDNS使用介绍
Overture是一个定制的DNS中继服务器。 在此下在二进制版本 https://github.com/shawn1m/overture/releases默认配置文件./config.yml bindAddress: :53 debugHTTPAddress: 127.0.0.1:5555 dohEnabled: false primaryDNS:- name: DNSPodaddress: 119.29.29.29:53protocol: udp…...
平衡二叉树的构建(递归
目录 1.概念:2.特点:3.构建方法:4.代码:小结: 1.概念: 平衡二叉树(Balanced Binary Tree),也称为AVL树,是一种二叉树,它满足每个节点的左子树和右…...
flutter开发实战-设置bottomNavigationBar中间按钮悬浮效果
flutter开发实战-设置bottomNavigationBar中间按钮悬浮的效果 在使用tabbar时候,可以使用bottomNavigationBar来设置中间凸起的按钮,如下 一、效果图 中间按钮凸起的效果图如下 二、实现代码 我们使用BottomAppBar 一个容器,通常与[Sscaf…...
不同参数规模大语言模型在不同微调方法下所需要的显存总结
原文来自DataLearnerAI官方网站: 不同参数规模大语言模型在不同微调方法下所需要的显存总结 | 数据学习者官方网站(Datalearner)https://www.datalearner.com/blog/1051703254378255 大模型的微调是当前很多人都在做的事情。微调可以让大语言模型适应特定领域的任…...
Crow:Middlewares 庖丁解牛6 middleware_call_helper
Crow:http请求到Rule绑定的handler_的调用链-CSDN博客 介绍了handler_的调用顺序,其中的一个调用过程是Connection::->handle void handle() {...ctx_ = detail::context<Middlewares...>();req_.middleware_context = static_cast<void*>(&ctx_);req_.m…...
MyBatis:Generator
MyBatis Generator附批量操作分页查询存储过程 Generator 介绍网址:Introduction to MyBatis Generator Generator ,一个用于 MyBatis 的代码生成工具,可以根据数据库表结构自动生成对应的实体类、DAO 接口和 SQL 映射文件,提高…...
rabbitmq的事务实现、消费者的事务实现
RabbitMQ提供了事务机制,可以确保消息在发送和确认过程中的一致性。使用事务机制可以将一系列的消息操作(发送、确认、回滚)作为一个原子操作,要么全部执行成功,要么全部回滚。 下面是使用RabbitMQ事务的一般步骤&…...
龙芯杯个人赛串口——做一个 UART串口——RS-232
文章目录 Async transmitterAsync receiver1. RS-232 串行接口的工作原理DB-9 connectorAsynchronous communicationHow fast can we send data? 2.波特率时钟生成器Parameterized FPGA baud generator 3.RS-232 transmitter数据序列化完整代码: 4.RS-232 receiver…...
验证码服务使用指南
验证码服务使用指南 1 部署验证码服务 1.1 基础环境 Java 1.8 Maven3.3.9 1.2 安装Redis 参考“Redis安装指南” 1.3 部署验证码服务 1.3.1 下载源码 使用git从远程下载验证码服务代码(开源)。 1.3.2 使用idea打开项目 使用idea打开上一步下载的sailing目录…...
js中Math.min(...arr)和Math.max(...arr)的注意点
当arr变量为空数组时,这两个函数和不传参数时的结果是一样的 Math.max() // -Infinity Math.max(...[]) // -InfinityMath.min() // Infinity Math.min(...[]) // Infinity...
【zookeeper特点和集群架构】
文章目录 1. Zookeeper介绍2、ZooKeeper数据结构3、Zookeeper集群架构 1. Zookeeper介绍 ZooKeeper 是一个开源的分布式协调框架,是Apache Hadoop 的一个子项目,主要用来解决分 布式集群中应用系统的一致性问题。Zookeeper 的设计目标是将那些复杂且容易…...
MySQL集群架构搭建以及多数据源管理实战
MySQL集群架构搭建以及多数据源管理实战 数据库的分库分表操作,是互联网大型应用所需要面对的最核心的问题。因为数据往往是一个应用最核心的价值所在。但是,在最开始的时候,需要强调下,在实际应用中,对于数据库&a…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...
实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...
