摘要: spring架构 按照图中的流程,一定要自己使用idea工具配合着debug,慢慢去看里面源码,除了花费一点时间,不会很难,绝对可以理解的 spring测试用例: maven依赖: <dependencies> <dependency> <groupId>org.projectlombok</gro 阅读全文
posted @ 2022-11-25 16:26 aBiu-- 阅读(174) 评论(0) 推荐(0)
摘要: map引入 func main() { // 定义map var a map[int]string // 只声明map内存是没有分配空间的,必须通过make函数进行初始化 a = make(map[int]string, 10) // 如果不指定大小,map会默认分配大小的 a[1] = "张三" 阅读全文
posted @ 2022-11-25 16:00 aBiu-- 阅读(26) 评论(0) 推荐(0)
摘要: 创建客户端 func main() { // 所需的网络编程全都在net包下 conn, err := net.Dial("tcp", "127.0.0.1:8888") fmt.Println("客户端启动") if err != nil { // 连接失败 fmt.Println("客户端连接失 阅读全文
posted @ 2022-11-25 16:00 aBiu-- 阅读(28) 评论(0) 推荐(0)
摘要: 基本数据类型反射 // 利用函数的参数定义为空接口 func testRefect(i interface{}) { // 调用TypeOf函数,返回reflect.Type类型的数据 reType := reflect.TypeOf(i) fmt.Println(reType) // int // 阅读全文
posted @ 2022-11-25 16:00 aBiu-- 阅读(35) 评论(0) 推荐(0)
摘要: 文件 创建一个测试文件 代码测试: func main() { // 打开文件 file, err := os.Open("E:/test/Test.txt") if err != nil { // err不为空,说明报错 fmt.Println("文件打开出错:", err) } fmt.Prin 阅读全文
posted @ 2022-11-25 16:00 aBiu-- 阅读(25) 评论(0) 推荐(0)
摘要: 结构体 结构体的定义 // 定义结构体,老师的结构体,各个属性统一放入结构体管理 type Teacher struct { // 变量名大写开头外界可以访问 Name string Age int School string } func main() { // 创建老师的实例对象 var t1 阅读全文
posted @ 2022-11-25 16:00 aBiu-- 阅读(31) 评论(0) 推荐(0)
摘要: 协程概念 又称微线程,纤程,协程是一种用户态的轻量级线程 作用:在执行A函数时候,可以随时中断,去执行B函数,然后中断继续执行A函数(可以自动切换),这一切换过程并不是函数调用(没有调用语句),过程很像多线程,然而协程中只有一个线程在执行(一个线程中有多个协程) 代码案例:开启一个协程非常简单,调用 阅读全文
posted @ 2022-11-25 16:00 aBiu-- 阅读(123) 评论(0) 推荐(0)
摘要: 数组引入使用 func main() { // 给五个学生的成绩,求出总和、平均数 var scores [5]int scores[0] = 96 scores[1] = 91 scores[2] = 39 scores[3] = 60 scores[4] = 21 // 求和 sum := 0 阅读全文
posted @ 2022-11-25 15:59 aBiu-- 阅读(11) 评论(0) 推荐(0)
摘要: 切片的理解 func main() { // 切片是构建在数组之上 // 定义数组 var intarr [6]int = [6]int{1, 4, 7, 3, 6, 9} // 定义切片,从下标1位置截取到下标2的位置,不包含下标3的位置 slice := intarr[1:3] fmt.Prin 阅读全文
posted @ 2022-11-25 15:59 aBiu-- 阅读(21) 评论(0) 推荐(0)
摘要: 指针概念 比如如下代码,其实它是在内存中分配了一个空间,也可以打印出这个变量的地址 var age int = 18; // &符号 + 变量名,也就是&age,就是这个age变量的值的内存地址 fmt.Println(&age) // 0xc00000a0c8 在内存大概位置这样:有个名叫age的 阅读全文
posted @ 2022-11-25 15:59 aBiu-- 阅读(23) 评论(0) 推荐(0)
摘要: if单分支 var count int = 20 if count < 30 { fmt.Println("库存不足") } // 另一种写法: if后面可以并列加入变量定义, 使用分号;隔开 if a := 20; a < 30 { fmt.Println("库存不足a") } if双分支 var 阅读全文
posted @ 2022-11-25 15:59 aBiu-- 阅读(15) 评论(0) 推荐(0)
摘要: 函数写法 func main() { sum := cal(1, 1) fmt.Println(sum) // 2 } // 函数名首字母如果大写,可以在其他包中引用 // 函数语法:参数列表(可以0个或多个),返回值类型列表(可以0个或多个) func cal(num1 int, num2 int 阅读全文
posted @ 2022-11-25 15:59 aBiu-- 阅读(26) 评论(0) 推荐(0)
摘要: 算数运算符 // 1. 整数 var n1 int = +10 fmt.Println(n1) // 2. 相加操作 var n2 int = 4 + 7 fmt.Println(n2) // 3. 字符串拼接 var s string = "abc" + "def" fmt.Println(s) 阅读全文
posted @ 2022-11-25 15:59 aBiu-- 阅读(30) 评论(0) 推荐(0)
摘要: 先看正常的出现异常情况 func main() { test() // 上面方法执行有报错,所以下面代码不会执行 fmt.Println("上面方法执行成功...") fmt.Println("正常执行下面代码逻辑...") } func test() { num1 := 10 num2 := 0 阅读全文
posted @ 2022-11-25 15:59 aBiu-- 阅读(26) 评论(0) 推荐(0)
摘要: golang分基本数据类型和复杂数据类型 数值型 整数类型 有符号整数类型 无符号整数类型 其他整数类型 这么多的整数类型,如果定义时候没有给int类型赋值,默认是0 var a int fmt.Println(a) // 0 默认0 fmt.Println(unsafe.Sizeof(a)) // 阅读全文
posted @ 2022-11-25 15:58 aBiu-- 阅读(55) 评论(0) 推荐(0)
摘要: 测试demo: import io.netty.bootstrap.Bootstrap; import io.netty.bootstrap.ServerBootstrap; import io.netty.buffer.ByteBuf; import io.netty.buffer.PooledB 阅读全文
posted @ 2022-11-25 15:53 aBiu-- 阅读(112) 评论(0) 推荐(0)
摘要: <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.49.Final</version> </dependency> 测试demo: import io.netty.boot 阅读全文
posted @ 2022-11-25 15:53 aBiu-- 阅读(58) 评论(0) 推荐(0)
摘要: 测试demo: public class MainThread { public static void main(String[] args) { // 这里不错io和业务的事情 // 创建IO Thread 一个或多个 // SelectorThreadGroup stg = new Selec 阅读全文
posted @ 2022-11-25 15:52 aBiu-- 阅读(58) 评论(0) 推荐(0)
摘要: 测试POLL 测试代码: import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.*; import java.util.H 阅读全文
posted @ 2022-11-25 15:52 aBiu-- 阅读(200) 评论(0) 推荐(0)
摘要: NIO的问题: 优势: 通过1个或几个线程,来解决N个IO连接的处理。 问题: 虽然NIO一个线程可以处理所有事情,但每个操作都要出发系统调用,每个操作都是客户端主动的,无论是接收客户端,还是调用每一个客户端的是否读取到,都是程序向内核调用,然后内核给程序反馈。 这就出现了C10K,当io连接达到一 阅读全文
posted @ 2022-11-25 15:52 aBiu-- 阅读(213) 评论(0) 推荐(0)
摘要: 网络IO变化模型 说的io,都知道同步、异步、阻塞、非阻塞,还有同步阻塞、同步非阻塞、异步非阻塞。 不过没有异步阻塞的,这个是矛盾的,异步怎么还会阻塞? strace -ff -o out 路径: 追踪系统调用,关注io的实现 BIO 测试代码: import java.io.BufferedRea 阅读全文
posted @ 2022-11-25 15:52 aBiu-- 阅读(124) 评论(0) 推荐(0)
摘要: lsof -p: 查看网络通讯的文件描述符 netstat -natp: 只查看socket tcpdump: 抓取网络通讯包 测试代码:服务端的 import java.io.BufferedReader; import java.io.IOException; import java.io.In 阅读全文
posted @ 2022-11-25 15:51 aBiu-- 阅读(78) 评论(0) 推荐(0)
摘要: app是一个应用程序,应用程序有缓冲区,我们在写代码的时候,都用过Buffer。 应用程序肯定要访问内核,内核其实也是一个程序,应用程序和内核通信的时候,会调用一个system call(系统调用)。 system call 的实现是int 0x80,int是cpu的指令,0x80是16进制的,所以 阅读全文
posted @ 2022-11-25 15:51 aBiu-- 阅读(74) 评论(0) 推荐(0)
摘要: 一个系统从宏观角度来讲,有CPU,有内存,剩下的都是io设备。 然后从在程序维度来讲,有kernel(内核)说白了kernel就是一个程序,剩下的都是用户空间的程序(如图中app表示), 每个程序都是逻辑的,线性的 一个内存地址,通过MMU转到CPU的物理地址,一个程序模拟使用整个内存,它的空间肯定 阅读全文
posted @ 2022-11-25 15:51 aBiu-- 阅读(323) 评论(0) 推荐(0)
摘要: 之前用虚拟机配置了lvs,现在给清掉,使用ipvsadm -C 第一台机器: 给清掉,使用ipvsadm -C 把vip给down掉 第二台和第三台之前安装了隐藏vip 第四台机器还是个裸机 第一台和第四台机器安装keepalived:yum install keepalived ipvsadm - 阅读全文
posted @ 2022-11-25 15:47 aBiu-- 阅读(66) 评论(0) 推荐(0)
摘要: 这个关系图是基于DR模型,下面根据这个图搭建一个玩玩 第一个机器: 在第一台机器上搭建lvs,首先要有vip虚拟ip地址 到这里先暂停,把查看下面配置,把第二台机器和第三台机器配置好以后回来这里再操作下面的 安装工具:yum install ipvsadm -y 配置发送数据包的规则 配置好以后是立 阅读全文
posted @ 2022-11-25 15:47 aBiu-- 阅读(63) 评论(0) 推荐(0)
摘要: 负载均衡器不会与客户端进行连接握手,只是负责传送数据包到各个服务器,速度要求非常快,从而达到多个服务器负载均衡。 负载均衡器因为没有和客户端或服务端进行握手连接,所以并不知道客户端和服务端是什么连接协议,所以后端服务器是镜像的,才可以负载均衡,这和nginx是不太一样的。 lvs这种负载均衡是基于四 阅读全文
posted @ 2022-11-25 15:47 aBiu-- 阅读(137) 评论(0) 推荐(0)
摘要: OSI七层参考模型: 如图,说白了就是网络通信,就是两个人拿着电脑通信。 为什么要分层? 我们做编程的其实做的是软件工程学,里面有个重要的概念是分层解耦。 应用层:比如浏览器,tomcat,一些软件等等 表示层:协议,语义,字符串划分,加密等等这些 会话层:传输的控制,session等等,需要保持 阅读全文
posted @ 2022-11-25 15:47 aBiu-- 阅读(153) 评论(0) 推荐(0)
摘要: 击穿 当用户请求到用户的服务端时候,服务要去查询redis,如果redis里没有对应的数据,(或者key的有效时间到了,或者通过LRU算法把数据清楚了)要去数据库查找了。 但是就这么巧,这时候发生了高并发,同时都去请求这一个被删除的key了。 所以解决思路就是:发生了并发,要阻止直接请求到数据库。 阅读全文
posted @ 2022-11-25 15:41 aBiu-- 阅读(61) 评论(0) 推荐(0)
摘要: fork 时点错误意思就是在一个时间内如果对所有数据进行拷贝,在还没来得及拷贝的数据发生修改时,数据和开始拷贝的那个时间点不一致。 使用管道,只要用了管道就会创建子进程,子进程可以看到父进程的数据,但不能修改父进程的数据,所以不会有时点错误。 copy on write 比如父进程的redis里的虚 阅读全文
posted @ 2022-11-25 15:40 aBiu-- 阅读(52) 评论(0) 推荐(0)
摘要: 管道(pipeline) 比如说客户端连接到redis服务端以后,要进行很多命令的操作,每次执行命令都会经过网络io然后调用到redis服务端,管道的技术可以把多个命令进行压缩,这样一次调用就可以了。 使用nc 命令和redis建立连接,然后手动输入命令 新开窗口,获取k1 的值 上面方式理解后,可 阅读全文
posted @ 2022-11-25 15:40 aBiu-- 阅读(69) 评论(0) 推荐(0)
摘要: 要了解redis之前,要先知道一些常识: 基础知识 磁盘:数据保存在磁盘的 寻址:ms 带宽:G/M 内存: 寻址:ns2 纳秒级别 带宽:很大 结论:秒>毫秒>微秒>纳秒 所以磁盘比内存在寻址上慢了10W倍 I/O buffer:有个成本问题: 磁盘与磁道,扇区:一扇区 512Byte,带来一个成 阅读全文
posted @ 2022-11-25 15:40 aBiu-- 阅读(197) 评论(0) 推荐(0)
摘要: 为什么要集群?如果是单节点的redis,会有什么问题? 1,单点故障 2,容量有限 3,压力 AKF AKF的概念就是服务拆分,比如x轴,作为redis的服务集群,拷贝多个服务实例,保证服务高可用, y轴表示业务拆分,比如支付、订单等数据,进行业务拆分,把数据拆分到不同redis里 z轴表示进行更细 阅读全文
posted @ 2022-11-25 15:40 aBiu-- 阅读(45) 评论(0) 推荐(0)
摘要: 分布式配置 如果有一些服务器,在启动的时候需要一些配置,以及它们在运行的时候,有一些配置被变更了,它们要第一时间获知,这时候成本应该降到最低,所以这时候要用zookeeper,也就说把这些配置数据存到zk里面去,所有的客户端只要去watch这些数据或者get时候,如果当这些配置数据发生修改时候,就会 阅读全文
posted @ 2022-11-25 15:37 aBiu-- 阅读(83) 评论(0) 推荐(0)
摘要: zookeeper是作为分布式协调的,它的特点就是扩展性和可靠性很好,然后保证了时序性,并且很快,响应快,并且服务挂掉后恢复的很快。 扩展性: zookeeper分为三个角色,除了leader和follower以外,还有个角色是observer。 zookeeper还有个概念就是读写分离,写在lea 阅读全文
posted @ 2022-11-25 15:36 aBiu-- 阅读(61) 评论(0) 推荐(0)
摘要: 官网:http://zookeeper.apache.org/ 官网有描述:zookeeper是分布式协调服务,公开了一些简单的原语,我们可以构建这些原语,实现更高级的服务。 zookeeper允许分布式进程通过共享的分层命名空间相互协调,意思说的是zookeeper的数据模型和分层命名空间。 它是 阅读全文
posted @ 2022-11-25 15:35 aBiu-- 阅读(107) 评论(0) 推荐(0)
摘要: general 通用属性 datadir=/var/lib/mysql 数据文件存放的目录 socket=/var/lib/mysql/mysql.sock mysql.socket表示server和client在同一台服务器,并且使用localhost进行连接,就会使用socket进行连接 pid 阅读全文
posted @ 2022-11-25 15:18 aBiu-- 阅读(219) 评论(0) 推荐(0)
摘要: 对于用户而言,分区表是一个独立的逻辑表,但是底层是由多个物理子表组成。分区表对于用户而言是一个完全封装底层实现的黑盒子,对用户而言是透明的,从文件系统中可以看到多个使用#分隔命名的表文件。 mysql在创建表时使用partition by子句定义每个分区存放的数据,在执行查询的时候,优化器会根据分区 阅读全文
posted @ 2022-11-25 15:18 aBiu-- 阅读(70) 评论(0) 推荐(0)
摘要: 查询慢的原因 网络 CPU IO 上下文切换 系统调用 生成统计信息 锁等待时间 优化数据访问 查询性能低下的主要原因是访问的数据太多,某些查询不可避免的需要筛选大量的数据,我们可以通过减少访问数据量的方式进行优化:减少io次数 确认应用程序是否在检索大量超过需要的数据 确认mysql服务器层是否在 阅读全文
posted @ 2022-11-25 15:18 aBiu-- 阅读(43) 评论(0) 推荐(0)
摘要: B+树 想个问题,如果设计一个索引结构,使用哪种数据结构好呢? 如果使用hash表肯定不太好,占用空间太大,每个数据下标位置是个链表 如果使用二叉树会好一点,但不管是平衡二叉树还是红黑树,随着数据增多,都会引发一个数据的深度的问题,查个数值可能会走很多节点的索引。 所以考虑多叉树,如:B树 B树的好 阅读全文
posted @ 2022-11-25 15:17 aBiu-- 阅读(72) 评论(0) 推荐(0)
摘要: 如图:使用explain查询sql语句的执行计划 参考列字段查看执行计划 如果sql关连的比较多: 通过id查看执行的具体顺序,如果id一样,就是从上往下依次执行的 如果id不一样:id值越大,优先被执行 如果有id一样的,也有值大的id:先执行值大的id的sql,然后id一样的sql,从上往下依次 阅读全文
posted @ 2022-11-25 15:17 aBiu-- 阅读(22) 评论(0) 推荐(0)
摘要: 更小的通常更好 应该尽量使用可以正确存储数据的最小数据类型,更小的数据类型通常更快,因为它们占用更少的磁盘、内存和CPU缓存,并且处理时需要的CPU周期更少,但是要确保没有低估需要存储的值的范围,如果无法确认哪个数据类型,就选择你认为不会超过范围的最小类型。 说明: 比如很多初级开发在设计表的时候, 阅读全文
posted @ 2022-11-25 15:17 aBiu-- 阅读(58) 评论(0) 推荐(0)
摘要: 基础层次 聊到mysql时候,首先要知道mysql的一个层次, 客户端 server 存储引擎 首先客户端要发送请求和服务端进行连接,所有先有个连接器,会有一些认证,比如用户名和密码的匹配, 第二步,客户端和服务端连接后,要发送一些请求,所以有个分析器。客户端发来的sql语句本质上就是个字符串,所以 阅读全文
posted @ 2022-11-25 15:17 aBiu-- 阅读(185) 评论(0) 推荐(0)
摘要: 事务并发问题 单个线程在跑的时候,只要开启事务关闭事务中间,进行的操作,可以保证事务正确性,但如果是多线程并发情况下,肯定是不行的。 脏读 第一个事务开启后准备查数据,第二个事务开启后然后修改了数据,第一个事务读到了第二个事务修改过的数据,但是第二个事务修改了数据后,没有提交事务,回滚了。导致第一个 阅读全文
posted @ 2022-11-25 15:17 aBiu-- 阅读(43) 评论(0) 推荐(0)