- 博客(42)
- 收藏
- 关注
原创 Spring中Bean生命周期
*Java对象****基础的类信息****对象的元信息****单例还是多例****用于打破循环****判断是否包含**
2023-10-10 11:01:16
18
原创 MySQL基础架构
在进行Redolog 和 UndoLog的写操作时,不会直接写入磁盘,会先写入到Log Buffer中,顺序写的效率远高于随机写,并且批量写入磁盘可以减少IO次数提高效率。时,如果数据不在缓冲池中,需要先将数据从磁盘中查询出来,此时因为数据需要被修改,不会直接放到Buffer Pool中,而是会放到。负责将SQL语句的执行方式确定下来,例如在表中有多个索引时,需要。时,会先将数据页从磁盘中查询出来,先放到。中,不同页之间用链表进行存储。**操作单位是页**
2023-10-10 10:57:46
25
原创 MySQL索引原理以及优化
在数据量较大时,type会由RANGE变为ALL,全表扫描从而导致查询很慢。IN查询在数据量大时由于优化器优化为ALL,如果数据内IN中的值较多,属于误判,可以使用。**数据的唯一性****占据磁盘空间****需要维护索引****插入时间较长****可以建立多个****最左前缀原则****只支持表级锁****崩溃恢复机制****高度差小于1****高度会非常高****进行多次IO****JOIN查询****JOIN查询****不等值的查询****小表驱动大表****JOIN查询**
2023-10-10 10:57:08
27
原创 Innodb的数据存储结构
目前,InnoDB支持4中行记录格式,分别是 Compact、Redundant、Dynamic和Compressed 行格式。Innodb默认的行格式为。行->页->区->段->表空间。**可变长度列表****仍会继续往下**
2023-10-10 10:56:13
49
原创 MySQL事务原理
因为WAL机制,会在 Redo Log Buffer中写入相关的日志,在大量日志的情况下,Buffer的空间会不足,此时则需要CheckPoint机制来进行文件的清除。减少数据库恢复的时间,在将文件刷入到文件后,可以使用CheckPoint记录当前的位置,在故障恢复时,则只从CheckPoint开始恢复即可。当Buffer空间不足时,LRU算法会溢出最近最少使用的页,如果此页为脏页,则会强制执行CheckPoint,将脏页刷入磁盘中。
2023-10-10 10:55:40
29
原创 MySQL中的锁以及加锁细节
在聚簇索引中,只锁一条记录 SELECT * FROM xx WHERE id = 1 FOR UPDATE。在加上间隙锁后,如果此时有一条id=4的记录想要插入,则会被阻塞。但是每个阻塞等待的锁都会主动判断是否存在死锁,因此不开启。的字段需要获取值时,都需要先获取到这个自增锁。阻塞的原理是会在插入时,会生成。**删除一条记录****数据类型长度****数据类型发生****重新插入一条****行列进行操作****读写的意向锁****表级的读写锁****等待超时时间****前开后闭区间**
2023-10-08 11:09:25
93
原创 MySQL中的MVCC是什么
多版本并发控制,用于**解决读写冲突**,在一个数据行正在进行写操作时,另外的事务想要可以**读取以前版本的数据**,从而不会被阻塞,提高并发效率。**快照读**不会进行阻塞,读取的是**旧版本的数据**,使用方法即**普通的查询**。**当前读**会**阻塞**直到获取到数据行的**共享锁**,读取的是**新版本的数据**。INSERTDELETEUPDATE数据行中删除仅作为标记位,目的是为了给MVCC提供服务,要保留数据行的历史数据。MVCC解决了读写冲突的问题。
2023-10-08 11:08:48
29
原创 MySQL如何进行分库分表
垂直拆分 例如原本所有的服务都在同一个数据库实例中,可以将其通过**功能划分**拆分为 OrderDb、ProductDb等水平拆分 数据量过大,同一个类型的数据库拆分为多个表 OrderDb_01、OrderDb_02。
2023-10-08 11:06:27
33
原创 Caffeine 和 Redis 整合二级缓存
/ 在缓存中实际执行查找的操作,父类的get()方法会调用这个方法// 通过key获取缓存值,如果没有找到,会调用valueLoader的call()方法// 将数据放入缓存中// 删除缓存// 清空缓存中所有数据// 获取缓存名称,一般在CacheManager创建时指定// 获取实际使用的缓存。
2023-10-08 11:04:11
328
原创 数据结构以及底层
跳表的本质可以进行**二分查找的有序链表**跳表底层有一个原始链表,原始链表中包含所有的元素,这是一个有序链表除了最底层的原始链表以外,还有许多索引链表,在跳表结构中,第一层索引链表的元素是原始链表的一半,第二层索引链表的元素是第一层索引链表元素的一半,以此类推。
2023-10-08 11:02:47
27
原创 缓存存在的问题
多个热点Key同时过期,导致同时去访问数据库,大量请求导致数据库崩溃系统刚刚启动,此时Redis中没有任何缓存,导致大量请求直接打到数据库。
2023-10-08 11:02:14
28
原创 RDB和AOF
RDB持久化是记录当前时间节点内的Redis**快照信息**,可以根据快照信息可以用于Redis的**恢复**,主从模式的**第一次同步**主进程会**fork**出一个子进程,子进程进行RDB文件的生成,当主进程正在进行读操作时,则会与子进程一起读取公共内存中的内容。当主进程正在进行写操作时,则会将内容拷贝一份进行操作,不影响子进程的RDB操作。子进程完成新的RDB文件写入完成后,删除原有的RDB文件在Redis**执行命令后**,都会将操作记录到**AOF缓冲区**中,然后再**write**写到。
2023-10-08 11:01:38
27
原创 Redis内存管理
为什么要设定过期时间内存是有限的,如果所有的对象都不设定过期时间,则很快Redis的内存就会不足。在某些业务场景下需要使用到过期时间,例如验证码有效期等操作Redis如何判断是否到达有效期Redis中维护了过期字典,存储在redisDb这个结构中。过期字典的Key指向了redis的keyvalue指向了该key所对应的过期时间,是毫秒级的时间戳过期数据的删除策略惰性删除仅在用户查询时进行判断key所对应的过期时间是否达到,如果已经达到过期时间则返回空定期删除在
2023-10-08 11:01:03
27
原创 Sentinel和Cluster
的数据,在数据量较大的情况下进行数据的存储是不够的。因此需要Cluster支持节点的。提供了故障转移和读写分离的能力,提高了Redis的。时,只有主库处理写操作的能力不足。**slot插槽****迁移的过程中****ASK重定向**
2023-10-08 11:00:31
28
原创 布隆过滤器
*布隆过滤器**,用于快速的判断一个元素是否存在集合中,因为布隆过滤器的底层采用**bit数组**,因此布隆过滤器**占用空间较小**。
2023-10-08 10:59:58
36
原创 大Key和热Key
含有较大数据或含有较多成员的Key被称为大KeyString 大于5MB (数据过大)List 成员20000 (数据过多)Zset 成员10000 (数据过多)Hash 成员1000但总容量 1000MB (数据过大)
2023-10-08 10:59:04
134
1
原创 ReentrantLock
来清除中断标记,否则在自旋获取锁的过程中,如果该线程在 tryAcquire()中。每一个条件变量对应着一个ConditionObject,内部维护着一个双向队列。**自旋+CAS****真正的首节点**挂起时,会因为该线程。**持有锁的线程****锁的重入次数****cpu时间片****被唤醒的元素**
2023-10-07 21:44:44
28
1
原创 Wait、Notify和Park、Unpark
Wait、Notify需要在同步代码块中,获取到对象锁才能够进行调用调用Notify后,需要执行完后续的代码,从同步代码块中出去才会释放锁notify不能指定唤醒某一个线程wait需要被try catch包围,来保证被唤醒时能够正常执行notify必须在wait之后,如果先进行notify后进行wait,会无效Park和Unpark不需要在同步代码块中,可以不需要获取对象锁也可以进行 LockSupport.park()调用当调用unpark后,指定的线程会直接唤醒unpark可
2023-10-07 21:44:08
40
1
原创 AQS同步器
AbstractQueuedSynchronizer是用于构建同步锁的框架,其中维护了一个,和一个**FIFO**队列**CLH**,AQS为**state**提供了**CAS**操作的方法。保证了变量**state**在多线程环境下的**可见性**,在时为没有线程占有锁,当某个线程使用CAS操作将state改为1后,则说明该线程抢占到了锁。此时其他没有抢占到锁的线程则需要进入到CLH队列中**等待**,并且这些线程会被操作挂起,当占有锁的线程释放锁资源后,会唤醒队列中的线程进行争抢。
2023-10-07 21:26:13
28
1
原创 Synchronized
当线程通过Synchronized获取到锁后,可以继续调用其他的相同对象锁的Synchronized代码块可以避免死锁因为在锁的竞争和等待使用了大量park和unpark等操作,这些操作都需要系统转换到内核态进行操作,而用户态到内核态的转换是十分消耗资源的,因此Synchronized是重量级锁。
2023-10-07 21:24:34
40
1
原创 线程和进程
进程是一个程序的执行过程,当一个程序开始运行时,则会创建出一个进程,例如java程序通过main方法启动后,则会创建出一个进程。一个程序启动和关闭的过程也就是等于一个进程从创建、运行到关闭的过程。一个进程内有许多的线程,线程是轻量级的,可以通过线程来执行很多的事情,线程之间的切换比进程之间的切换耗费的资源较少。对于程序计数器、虚拟机栈、本地方法栈是线程私有的。
2023-10-07 21:24:02
27
1
原创 线程池使用
newCachedThreadPool 的线程池,队列为,只有在有线程获取任务时才能提交,最大线程数大小无限,空闲线程会在60s后销毁newSingleThreadExecutor 的线程池,任务队列是的,与的区别时,线程池如果继续执行。与newFixThreadPool(1)的区别是,fixThreadPool可以修改线程数,单线程线程池无法修改。newScheduledThreadPool 可以周期性执行任务,任务队列是延时队列 线程池的状态存储使用int 32位标识,前3位用
2023-10-07 21:23:21
70
1
原创 ThreadLocal
MDC用于在输出日志时打印对应的唯一id,在MDC中设置了REQ_ID后,logback输出日志时可以进行id的拦截从而保证在日志输出中同一个线程的id是相等的,因此可以通过id查看到一个请求链路的所有过程MDC提供了是接口,下层的logback实现类是基于ThreadLocal进行实现的,有在父子线程之间无法传递数据的问题。logger.info("开始调用服务A,进行业务处理");logger.info("业务处理完毕,可以释放空间了,避免内存泄露");
2023-10-07 21:22:29
38
1
原创 JMM内存模型和Volatile
Java定义的**并发编程操作的一组规范**,除了抽象出**主内存与线程之间的关系**以外,还规定了**从Java代码到Cpu指令转换过程**的规定。制定这些规定是为了**简化程序员在并发环境下的开发**,因为Cpu多级缓存的模型和指令重排序的优化会影响并发编程下的结果,通过制定相关的规范,程序员可以通过实现了相关规范的关键字例如(Synchronized、Volatile等)从而更方便的写出安全的程序。volatile变量在**读操作**时,会调用操作是和的结合load_acquire可以看成先。
2023-10-07 20:49:54
40
1
原创 快速修改Jar包中配置文件
项目中有许多变量会写在resources文件夹下的xml,properties等配置文件中。当需要修改这些文件时,如果在本地修改,再打包传到服务器上就很麻烦。因为配置文件不像java文件需要编译成class,所以可以在服务器上将jar包解压后直接修改,再压缩还原成jar包。解压后会生成BOOT-INF/ META-INF/ org/ 三个文件夹。2.修改BOOT-INF\classes下的配置文件。3.修改完后,返回根目录,重新压缩。以Springboot项目为例。
2022-11-18 10:56:25
2112
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人