- 博客(35)
- 收藏
- 关注
原创 redis - 集群知识
client连接集群时,会得到集群的槽位配置信息,保存在本地,下次请求的时候就可以明确节点(对key进行hash运算,然后16384进行取模运算)。原因是,在迁移完成之前,目标节点不会管理新的槽位,如果此时正常请求目标节点,会返回MOVED,然后客户端又要重新请求旧的节点。集群中的每个节点可以设置多个从节点,当主节点发生故障后,集群会自动升级某个从节点为主节点,如果没有从节点,集群将是不可以用的状态。buffer是一个定长的环形数组,如果从节点的同步速度小于主节点的写入速度,buffer会覆盖前面的内容。
2024-12-28 15:43:25
533
原创 IO模型学习
也就是socket缓冲区,此时处理逻辑的程序是无法操作这部分数据,所以内核空间封装read和write函数 供用户空间使用。服务端在和其中一个客户端建立连接、接收数据、处理逻辑阶段都是非阻塞的。服务端在和其中一个客户端建立连接、接收数据、处理逻辑阶段都是阻塞的,别的客户端连接不进来。Socket 同样也是一种资源,也会对应一个FD。,这样客户端才能链接上socket。其次,服务器通过网卡接收数据,接收到的数据会放在。客户端和服务端通信时,客户端需要数据。首先,socket的操作都是在内核空间去做的。
2024-12-26 17:44:40
366
原创 分布式事务的解决方案-Seata 简介
备注:TC 为单独部署的Serve端(类似于注册中心啥的) TM 和RM为嵌入到应用中的client端。即:子事务可以直接提交,并记录undolog(并非mysql的undolog)释放资源锁。XA的缺点:性能较差,需要等全部的结果;TC服务存在单点故障问题。实际上就是为了解决XA模式性能较差的问题。TCC的核心是预占。
2024-12-18 12:19:05
270
原创 从根上理解 mysql -数据在表中是怎么存储的
同理,代表段的INODE Entry结构占用192个字节,一页能存储85个这样的结构,但是如果表中的数据超过85个段,就需要用别的INODE类型的页面来存储。所以一个页面能放的XDES Entry是有限的,所以,才有了组的概念(不分组 放不下啊)。ok,引入区的概念是为了转随机IO为顺序IO,但是B+树中真正存储数据的是叶子结点,如果把所有节点都放在一起,那么在进行范围查询的时候,也是随机IO。一个区默认1M, 一个索引两个段,哪怕一个段中只有一个区,一个索引也是至少2M空间,这未免有点浪费吧。
2024-12-10 14:39:51
1211
原创 从根上理解 mysql -数据在页中是怎么存储的
B+树 的检索是按照页去检索的,但是页中的记录怎么检索呢。实际上,页中也是分了组的,而 Page Directory中记录的就是每组中最大记录的偏移量。每组中的最大的记录行中的。最小记录和最大记录,两个虚拟的行记录 5 记录头+ 8 固定 表示单词。前4个字节:页的校验和 和 Page Header相对应。占用固定的56个字节,专门存储各种状态信息 数据页专用。后4个字节:页面被最后修改时对应的日志序列位置(LSN)所有类型的页都适用 记录页的通用信息。属性即记录这个组中有几条记录。
2024-12-09 20:04:24
750
原创 从根上理解 mysql -一行数据是怎么存储的
如果某一列中的数据非常多的话,在本记录的真实数据处只会存储该列的前768个字节的数据和一个指向其他页的地址,然后把剩下的数据存放到其他页中,这个过程也叫做行溢出。:char类型,虽说是固定长度类型,但如果字符集为gkb 或者utf8的时候,实际存储的字节也是无法确定的,因此也会在。so 若字符集选择ascii,那最大长度为65532,如果设置了not null 那最大长度为65533。:CHAR(M)类型的列要求至少占用M个字节(哪怕存一个字符a),而VARCHAR(M)却没有这个要求。
2024-12-09 14:16:03
463
原创 git 操作
举例: 如果从 master(A-B) 拉个feature分支出来,然后提交了几个 commit(A-B-C-D),这个时候刚好有人把他开发的东西合并到 master(A-B-E) ,这个时候 master 就比你拉分支的时候多了几个 commit,如果这个时候你 rebase master 的话,就会把你当前的几个 commit,放到那个人 commit 的后面(A-B-E-C2-D2)。撤销某次提交,撤销也是一种提交。merge 会把a分支最新的提交和b分支最新的提交合并成一个新的提交。
2024-05-16 15:47:57
415
原创 Spring解决循环依赖为什么需要三级缓存
如果ServiceA中有@Async 或者@Transactional等 项目启动会报错。为什么呢?因为B依赖A时,执行了A的lambda表达式会创建A的代理对象前,把对象放在earlyProxyReferences中,代表已经进行了aop操作,在执行A的初始化后续操作(BeanPostProcess.postProcessAfterInitialization),会校验earlyProxyReferences中是否执行过aop,如果执行过则不在执行。
2024-04-15 22:55:40
413
原创 SpringBean的生命周期
https://gitcode.youkuaiyun.com/65e6e4a31a836825ed78701b.html?dp_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6MTI3Mzc3OSwiZXhwIjoxNzEzMjgyMTg5LCJpYXQiOjE3MTI2NzczODksInVzZXJuYW1lIjoiY2hhbmc3NjU3MjEifQ.203_YZH4P2flL6H-FD3tcTbi4G-2ERZfAcwPPVKHDys
2024-04-15 22:17:58
161
原创 【jvm垃圾收集之跨代引用】
目前的垃圾收集器多数都是基于分代收集理论进行的。以Parnew+cms垃圾收集器为例,假设要进行一次新生代的垃圾收集,但新生代的对象是完全有可能被老年代中的对象引用的,为了判断新生代中某个对象是否存活,需要额外遍历整个老年代来确保可达性分析的正确性,反过来也是一样。这种方案固然可行,但同时给垃圾收集带来很大的性能负担。注:不仅新生代、老年代存在跨代引用,G1的rigen之间也存在跨代引用,即所有涉及到部分区域收集的收集器都面临这样的问题。...
2022-08-29 09:23:54
540
原创 springmvc 执行流程
浏览器请求地址:localhost:8080/hello1、请求经过前置控制器(DispatchServlet)DispatchServlet 在服务启动的时候创建 (就是你的web.xml配置的)并进行一些初始化 (initHandlerMappings 、initHandlerAdapters、initViewResolvers这三个看着是不是很熟悉)DispatchServlet其实就是对Servle进行的拓展:DispatcherServlet 继承FrameworkServlet,Frame
2022-07-01 11:58:41
221
原创 【jvm对象生存还是死亡】
对象死了吗?堆中的对象是否应该被回收,首先需要去确认下这个对象是存活还是死亡。如何判断?引用计数法引用计数法即为每个对象添加一个引用计数器,每当有一个地方引用时,计数器++,当引用失效时,计数器–,最终计数器为0时说明对象已经无人引用,即可以被回收。引用计数法实现逻辑简单,效率也很高,但是主流的java虚拟机没有选用该算法进行内存管理的,原因是无法解决循环引用的问题。如:对象A引用B,对象B同时引用A,除此之外没有其他地方引用,实际上这两个对象不可能再被访问,但是因为引用计数器不为0导致无法被回收
2022-04-28 16:01:08
198
原创 2022-04-26 垃圾收集器
jvm 垃圾收集器再忙再累,不忘垃圾分类!!!年轻代(复制算法)Serial 收集器单线程收集器。单线程的意义不仅仅说明只是通过一个cpu或者或者一个线程去完成垃圾收集,更重要的是垃圾收集器在工作时,会暂停其他所有的工作线程(STW:Stop The Word)。优点:client模式的首选,简单高效,没有线程切换的开销。ParNew 收集器Serial收集器的多线程版本。除了使用多线程进行垃圾收集外,其他的功能和Serial收集器基本一致,在实现上二者共用了很多代码。优点:ParNew是很
2022-04-27 16:40:11
137
原创 【redis源码之hash】
深入redis hash (字典)内部数据结构字典是redis中出现最为频繁的一种数据结构,除了hash类型外,redis中所有的key-value 组成一个全局字典,带有过期时间的key和其过期时间也是一个字典。zset集合中存储的value和score也是一个字典。struct RedisDB{ dict *dict;//all keys =>value dict *expires: //all expired key=> time}struct zset{ dict *di
2022-04-15 16:22:42
790
原创 redis-源码
redis源码-字符串结构redis 中的字符串叫SDS (simple dynamic string),结构如下:struct SDS<T>{ T capacity; // 数组容量 T len; // 实际长度 bytes flags; // 特殊标志位 无需关注 byte[] content; // 数组内容 实际存放的值}capacity 和len 有点类似java中的ArrayList。一般来说redis就预分配空间,即capacity &g
2022-04-14 22:06:23
665
1
原创 redis-过期
redis key 删除策略redis将所有设置了过期时间的key放到一个独立的字典中过期删除过期策略:定时删除+惰性删除定时删除贪心策略。每秒进行10次扫描,每次从过期字典中取出20个key,如果过期的数量超过1/4,则重复进行扫描,否则终止。为了防止循环过度,阻塞客户端请求,扫描时间不会超过25ms,即若客户端请求过来时,此时正在执行定时扫描任务,则客户端最大等待的时间为25ms。备注:从节点不会定时扫描,当主节点中的某个redis key过期了,会产生一个AOF指令,从节点通过同步AO
2022-04-14 16:39:01
311
1
原创 【2022-04-11 对象的内存布局】
对象的内存布局对象在内存中可以分为三块区域。对象头+实例数据+对齐填充对象头对象头包括两部分:① mark word:存储对象自身的运行时数据。包括:哈希吗,分代信息,锁的标志位,线程持有的锁,偏向线程id,偏向时间戳。这些信息在32位机器和64位机器上分别占用32bit和64bit。实际上上述信息占用的大小会大于32bit 或者64bit。实际上,mark word是非固定的数据结构,会根据自身的状态复用存储空间(如果未处于锁定的状态,那么25bit用于存储哈希码,4bit存储分代年龄,2用于存.
2022-04-11 21:33:36
316
原创 2022-04-11 对象的创建
java 对象的创建过程虚拟机在遇到一个new 指令时,首先会去常量池中定位到这个类的符号引用,并且检查这个类是否已经被加载、解析和初始化过,如果没有,那必须先进行相应的类加载的过程。类加载检查完成后,开始为对象分配内存内存的分配方式有两种:① 指针碰撞:内存是规整的,用过的内存和空间内存用指针隔开,当需要内存时,只需要移动指针即可。② 空闲列表 :内存不是规整的,使用的内存和空闲内存相互交错,虚拟机通过维护一个列表来记录那些内存是可用的,分配内存时从列表中找到相应大小的内存即可。采用哪种分配方式取
2022-04-11 21:03:48
374
原创 【2022-04-09 jvm 垃圾回收-空间分配担保】
空间分配担保在年轻代发生Minor Gc之前,虚拟机会检查年老代最大连续可用空间是否大于新生代对象的总空间,如果大于,则说明是安全的,可以进行MinorGc如果年老代最大连续可用空间小于新生代对象的总空间,则需要检查下是否允许空间分配担保失败,如果设置为允许,那么虚拟机会继续检查老代最大连续可用空间是否大于历次晋升到老年代对象的平均大小,如果大于,则说明可以进行GC,但是本次GC是有安全的,由于允许空间分配担保,所以可以进行GC如果老代最大连续可用空间小于历次晋升到老年代对象的平均大小 或者 设置不
2022-04-09 18:59:30
433
原创 jvm- 类加载过程
类加载过程1)Loading(载入)JVM 在该阶段的主要目的是将字节码从不同的数据源(可能是 class 文件、也可能是 jar 包,甚至网络)转化为二进制字节流加载到内存中,并生成一个代表该类的 java.lang.Class 对象。2)Verification(验证)JVM 会在该阶段对二进制字节流进行校验,只有符合 JVM 字节码规范的才能被 JVM 正确执行。该阶段是保证 JVM 安全的重要屏障,下面是一些主要的检查。3)Preparation(准备)JVM 会在该阶段对类变量(也称为
2021-10-13 19:55:13
125
原创 2021-09-10 springboot 配置log4j2日志,并输出到文件
springboot 配置log4j2日志,并输出到文件1 pom文件 <!-- 引入springboot log4j2依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </depend
2021-09-10 15:35:58
603
原创 spring注入的对象是本身吗
spring注入的对象是本身吗直接上结论1 spring在没有使用aop的时候,注入的是就是对象本身。2 spring很多功能都是通过aop来实现,如果事务,缓存注解,异步、还有一些自定义的aop等等,而aop是通过动态代理来实现的,spring主要用到的动态代理有jdk的动态代理和cglib。3 若被代理的对象实现的接口,则是jdk代理,否则是cglib代理。4 若是aop spring注入的时候需要注入接口经常我们遇到的事务生效或者异步未生效,其中部分原因就是在同一个类中去调用有注解的方法
2021-09-02 17:09:59
657
原创 RcoketMQ 消费mq的两种方式
RcoketMQ 消费mq的两种方式:pull 和 pushpush:消费者注册MassageListener监听器,时刻监听从broke推过来的消息并消费。pull:消费者自己实现取消息的逻辑,首先通过topic取出所有的MassageQueue,遍历所有的MassageQueue,然后从每个MassageQueue中批量取出消息并记录当前队列的offset。区别push实时性高,但是会增加服务的负载,如果push过快,服务端会出问题。pull主动权在消费者手里,可控性好。但实时性不好保
2021-08-31 19:34:11
591
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅