MySQL笔记(2):一条SQL更新的执行
自存笔记,学习MySQL实战45讲 第二讲:一条SQL更新语句是如何执行的 查询语句需要走的流程,更新语句也同样需要,比如连接器验证链接身份、解析器解析词法语法等,唯一不同在于执行器执行的时候,特殊的更新操作。而这个操作又涉及到两个日志:redolog(重做)和binlog(归档) 如果更新操作不借助日志? 方案一:每次更新直接写入磁盘,这样每次更新都对应一次磁盘io,成本过高 方案二:每次修改把脏页暂存在内存里,然后延迟异步刷盘(保证性能)。但如果系统突然崩溃,内存中的脏页会丢失,此时无法保证事务的持久性 脏页:内存中已经被修改但还没被刷新到磁盘上的数据库页面 显然,这两种方法都是有缺陷的,既要保证性能,又要保证持久性,就引入了WAL技术,也就是Write-Ahead...
MySQL笔记(1):一条SQL查询的执行
自存笔记,学习MySQL实战45讲 第一讲:一条SQL查询语句是如何执行的MySQL架构理解首先我们知道,MySQL是分为Server层和存储引擎层两部分的。 Server层里有连接器、查询缓存(MySQL8.0后被删除)、分析器、优化器、执行器等,负责构建MySQL的大部分功能; 存储引擎层采用插件式架构,可以支持不同的存储引擎,负责存储数据。通俗来讲,存储引擎层就像一个包裹,负责把存储引擎打包到一起,并向Server层提供读写接口 注意,不同的存储引擎共用一个Server层。也就是说,MySQL架构中,有一个Server层,一个存储引擎层,所有存储引擎公用一个Server层 执行过程连接器连接命令一般这么写: 1mysql -h$ip -P$port -u$user -p mysql是客户端工具,用来链接服务端。当完成TCP三次握手后,开始验证用户身份,用的是输入的用户名和密码 若用户名或者密码错误,则报错Access denied for...
Docker(一)理论知识
前言一直在用docker,没系统的捋一遍。这准备简历,所以重新弄一遍,本篇只涵盖使用的知识。后面会有实战部署笔记和底层技术。 什么是Docker基本概念流程:研发镜像(image)->上传到镜像仓库(Registry)->通过Docker引擎down下来->运行down下来的容器(container) Docker是一个容器引擎,用于管理容器的声明周期 容器:包含用于运行一个软件的环境(包含了目标软件运行所需的所有依赖)和需要运行的软件,镜像的实例 镜像:容器的安装包,必须先有镜像,才能运行容器 仓库:用于存放镜像,对镜像进行统一管理 打个比方:仓库是软件商店,镜像是软件安装包,容器是安装成功后的软件 Docker与虚拟机对比理解 Docker的架构C/S架构:Client客户端,Server服务端 Docker Client Docker客户端,向服务端发起请求,比如下载镜像,管理容器声明周期 Docker Daemon Docker的后台守护程序,包含: Docker...
go有意思的特性
如题,记录一些自认为有趣的特性 定时器 1234567891011121314151617181920212223242526//定时器1执行完毕,协程定时器2终止package mainimport ( "fmt" "time")func main() { timer1 := time.NewTimer(2 * time.Second) <-timer1.C fmt.Println("timer1 is done") timer2 := time.NewTimer(2 * time.Second) //开一个协程,此时程序一边运行协程func,一边跑下面的stop,因为timer2会立即stop,所以不会打印timer2 is done go func() { <-timer2.C fmt.Println("timer2 is done") }() stop := timer2.Stop() if stop...
go爬虫————页面抓取
碎碎念跟着小生凡一老师做的,目的是熟悉网络的请求与响应&数据库从17号晚上开始敲了两三个点马马虎虎敲完了,不到200行,中间连接数据库,import等等耽误时间了,先复习一遍,然后找个静态网站抓一下 不管代码有多少行,一个爬虫的核心流程通常是: 发送请求 → 获取响应 → 解析数据 → 保存结果所以接下来也按照这个步骤来过一遍两个项目 代码开源在了go-proj-self (一)抓取豆瓣top250发送请求 构造客户端 1client:=http.Client 构造GET请求 网页处按F12->点network->刷新->点TOP250->会有url,请求方法等 12345req,err:=http.NewRequest("get","https://movie.douban.com/top250",nil)//请求体没有所以是nilif err != nil { //如果出错 fmt.Println("req err",...
go-Gin简明教程
前言学习来源极客兔兔Gin简明教程&ChatGPT (老师的文章已经很全了)。本文是作为一个纯小白在学习兔老师教程的时候一些思考和资料查询。需要先安装go和gin,这里建议直接看老师的教程,很细。 Gin是什么Gin 是一个用 Go 语言编写的轻量级、高性能的 Web 框架,因其简洁的设计和极高的处理性能,在开发 RESTful API 和 Web 服务时非常流行 Gin 的特点 轻量级 代码量少,启动速度快,适合构建微服务。 没有包含过多的插件,保持核心简单,用户可以按需扩展。 高性能 Gin 使用 Go 的 net/http 标准库作为底层,性能表现极为优越。 使用 Radix 树 和 字符串查找优化 实现路由匹配,高效解析 HTTP 请求。 中间件机制 提供了中间件支持,用户可以灵活定义和扩展功能,例如日志、认证、错误处理等。 开发友好 提供了简洁的 API 和丰富的功能,如路由分组、参数绑定、JSON 数据处理等。 对于错误处理和调试有专门支持,如 Context...
go-net/http标准库简明教程
前言这两天懒了(bushi),快赶赶进度…学习来源ChatGPT&&Go by example本文会包括go的net/http标准库等基础知识!零基础小白请放心使用!会有涉及计网的一点知识 (本人也正在cs144里挣扎)好难过下周要考计组和数据结构长文预警!!! Go的net/http标准库基本概念 net/http 是什么它是 Go 标准库中用来处理 HTTP 请求和响应的模块,提供了构建 Web 服务的基本功能。 核心组件 http.Server:表示 HTTP 服务器。 http.Request:表示 HTTP 请求。 http.ResponseWriter:用于构造 HTTP 响应。 路由与处理器:通过 Handler 接口和 ServeMux 路由器来实现。 示例12345678910111213141516package mainimport ( "fmt" "net/http")func handler(w http.ResponseWriter, r...
go-单元测试
前言 零基础小白可放心食用!有很多概念解释比如匹配or通配符等等,一起加油! 学习来源: 极客兔兔-Go Test单元测试简明教程 ChatGPT Go 的单元测试是 Go 语言中内置的一个重要功能,支持开发者快速验证代码的正确性。通过标准库 testing 和相关工具(如 go test),你可以编写简洁、高效的单元测试用例。 单元测试基本概念 单元测试是指对代码中最小的可测试部分(如函数或方法)进行验证,以确保其行为符合预期。 在 Go 中,单元测试文件以 _test.go 为后缀,测试函数以 Test 开头。 Go 的测试框架是内置的,运行 go test 命令即可执行测试。 一个简单例子Go 语言推荐测试文件和源代码文件放在一块,测试文件以 _test.go 结尾。比如,当前 package 有 calc.go 一个文件,我们想测试 calc.go 中的 Add 和 Mul 函数,那么应该新建 calc_test.go 作为测试文件。123example/ |--calc.go ...
go-并发编程
前言之前从未接触过并发编程的童鞋可放心食用! 并发与并行 并发 (Concurrency):并发是指同时处理多个任务的能力,但这些任务不一定是同时执行的。任务可能通过切换来共享时间片。 并行 (Parallelism):并行是指多个任务同时执行,需要多个处理器核心支持。在 Go 中,Goroutine 是通过调度器来实现并发,最终通过 CPU 核心实现并行。 并发和并行的关系:并发是逻辑上的任务切换,而并行是物理上的任务同时运行。 Go的并发核心:GoroutineGoroutine是什么Goroutine 是 Go 的协程实现,是一种比传统线程更轻量级的并发任务单元。 轻量:一个 Goroutine 启动时仅占用大约 2 KB 的内存(相比线程,通常占用 1 MB 堆栈)。 调度灵活:由 Go 的运行时(runtime)管理调度,而不是直接依赖操作系统内核线程。 高效:Go 的运行时会动态调整 Goroutine 的栈大小(最小 2 KB,最大可达 1 GB),并通过用户态线程池实现调度。 协程 vs 线程: ...





