- 博客(29)
- 收藏
- 关注
原创 MySQL表空间详解
1 表空间总览2 页面结构其中页面的通用部分有:File Header和 File Trailer。2.1 File Header组成check sum:校验和page offset:页号prev & next:前后指针LSN:页面最后修改对应的LSNtype:页面类型undo、溢出页、新分配、索引页(数据页)…flush LSN:仅在系统表空间中第一页定义,代表文件至少被刷新到了对应的LSNspace ID:属于哪个表空间3 区和组的概念连续64页为一个区,
2021-07-29 23:24:53
4692
2
原创 MySQL索引详解
create table index_demo( c1 int, c2 int, c3 char(1), primary key(c1))ROW_FORMAT=COMPACT;1 Record type0:普通记录1:B+树非叶子节点的记录2:Infimun3:Spuremum2 下页大于上页的主键insert into index_demo values (1,4,'u'), (3,9,'d'), (5,3,'y');insert i
2021-07-29 23:15:33
325
原创 MySQL页结构详解
1 页结构总览2 建表语句create table page_demo( c1 int, c2 int, c3 varchar(100), primary key(c1))charset=ascii row_format=COMPACT;3 User Records & Free Space插入一条记录时,都会从Free Space中申请一个记录的大小,划分到User Records部分。当Free Space中所有的空间全部被User Records部分替代
2021-07-29 23:11:45
1405
原创 MySQL行格式详解
1 指定行格式的语法create table recode_format( c1 varchar(10), c2 varchar(10) not null)charset=ascii ROW_FORMAT=COMPACT;2 compact行格式2.1 变长字段列表由最开始的建表语句可知,表中只有两个列,假设现在插入一些值进入表中insert into recode_format(c1, c2) values("aaa", "bbbbb"), # 第一条记录("a","bb
2021-07-29 23:06:18
1179
1
原创 LVS--企业最前端的流量接入层
负载均衡负载均衡服务器:快速转发所有的流量到后台的service服务器集群,就像是一个路由器,没有任何和客户端的握手,只有七层网络模型的下边三层即网络层、链路层、物理层,就看一下数据包中的IP地址,即可发给对应服务器即可,但是后端服务器必须是镜像服务器NAT模式NAT是什么地址转换,我们在自己家这个局域网中访问百度为什么能访问到?因为路由器帮我们做了地址转换。这是SNAT,也就是源地址转换LVS的NAT模式这里是DNAT,目标地址转换直接路由隧道模式VPN的实现方式VIP对
2021-07-01 23:18:26
423
原创 Redis缓存存在的三个问题及其解决方式
击穿为什么会有击穿Key的过期LRU、LFU导致Key已被移除如何解决分布式锁分布式锁的问题设置锁的Redis挂了:设置锁的过期时间没挂但是锁时间太短导致超时锁失效,后续线程新设置了一把锁进到数据库继续使用多线程:线程1去数据库取数据,线程2每隔一段时间如果更新锁过期时间但是这样就导致了客户端代码量增多所以我们自己实现分布式协调挺麻烦的。看后续有了ZooKeeper怎么帮我们解决这些分布式协调的问题的。穿透为什么会有穿透从业务接收的查询是你的系统根本不存
2021-07-01 23:02:52
188
1
原创 布隆过滤器
问题不安全的网页的黑名单包含100亿个URL,每个URL最多占用64B。现在想要饰演一个网页过滤系统,利用该系统可以快速判断网页的URL是否在黑名单上,请设计该系统。要求:该系统允许有万分之一的判断失误率。使用额外空间不许超过30G哈希函数性质无限的输入值域同样的输入,返回值一样传入不一样的值时,可能会返回一样的值这是必然的,因为输入域无穷大,还有同一的离散输出域最重要的性质是输入不同的值,返回值均匀的分布在输出域上布隆过滤器操作步骤假设有一个长度为 leng
2021-07-01 22:58:45
146
原创 Redis Cluster
ClusterAKF图解X:全量镜像Y:业务功能Z:数据分片Redis:主从机上进行读写分离Kafka:读写全部在主机上进行,所有从机全部用作主机挂机时的高可用替换主机集群解决了单点故障,单机容量、单机访问量的问题,但是引入了新的问题数据一致性问题强一致性主节点写,阻塞,所有从节点全部写完才给用户返回,破坏了可用性,但是我们本来建立集群就是加强可用性的,这不是违背了自己的开始的逻辑了吗?容忍不一致所以我们要么容忍数据丢失一部分(主自己写成功,然后从节点异步同步)最终一
2021-07-01 22:53:35
205
原创 Redis数据库
数据库结构体typedef struct redisDb { // ... //数据库id,默认一共16个 int id; // 数据库键空间,保存着数据库中的所有键值对 dict *dict; // 保存键的过期时间 dict *expires; // ...} redisDb;存储对象用一个大字典。数据库dict和expires都是使用指针指向同一个对象,所以不存在数据冗余的情况,此处好画图而已。过期键删除策略定时删除:清内存,但是耗
2021-07-01 22:46:50
118
原创 Java垃圾收集器超详细解析
1.随线程而生的内存程序计数器、虚拟机栈、本地方法栈栈中的栈帧随着方法的进入和退出可以进行自动分配栈帧内存与回收2.堆区内存回收2.1 可达性分析2.1.1 GC Roots虚拟机栈本地变量表中的引用对象,包括传递的参数、局部变量、临时变量等类中静态属性和常量引用的对象(方法区中)本地方法栈中引用的对象虚拟机内部引用synchronize 锁定的对象2.1.2 引用类型与垃圾回收强引用:软引用:内存不够时进行第一次垃圾回收,先保留,看此次收集完之后够不够分配,如果仍然不够再回
2021-05-22 22:26:31
585
原创 计算机网络 传输层
TCP三次握手客户端–发送带有 SYN 标志的数据包–一次握手–服务端服务端–发送带有 SYN/ACK 标志的数据包–二次握手–客户端客户端–发送带有带有 ACK 标志的数据包–三次握手–服务端为什么要三次握手三次握手的目的是建立可靠的通信信道,说到通讯,简单来说就是数据的发送与接收,而三次握手最主要的目的就是双方确认自己与对方的发送与接收是正常的。第一次握手:Client 什么都不能确认;Server 确认了对方发送正常,自己接收正常第二次握手:Client 确认了:
2021-03-22 00:14:19
194
原创 计算机网络 应用层
HTTPKeep-Alive 和非 Keep-Alive非 Keep=Alive必须为每一个请求的对象建立和维护一个全新的连接。每一个连接,客户机和服务器两端都要重新分配 TCP 的缓冲区和文件描述符,这给服务器带来的严重的负担Keep-Alive保持该 TCP 连接打开缺点就是当长时间的保持 TCP 连接时容易导致系统资源被无效占用,需要正确地设置 keep-alive timeout 参数,当 TCP 连接在传送完最后一个 HTTP 响应,该连接会保持 keepalive_timeout
2021-03-22 00:04:53
177
原创 Redis基础知识大全
1 SDSstruct sdshdr{ // 记录buf数组中已经使用的字节数量 // 等于SDS所保存的字符串的长度 int len; // 记录buf数组中未使用的字节数量 int free; // 字节数组,用于保存字符串 char buf[];}SDS为什么性能高常数复杂度获取字符串长度【O(1)】,C语言字符串需要遍历一次【O(N)】不用检查是否会溢出,SDS函数接口会帮我们检查是否会char数组溢出,如果溢出会申请一块新
2021-03-13 20:28:32
176
原创 Java虚拟机字节码执行引擎详解
1. 栈帧结构局部变量表、操作数栈、动态链接、方法返回地址、附加信息2. 局部变量表用于存放方法参数和方法内部定义的局部变量。编译为Class文件时,就在方法的Code属性的max_locals数据项中确定了该方法所需分配的局部变量表的最大容量。局部变量表的容量以变量槽为最小单位,局部变量表中的变量槽是可以重用的。如果访问的是32位数据类型的变量,索引N就代表了使用第N个变量槽,如果访问的是64位 数据类型的变量,则说明会同时使用第N和N+1两个变量槽。对于两个相邻的共同存放一个64位数据 的两个
2021-02-22 19:32:41
256
原创 Java虚拟机的类加载机制详解
类的生命周期1. 加载加载过程总览通过一个类的全限定名来获取定义此类的二进制字节流。通过字节流的方式把 .class文件放入MetaSpace在堆中生成一个Class对象,指向这个.class文件的地址动态代理类的加载java.lang.reflect.Proxy或者CGLib都是在运行时生成字节码,也可以把这个直接在堆内存中的字节码加载进到MetaSpace,同样堆中生成一个Class对象指向这块内存。数组类的加载如果数组的元素类型是引用类型,而且这个类还没有被放入MetaSp
2021-02-21 19:03:43
184
原创 Java类文件结构详解
类文件结构package com.szu.jvm.learn01_bytecode;/* * @Author 郭学胤 * @University 深圳大学 * @Description * @Date 2021/2/20 13:33 */public class L01_EmptyClass {}下图为一个空文件编译出来的class文件1. 魔数和version前四个字节:CA FE BA BE,类文件固定开头,名字叫做魔数(magic number)第五六七八字节:0
2021-02-20 16:36:17
285
原创 Java List详解-从Vector到CopyOnWriteList
Vectorpublic class Vector<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable{ protected Object[] elementData; protected int elementCount;}这是两个核心变量,可以发现Vector的底层容器是一个Obje.
2021-02-19 21:59:43
495
1
原创 Java Map详解-从HashMap到concurrentHashMap
1. HashMap源码注释中有这么一句话:In usages with well-distributed user hashCodes, tree bins are rarely used.意思是说只要hash算法做得好,hash冲突少,红黑树基本用不上属性值一览public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializa.
2021-02-19 21:55:59
1070
原创 Java Queue详解-从普通Queue到ConcurrentQueue
队列类关系总览1. ArrayQueue环形队列public class ArrayQueue<T> extends AbstractList<T> { private int capacity; // 对象数组长度 private T[] queue; // 对象数组 private int head; // 头指针 private int tail; // 尾指针}常用方法代码很简单,不多赘述,一看就能明白。不支持迭代
2021-02-19 21:53:45
850
原创 AQS ReentrantLock ReentrantReadWriteLock CountDownLatch源码阅读
1. AQS源码阅读1.1 AQS简介AbstractQueuedSynchronizer 简称AQS,是实现JUC包中各种锁的关键,此类是一个模板类,具体的ReentrantLock、CountDownLatch、ReadWriteLock等等都是自己去实现里边变量的使用规则。各种类型的锁都有自己的锁类型信息比如ReadWriteLock就肯定会有当前的锁状态是读锁模式还是写锁模式static final Node SHARED = new Node(); // 当前锁状态是 共享锁(读锁
2021-02-19 21:30:48
195
原创 Java中的强软弱虚四种引用和ThreadLocal
1 强引用1.1 什么是强引用// 情况1static Object o = new Object();// 情况2public void get(){ Object o = new Object();}就是最普通的创建对象方式,当使用new关键字经过创建对象的三个步骤完成之后,对象o此时就有了一个指向堆内存中这个对象的一个引用。1.2 与垃圾回收的关系1.2.1 什么可以作为GC Root由于Java使用的垃圾回收机制是根可达算法,使用为GC Root的对象都有以下几种
2021-02-12 21:27:19
360
原创 IO 线程图解 & Netty框架
请看前文 select poll epoll 超详解释1 Selector上文说到了从BIO到多路复用器的演变路程和各个多路复用器的工作流程,还介绍了epoll的边缘触发和水平触发的问题。如下是Java NIO包下的方法调用对应系统调用的详细对比,请看如下Java代码和注释。public class Test { private ServerSocketChannel server = null; private Selector selector = null; int p
2021-01-24 20:29:08
466
4
原创 select、poll、epoll - IO模型超详解
Linux操作系统有关IO的知识铺垫1. PagecacheLinux内核所使用的的主要磁盘高速缓存。内核读写磁盘的时候都要用到这个PageCache。如果程序想要读的部分不在高速缓存,则先申请一个4KB大小的新页框加到PageCache,然后再用磁盘读到的数据填充。写操作的时候,先把要写的数据写到pageCache,标记当前页面为脏,然后要么程序自己调用系统调用刷盘,要么就等着内核到了自己的默认设置去给你刷回去。如果没有及时写出现了断电,那么你就白写了。2. 文件描述符创建文件描述符,文件描述
2021-01-24 20:17:36
10587
34
原创 JVM 内存模型与线程
1 硬件的效率与一致性为了解决CPU与内存的速度差异,引入了高速缓存,如果有多个CPU而且他们又共享同一主存,所以引入了一个新的问题:缓存一致性。为了解决这个问题,需要CPU在访问缓存时都要遵循一定的协议,比如MESI协议(文末有粗略的解释MESI协议,并未深入研究)。2 Java内存模型每条线程有自己的工作内存(类似于cache),工作内存中包括主存中数据的副本,但是不包括线程私有的局部变量和方法参数。如果局部变量是一个reference,他引用的对象在Java堆中被各个线程共享,但是refe
2020-12-09 12:17:25
211
原创 JVM 内存区域和对象创建过程
1. 运行时数据区1.1 程序计数器每条线程都有自己的程序计数器,各条线程之间计数器互不影响,独立存储1.2 Java虚拟机栈每个线程start的时候都会创建一个虚拟机栈,每个方法执行的时候虚拟机为其创建栈帧,用于存储局部变量表、操作数栈、动态链接和方法出口等信息。方法调用到执行完毕都是栈中入栈到出栈的过程线程的创建数量是与随着栈内存的增多而减少的:这也很容易理解,线程会有一个私有的虚拟机栈,栈内存越大,虚拟机可以创建的线程数越少。栈中的局部变量表基本数据类型,对象引用(reference
2020-12-09 00:03:46
198
原创 JVM 线程安全和轻量级锁、重量级锁、偏向锁及其优化
1. 线程安全的实现方法1.1 互斥同步(悲观锁)synchronized特性重量级,Java线程映射到操作系统内核线程,所以会导致用户态到内核态的切换同一条线程是可重入的monitorenter执行时吧对象的锁计数器加一,monitorexit会把计数器减一,减为0时才真正释放锁无法强制已获取锁的线程释放锁,也无法强制正在等待锁的线程中断或者退出This Monitor 和 Class Monitor根据修饰的方法类型来决定取所在的对象实例this还是取类型对应的Class对象
2020-12-08 23:53:44
446
原创 Java线程的定义
1. exec()当进程调用exec()函数时,该进程的执行程序完全替换成新程序,而新程序则从其main()函数开始执行。调用exec()并不创建新进程,前后的进程ID并未改变,只是用磁盘上的新程序替换了当前程序的正文段、数据段和堆栈2. exit()2.1 进程终止的5种正常方式main函数执行return语句,等效于调用exit()调用exit()函数。但是exit()并不处理文件描述符、多进程(父进程和子进程)和作业控制调用_exit或者 _Exit ,目的是为进程提供一种无需运行终止
2020-12-05 22:25:28
203
原创 ubuntu安装docker以及docker安装mysql、redis、rabbitmq、elasticsearch、zookeeper全教程
1查看ubuntu系统是32位的还是64位的:getconf LONG_BITsudo apt-get update2允许apt通过https使用repository安装软件包sudo apt-get install \apt-transport-https \ca-certificates \curl \gnupg-agent \software-properties-common3添加Docker官方GPG keysudo curl -fsSL https://download.
2020-08-12 00:49:55
371
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人