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+树中查找,无论查找是否成功,每次都是一条从根节点到叶节点的路径。
-
\ No newline at end of file
+
+
+### 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 人工智能生成内容