diff --git a/README.md b/README.md index 55cffed3..79984d15 100755 --- a/README.md +++ b/README.md @@ -1,12 +1,11 @@ **`声明`** -此项目已维护快3年多了,接下来我有了新的目标,后期的更新不会太过频繁,我也在思考如何精简自己的知识脑图。 本项目为个人学习之总结,内容大多来源网上、书籍、视频,若引用不当,麻烦告知,我定删除。喜欢的话可以`Star`下,生活不易,希望对读者有帮助。祝好!!! ### 目录 -| 英语 | Java | Spring生态 | 中间件 | 数据库 | 服务器 | 网络/系统 | 内功 | 程序人生 | +| 英语 | Java生态 | Golang生态 | 中间件 | 持久化 | 服务器 | 网络/系统 | 内功 | 程序人生 | |:----|:-----|:------|:------|:------|:------|:------|:------|:------| -|英语|Basic
JVM
Web
|Spring
Spring Boot
Spring Cloud|Keepalived
ActiveMQ
RabbitMQ
RocketMQ
MQTT
Netty
Mybatis
Redis
Log|MySQL
Postgresql
Mongodb|Tomcat
Nginx|网络
Linux|数据结构
算法
设计模式|软文
规范
工具
面试集锦
实战训练| +|英语|Java Basic
JVM
Web
Spring
Spring Boot
Spring Cloud|Go Basic
Go Web|Keepalived
ActiveMQ
RabbitMQ
RocketMQ
MQTT
Netty
Mybatis
Redis
Log|MySQL
Postgresql
Mongodb|Tomcat
Nginx|网络
Linux|数据结构
算法
设计模式|软文
规范
工具
面试集锦
实战训练| ### 英语 * [计算机行业常用英语积累](tool/english.md) @@ -18,13 +17,17 @@ * `Java-Web`:  [Servlet基础](java/javaweb/servlet.md) [JSP基础](java/javaweb/jsp.md) * `Spring X`:  [Spring4系列](java/spring/spring.md#Spring) [SpringMVC系列](java/spring/spring.md#SpringMVC) [SpringBoot系列](java/spring/spring.md#SpringBoot) [SpringCloud系列](java/spring/spring-cloud/spring-cloud.md) +### Golang +* `Golang Basic`:  [Go基础](golang/basic/go-basic.md) +* `Golang Web`:  [Go Web](golang/basic/go-basic.md#goweb) + ### 中间件 * `负载均衡`:  [Keepalived系列](plugins/keepalived.md) * `消息通信`:  [消息通信基础](http://note.youdao.com/noteshare?id=30a11e46aaef3f00d2ecfb84692ca294&sub=wcp157828038663078) [MQ概述](plugins/mq/mq.md) [ActiveMQ系列](plugins/activemq.md) [RabbitMQ系列](plugins/rabbitmq.md)  [RocketMQ系列](plugins/rocketmq.md)  [Netty系列](plugins/netty.md)  [IOT通信](plugins/mqtt.md) * `数据访问`:  [MyBatis](plugins/mybatis.md)  [MyBatis-Plus](plugins/mybatis-plus.md) * `数据缓存`:  [Redis系列](plugins/redis.md) * `搜索引擎`:  [Elasticsearch](plugins/elasticsearch.md) -* `日志模块`: [Log4j2](plugins/log.md) +* `日志模块`:  [Log4j2](plugins/log.md) ### 数据库 * `关系型数据库`:  [数据库理论基础](plugins/database/database.md) [MySQL](plugins/mysql.md) [Postgresql](plugins/postgresql.md) @@ -57,6 +60,7 @@ * [新工程师要干的五件事情](tool/coding-life.md/#新工程师要干的五件事情) * [为什么CTO,技术总监,架构师不写代码都这么牛逼](http://note.youdao.com/noteshare?id=f4eeda7da9b73adf4294f984a5e7cbe5&sub=945D4467238947AAB5C030B17D5AC01E) * [技术/管理](https://www.cnblogs.com/yexiaochai/p/14805941.html#top) +* [简单/不简单](https://www.cnblogs.com/xxcanghai/p/ping-shi-de-gong-zuo-ru-he-ti-xian-yi-ge-ren-de-ji.html) > `规范` * [雅虎前端34条军规](http://note.youdao.com/noteshare?id=b59d0da4f7bb2b7ba5f73129d85b1ba1) diff --git a/golang/basic/go-100-questions.md b/golang/basic/go-100-questions.md new file mode 100644 index 00000000..fb57b30e --- /dev/null +++ b/golang/basic/go-100-questions.md @@ -0,0 +1,5 @@ +# Go白问 +1. 使用go关键字开启一个协程都发生了什么?它与java中的并发有什么不一样的地方? +```go +go count(5) // 使用go关键字创建一个goroutine +``` \ No newline at end of file diff --git a/golang/basic/go-basic.md b/golang/basic/go-basic.md new file mode 100644 index 00000000..cf6f2b04 --- /dev/null +++ b/golang/basic/go-basic.md @@ -0,0 +1,88 @@ +### 学习计划 +* B站8小时转go开发 +* go-kit实战小例子 + +#### go basic + +#### go web +* 示例地址 https://github.com/zhonghuasheng/JAVA_LOVE_GO/tree/master/gop/com/zhonghuasheng/web + +### 目录 +* RPC +* Protobuf +* go thinking +* basic +* 空白标识符 +* 注意 + +### RPC +整体过程就是: +1. 客户端发送数据(以字节流的方式) +2. 服务端接收并解析。根据约定知道执行什么,然后把结果返回客户端 +RPC就是把 +1. 上述流程封装下,使其操作更加优化,让使用者感觉像是调用本地方法一样 +2. 使用一些大家都认可的协议 使其规范化 +3. 做成一些框架,直接或间接产生利益 + +### Protobuf +Google Protocol Buffer +轻便高效的序列化数据结构协议 + +### go thinking +众多语言学术流派,面向过程、面向对象、函数式编程、面向消息编程等。Go语言接受函数式编程、支持匿名函数与闭包,接受以Erlang语言为代表的面向消息编程思想,支持goroutine和通道,并推荐使用消息而不是共享内存来进行并发编程。Go语言最主要的特性 +* 自动垃圾回收 +* runtime系统调度机制 +* 更丰富的内置类型 +* 函数多返回值 +* 错误处理 +* 匿名函数和闭包 +* 类型和接口 +* 并发编程 +* 反射 +* 语言交互性 + +### basic +* Go程序由多个标记组成,可以是关键字、标识符、常量、字符串、符号。 + * 行分隔符: 每一行代表一个语句结束。建议每一行加上分号;标识结尾,不加的话Go编译器自动完成 + * 注释:注释不会被编译 + * 标识符:标识符用来命名变量、类型等程序实体 + * 字符串连接:Go语言的字符串可以通过+实现 + * 关键字:Go语言包含25个关键字。break default func interface select case defer go map struct chan else goto package switch const flatthrough if range type continue for import return var + * Go语言还有36个预定义标识符 +* 空白标识符_是一个只写变量,你不能得到它的值,被用于抛弃值。这样做是因为Go语言中你必须使用所有被声明的变量,但有时你并不需要使用从一个函数得到的所有返回值。 +* 环境搭建 + * windows环境搭建 + * 安装go二进制文件 到镜像网站下载 https://goproxy.io/zh/ + * 下载Goland IDEA,设置GOPATH + * 配置GOPROXY代理,不然很慢 + * go get xxx 下载xxx包 + * go mod tidy 刷新 类似maven update +* go三层经典模型 + * Transport 主要负责Http, gRpc, thrift + * Services 业务函数 + * Endpoint 定义request, response格式等 +* 四种变量声明方式 +* channel,go语言是如何实现不同协程之前通信的呢?其他语言是通过共享内存来实现通信,而go语言是通过通信来实现共享。一个重要的特性:不论是从channel中读一条消息,还是往channel中发送一条消息,都会阻塞当前代码运行。 + +##### 指针 +取址运算符“&”用于获取对象地址。 +指针运算符“*”用于间接引用目标对象。 +```code +x := 10 +var p *int = &x // 获取地址,保存到指针变量 +*p += 20 // 用指针间接引用,并更新对象 +``` + +### 注意 +* go语言中{不能单独放在一行,否则运行时会产生错误 + +### 其他 +* facebook grace平滑升级项目 +* 腾讯在15年的时候使用go做了docker万台规模,主要用于蓝鲸游戏平台 + +### 常见错误 +* package command-line-arguments is not a main package +要运行的go文件,package不是main。PS,也要有一个main函数 + +* sql: Scan error on column index 3, name "created_at": unsupported Scan, storing driver.Value type []uint8 into type *time.Time +在conn上加parseTime=true,eg `/guestdb?charset=utf8&parseTime=true` \ No newline at end of file diff --git a/golang/basic/go-question.md b/golang/basic/go-question.md new file mode 100644 index 00000000..67360975 --- /dev/null +++ b/golang/basic/go-question.md @@ -0,0 +1,111 @@ +# Go语言答疑解惑 + +## channel +* 从一个关闭的 channel 仍然能读出数据吗 +* channel 有哪些应用 +* 如何优雅地关闭 channel +* channel 在什么情况下会引起资源泄漏 +* 什么是 CSP +* channel 底层的数据结构是什么 +* channel 发送和接收元素的本质是什么 +* 关于 channel 的 happened-before 有哪些 +* 向 channel 发送数据的过程是怎样的 +* 从 channel 接收数据的过程是怎样的 +* 操作 channel 的情况总结 +* 关闭一个 channel 的过程是怎样的 + +## map +* map 的底层实现原理是什么 +* 可以边遍历边删除吗 +* map 的删除过程是怎样的 +* 可以对 map 的元素取地址吗 +* 如何比较两个 map 相等 +* 如何实现两种 get 操作 +* map 是线程安全的吗 +* map 的遍历过程是怎样的 +* map 中的 key 为什么是无序的 +* float 类型可以作为 map 的 key 吗 +* map 的赋值过程是怎样的 +* map 的扩容过程是怎样的 + +## interface +* iface 和 eface 的区别是什么 +* Go 接口与 C++ 接口有何异同 +* 接口转换的原理 +* 如何用 interface 实现多态 +* Go 语言与鸭子类型的关系 +* 值接收者和指针接收者的区别 +* 接口的构造过程是怎样的 +* 编译器自动检测类型是否实现接口 +* 类型转换和断言的区别 +* 接口的动态类型和动态值 + +## 标准库 +* context 如何被取消 +* context 是什么 +* context 有什么作用 +* context.Value 的查找过程是怎样的 +* unsafe +* Go指针和unsafe.Pointer有什么区别 +* 如何利用unsafe包修改私有成员 +* 如何利用unsafe获取slice&map的长度 +* 如何实现字符串和byte切片的零拷贝转换 + +## goroutine 调度器 +* g0 栈何用户栈如何切换 +* goroutine 如何退出 +* goroutine 调度时机有哪些 +* goroutine和线程的区别 +* GPM 是什么 +* M 如何找工作 +* mian gorutine 如何创建 +* schedule 循环如何启动 +* schedule 循环如何运转 +* sysmon 后台监控线程做了什么 +* 一个调度相关的陷阱 +* 什么是 go shceduler +* 什么是M:N模型 +* 什么是workstealing +* 描述 scheduler 的初始化过程 + +## 编译和链接 +* Go 程序启动过程是怎样的 +* Go 编译相关的命令详解 +* Go 编译链接过程概述 +* GoRoot 和 GoPath 有什么用 +* 逃逸分析是怎么进行的 + +## 反射 +* Go 语言中反射有哪些应用 +* Go 语言如何实现反射 +* 什么情况下需要使用反射 +* 什么是反射 +* 如何比较两个对象完全相同 + +## 数组与切片 +* 切片作为函数参数 +* 切片的容量是怎样增长的 +* 数组和切片有什么异同 + + +## GC 的认识 +* 什么是 GC,有什么作用? +* 根对象到底是什么? +* 常见的 GC 实现方式有哪些?Go 语言的 GC 使用的是 +* 三色标记法是什么? +* STW 是什么意思? +* 如何观察 Go GC? +* 有了 GC,为什么还会发生内存泄露? +* 并发标记清除法的难点是什么? +* 什么是写屏障、混合写屏障,如何实现? +* Go 语言中 GC 的流程是什么? +* 触发 GC 的时机是什么? +* 如果内存分配速度超过了标记清除的速度怎么办? +* GC 关注的指标有哪些? +* Go 的 GC 如何调优? +* Go 的垃圾回收器有哪些相关的 API?其作用分 +* Go 历史各个版本在 GC 方面的改进? +* Go GC 在演化过程中还存在哪些其他设计?为什么没有被采用? +* 目前提供 GC 的语言以及不提供 GC 的语言有哪些?GC 和 No GC 各自的优缺点是什么? +* Go 对比 Java、V8 中 JavaScript 的 GC 性能如何? +* 目前 Go 语言的 GC 还存在哪些问题? diff --git a/java/basic/hashmap.md b/java/basic/hashmap.md index dd8e60ef..89b969f9 100644 --- a/java/basic/hashmap.md +++ b/java/basic/hashmap.md @@ -1,5 +1,14 @@ ### 学习笔记 Hash几乎是面试的必考,我没事就找机会面试,几乎每次都被面到,面试的时候主要是考察你对Hash底层结构的理解,同时结合你项目实际中的使用来聊。我在这些年的开发和研发过程中,确实有很多场景的设计或者使用都或多或少用到了Hash,当然平时开发写代码,肯定少不了HashMap。面试官还喜欢问你对JDK7和8中HashMap的区别,也可以看看我的[面试宝典](../../tool/interview.md#盘涅) +* HashMap 全理论 https://blog.csdn.net/weixin_34392227/article/details/112348756 +* HashMap面试题 https://www.cnblogs.com/aobing/p/12014271.html +* HashMap JDK8以前头插法为什么会出现死循环 https://www.bilibili.com/video/BV1n541177Ea?spm_id_from=333.337.search-card.all.click + + +### 为什么链表长度达到8后变为红黑树 +https://www.pianshen.com/article/2770135206/ + + ### HashMap基础知识 * [一致性Hash](http://note.youdao.com/noteshare?id=2df0dfa390855dde55075260b8ddc27a&sub=A2CDBD1C8B614310ABFF0F03682FAB7A) \ No newline at end of file diff --git a/java/basic/java-basic.md b/java/basic/java-basic.md index 55d8cc6a..c333d348 100755 --- a/java/basic/java-basic.md +++ b/java/basic/java-basic.md @@ -1189,7 +1189,8 @@ System.out.println(e2.get(2)); // 2 `transient` 将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会被序列化。【对象序列化是一个用于将对象状态转换为字节流的过程,可以将其保存到磁盘文件中或通过网络发送到任何其他程序;从字节流创建对象的相反的过程称为反序列化】 - +为什么要不序列化? + 一些敏感信息,比如密码和银行卡号等在java对象序列化时不希望被序列化,不被序列化的属性就不会被存储到磁盘上,或通过网络传输。为了实现属性不被序列化,只需要在属性前加上transient关键字就能达到目的。 `volatile` volatile只能修饰变量,被修饰的变量对其他线程是“可见的”,同时volatile修饰的变量禁止指令重排(保证了有序性) diff --git "a/plugins/database/mysql/mysql\347\264\242\345\274\225.md" "b/plugins/database/mysql/mysql\347\264\242\345\274\225.md" index 671a0b76..2a309327 100644 --- "a/plugins/database/mysql/mysql\347\264\242\345\274\225.md" +++ "b/plugins/database/mysql/mysql\347\264\242\345\274\225.md" @@ -1,5 +1,6 @@ ### 索引是什么 索引底层是`数据结构`,是一种`排好序`的数据结构,帮助MySQL高效获取数据。 +MYSQL用到了索引和执行时间没有必然关系。确定查询执行效率的是扫描行数和回表次数。 > 索引的优缺点 @@ -88,11 +89,16 @@ FULLTEXT(全文)索引,仅可用于MyISAM和InnoDB,针对较大的数据 #### 索引的创建 1. 尽量扩展索引,不要新建索引,因为索引过多会导致写入速度变慢。 2. 建有索引的列别参与计算,因为BTREE中存的都是表中的字段值,如果需要先计算再比较的话成本还是比较大的。 +3. CREATE INDEX t ON(columnA, columnB) 索引是以左侧列为基准,向右侧列查找,所以a的区分度最好够小 #### 索引的使用 1. 最左匹配原则 这个原则非常重要,我们建立索引的时候根据业务场景建立合适的索引。mysql索引匹配会从左向右一直匹配直到遇到范围查询才停止,比如id=1 and phone=15652635684 and time>1562565855,如果建立索引的顺序为(id,phone,time)则time用不到索引,但是如果顺序为(id,time,phone)则都可以用到。索引的最左前缀和和B+Tree中的“最左前缀原理”有关,举例来说就是如果设置了组合索引那么以下3中情况可以使用索引:col1,,其它的列,比如,col2,col3等等都是不能使用索引的。 2. =和in查询中可以乱序,不需要考虑最左匹配原则,mysql的查询优化器会进行自动优化 3. 使用短索引。索引字段尽量选择区分度高的字段,因为重复值越多,扫描的记录数就越多,比如性别类型为0和1,这种的重复就很高,不建议这种类型加索引,因为加了也没有多大提高。例如在一些政府项目中,对公民的身份证号码建立索引的时候,就可以采用这种hash索引,具体设计时可以将身份证倒序,然后使用前缀索引,匹配前9个字符效率就很高了。对串列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个CHAR(255)的 列,如果在前10 个或20 个字符内,多数值是惟一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。 +4. 优化方案 +* 增加多种不同规格索引提高索引选择性(5-6组) +* 空间换时间,定时任务增加时报、日报等中间结果 +* 硬件调优:增大innodb_buffer_pool多利用内存,减少硬盘回表 ### B树与B+树的区别 1. B树每个节点都存储数据,所有节点组成这棵树。B+树只有叶子节点存储数据(B+数中有两个头指针:一个指向根节点,另一个指向关键字最小的叶节点),叶子节点包含了这棵树的所有数据,所有的叶子结点使用链表相连,便于区间查找和遍历,所有非叶节点起到索引作用。 @@ -100,4 +106,6 @@ FULLTEXT(全文)索引,仅可用于MyISAM和InnoDB,针对较大的数据 3. B树中每个节点(非根节点)关键字个数的范围为[m/2(向上取整)-1,m-1](根节点为[1,m-1]),并且具有n个关键字的节点包含(n+1)棵子树。B+树中每个节点(非根节点)关键字个数的范围为[m/2(向上取整),m](根节点为[1,m]),具有n个关键字的节点包含(n)棵子树。 4. B+树中查找,无论查找是否成功,每次都是一条从根节点到叶节点的路径。 -![](../img/btree-example.png)![](../img/b+tree-example.png) \ No newline at end of file +![](../img/btree-example.png)![](../img/b+tree-example.png) + +### EXPLAIN diff --git a/plugins/mysql.md b/plugins/mysql.md index 534bc448..58e32a78 100644 --- a/plugins/mysql.md +++ b/plugins/mysql.md @@ -29,6 +29,8 @@ - [设计](#设计) - [使用](#使用) - [count(*)的实现](#count) + - [MySQL给用户授权](#MySQL给用户授权) + - [给用户赋予某个数据库某种权限] ### 番外篇 * 数据库的扩展没有web服务器那样容易 @@ -484,4 +486,11 @@ WHERE condation GROUP BY columnA HAVING COUNT(columnA) > 1 ``` -https://mp.weixin.qq.com/s/SNRvdmyS57oWS_CyYKVvSA \ No newline at end of file +https://mp.weixin.qq.com/s/SNRvdmyS57oWS_CyYKVvSA + +#### MySQL给用户授权 +1. 给某个用户赋予某个数据库的某种权限 +* 首先创建用户 `create user user1 identified by '123';` +* 赋予`user1`某些权限 `grant select,insert,update on db1.* to user1@"%" identified by "123";` +* 刷新 `flush privileges;` +* 切换到user1查看数据库 \ No newline at end of file diff --git a/plugins/redis.md b/plugins/redis.md index ce85acc8..79d01f77 100644 --- a/plugins/redis.md +++ b/plugins/redis.md @@ -12,7 +12,7 @@ * 单线程的redis,如何知道要运行定时任务? * Redis Server启动源码分析 * Redis get/set源码分析 - * Redis SkipMap病毒 + * 面试题 https://www.sohu.com/a/486868862_121124376 * [实战]() ### 学习计划 diff --git a/system/algorithm/algorithm.md b/system/algorithm/algorithm.md new file mode 100644 index 00000000..7474f308 --- /dev/null +++ b/system/algorithm/algorithm.md @@ -0,0 +1,4 @@ +### 学习笔记 +* [数据结构](数据结构.md) +* [设计模式](设计模式.md) +* [倒排索引](倒排索引.md) \ No newline at end of file diff --git a/tool/2022-01-27.png b/tool/2022-01-27.png deleted file mode 100644 index 4476c2d9..00000000 Binary files a/tool/2022-01-27.png and /dev/null differ diff --git a/tool/2023-03-24.png b/tool/2023-03-24.png new file mode 100644 index 00000000..0e1b6e1e Binary files /dev/null and b/tool/2023-03-24.png differ diff --git a/tool/coding-life.md b/tool/coding-life.md index b8ec13d3..12c50912 100644 --- a/tool/coding-life.md +++ b/tool/coding-life.md @@ -6,15 +6,17 @@ ### 记录自己的成长 -* 2014-10 收到群硕(上海)软件开发有限公司的Offer +* 2013-10 收到群硕(上海)软件开发有限公司的Offer * 2014-03 去群硕扬州实习 * 2014-07 河南中医药大学毕业 * 2014-07 - 2014-09 群硕(上海)软件开发有限公司 * 2017-09 - 2020-06 群硕(武汉)软件开发有限公司 * 2020-06 - 2021-03 武汉氪细胞网络技术有限公司(产品Timing App) * 千万级的用户量,百万DAU,3000左右的QPS,高并发场景较多。后来,国家对在线教育进行了整改。。。 -* 2021-04 - 至今 孚创武汉研发中心 +* 2021-04 - 2022-02 孚创武汉研发中心 * 互联网+的产品,对手是途虎 +* 2022-03 - 至今 腾讯云科技 CSIG + * JOOX音乐APP,QQ音乐的海外版 ### 最好的建议 我毕业后就进入一家外企,在这家公司学的比较全,不论是技术,思想,管理都有了很大的提升。后期我整理了自己的思考,总结来说就是这几个词,人、事、共赢。管理上,我感觉我们都是做事情的人,那么一帮人,团队氛围很好,做事情很开心,这很重要。所谓的共赢,强调的是个人与企业,个人与其他人之间的关系。 @@ -74,6 +76,8 @@ * 互联网+不是将互联网的一套塞给传统企业,而是在理解行业的基础之上再发挥互联网的价值 * 烂尾楼产品,最小化可行产品MVP,现有滑板车,再有自行车,再有电动车,再有汽车,不要一下子就开始造汽车,迭代而行 * 团队的战斗力来自一起熬夜,一起关过小黑屋...一起过事;团队的信任来自沟通和每次高质量的交付 +* 所以,我们不是要克服舒适区,盲目的挑战自我,而是要寻找合适的挑战区,去把它开拓成新的舒适区。 +* 重大问题的解决方案永远不可能在产生这个问题的维度上出现! ### 后端避坑心得 敬畏之心 - 敬畏之心 - 敬畏之心 diff --git a/tool/english.md b/tool/english.md index 2d7e9f83..66018879 100644 --- a/tool/english.md +++ b/tool/english.md @@ -128,4 +128,6 @@ * PRD Product Requirement Document 产品需求 * User Stroy 场景 * LDAP Lightweight Directory Access Protocol 轻型目录访问协议。LDAP采用树形结构存储,查询高效,开源产品OpenLDAP。可用于SSO单点登录。LDAP主要的应用场景是查询多而修改极少,查询和修改的比率是10:1 甚至更高, 那就充分发挥LDAP的优势了,因为没有事务处理,那数据库的速度可是比不上。 还有LDAP能存储海量的数据,还可以轻松地在各个系统之间复制,可用性超高。 -* privileged 有特权的 \ No newline at end of file +* privileged 有特权的 +* syntactic sugar 语法糖 +* AIGC Artificial Intelligence Generated Content 人工智能生成内容