netty框架笔记
Netty网络编程框架学习笔记。涉及核心组件与架构设计、主从reactor模式。仅覆盖自己设计nettyserver时查询的知识。 netty架构netty采用分层设计,从上层API到底层实现逐步抽象,核心组件分为四层 123456789101112131415161718192021222324252627282930313233343536373839404142434445┌─────────────────────────────────────────────────────┐│ 引导层 (Bootstrap) ││ ┌───────────────────────┐ ┌─────────────────────┐ ││ │ ServerBootstrap │ │ Bootstrap │ ││ │ (服务端启动引导类) │ │ (客户端启动引导类) │ ││ └───────────────────────┘ ...
MySQL笔记(5)行锁表锁全局锁
自存笔记,学习MySQL实战45讲 第五讲:全局锁和表级锁全局锁 一种将整个数据库实例锁定的机制 会组织其他事务对数据库的读写访问 一般在逻辑备份中使用 实现 在InnoDB中可以使用 mysqldump 的 —single-transaction 选项,结合 InnoDB 的 MVCC 机制实现一致性备份,无需全局锁 1mysqldump -u root -p --all-databases --single-transaction > backup.sql 在不支持事务的引擎中 123FLUSH TABLES WITH READ LOCK;-- 执行备份或其他需要全局一致性的操作UNLOCK TABLES; 123SET GLOBAL READ_ONLY=1;-- 执行操作SET GLOBAL READ_ONLY=0; **建议使用FTWRL** 表级锁读锁可兼容读锁,写锁阻塞所有锁 表锁 锁定粒度为整张表 在存储引擎层加锁 不仅会对表的写/读加锁,获取到锁的线程也只能对限定的表做限定的写/读操作 1LOCK TABLES...
SQL笔记
学习SQL写法 && 数据库一些用法 的笔记 JOIN 数据分散到多个表时,需要用表连接来关联数据 每个join操作都会生成一个中间表,根据需要去进一步操作 结构 123SELECT 表1.字段, 表2.字段FROM 表1[连接类型] JOIN 表2 ON 表1.共同字段 = 表2.共同字段; 内连接只返回两表之中满足条件的记录(交集) 123SELECT *FROM 表AINNER JOIN 表B ON 表A.id = 表B.user_id; -- 可简写为 JOIN 左连接返回左表(表 A)的 所有记录,右表(表 B)中匹配的记录,若右表无匹配则用 NULL 填充 123SELECT *FROM 表ALEFT JOIN 表B ON 表A.id = 表B.user_id; 右链接返回右表(表 B)的 所有记录,左表(表 A)中匹配的记录,若左表无匹配则用 NULL 填充 123SELECT *FROM 表ARIGHT JOIN 表B ON 表A.id = 表B.user_id; 全外链接返回两表的 所有记录,匹配的记录合并,不匹配的字段用 NULL...
MySQL笔记(4):索引
自存笔记,学习MySQL实战45讲 第四讲:索引常用数据结构、B+树、索引维护索引常用数据结构哈希表 以键值对形式存储数据 等值查询复杂度是O(1),范围查询性能很差,因为存储位置之间无序 底层实现通常是,数组+链表/红黑树,当多个键映射到同一索引,这些键值会以链表/红黑树形式存储在该索引位置 有序数组 就是数组中元素按照某种固定顺序排序的数组 等值查询和范围查询性能都很优秀,有序可以用二分 但是更新数据很麻烦,比如中间插入一个记录就要改动后面的所有记录,只适合静态存储引擎 N叉树 分叉多,树高很低,访问磁盘次数很低 B+树 InnoDB使用了B+树索引模型 每一个索引再InnoDB里面对应一颗B+树 非叶子节点只存索引键和指向子节点的指针,叶子节点存索引键和完整记录(主键索引)/主键值(非主键索引) 聚簇索引VS二级索引 特性 主键索引(聚簇索引) 非主键索引(二级索引) 非叶子节点内容 主键值 + 子节点指针 非主键字段值 + 子节点指针 叶子节点内容 主键值 + 完整记录 非主键字段值 +...
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",...