- 博客(340)
- 收藏
- 关注
原创 redis 非阻塞的IO多路复用机制
IO 多路复用一个服务端进程可以同时处理多个套接字描述符多路:多个客户端连接(连接就是套接字描述符)复用:使用单进程就能够实现同时处理多个客户端的连接其他方式是通过增加进程和线程的数量来并发处理多个套接字,免不了上下文切换的开销,而 IO 多路复用只需要一个进程就能够处理多个套接字,从而解决了上下文切换的问题。其发展可以分 select->poll→epoll 三个阶段来描述。select 就是轮询,在 Linux 上限制个数一般为 1024 个poll 解决了 select 的个数
2022-05-12 11:39:19
2294
1
原创 MySQL explain详解
是什么使用explain可以模拟优化器执行SQL查询语句,从而知道MySQL怎么处理你的SQL语句的,分析你的查询语句和表结构的性能瓶颈。可以做什么读取表的顺序哪些索引能够被使用数据读取操作的操作类型哪些索引能够被实际使用表之间的引用每张表有多少行被物理查询怎么用在你书写的SQL语句加一个单词 - explain,然后将 explain + SQL执行后会出现一个表,这个表会告诉你MySQL优化器是怎样执行你的SQL的explain各个字段代表的意思id :select查询的序列号,
2022-05-11 16:48:51
171
原创 mysql update执行过程
select执行过程执行语句前要先连接数据库,这是连接器的工作。前面我们说过,在一个表上有更新的时候,跟这个表有关的查询缓存会失效,所以这条语句就会把表 T 上所有缓存结果都清空。这也就是我们一般不建议使用查询缓存的原因。接下来,分析器会通过词法和语法解析知道这是一条更新语句。优化器决定要使用 ID 这个索引。然后,执行器负责具体执行,找到这一行,然后更新与查询流程不一样的是,更新流程还涉及两个重要的日志模块:redo log(重做日志)和 binlog(归档日志)。redo log(重做日志)
2022-05-11 11:34:15
526
原创 锁之自旋锁
定义当一个线程尝试去获取某一把锁的时候,如果这个锁此时已经被别人获取(占用),那么此线程就无法获取到这把锁,该线程将会等待,间隔一段时间后会再次尝试获取。这种采用循环加锁 -> 等待的机制被称为自旋锁(spinlock)原理自旋锁的原理比较简单,如果持有锁的线程能在短时间内释放锁资源,那么那些等待竞争锁的线程就不需要做内核态和用户态之间的切换进入阻塞状态,它们只需要等一等(自旋),等到持有锁的线程释放锁之后即可获取,这样就避免了用户进程和内核切换的消耗。因为自旋锁避免了操作系统进程调度和线程切
2022-05-06 20:08:04
389
原创 Comparable 接口和 Comparator 接口
Comparable接口Comparable是一个排序接口。若一个类实现了Comparable接口,即代表该类实现了compareTo方法,该方法规定了该类的对象的比较规则(两个对象如何比较“大小”)。Comparator接口Comparator是比较器接口。若我们只需要控制某些对象的次序,而类本身并不支持排序(即没有实现Comparable接口),对于这种情况,我们可以通过建立一个比较器(即关于该类的一个Comparator接口实现类)来进行排序。比较器需实现方法compare(T o1, T o
2022-04-27 17:31:44
173
原创 Ribbon负载均衡算法
内置负载均衡规则类规则描述RoundRobinRule轮询。它是Ribbon默认的负载均衡规则。AvailabilityFilteringRule对以下两种服务器进行忽略:(1)在默认情况下,这台服务器如果3次连接失败,这台服务器就会被设置为“短路”状态。短路状态将持续30秒,如果再次连接失败,短路的持续时间就会几何级地增加。可以通过修改配置loadbalancer..connectionFailureCountThreshold来修改连接失败多少次之后被设置为短路状态。默认是...
2022-04-27 10:02:12
323
原创 jvm内存溢出
内存溢出和内存泄漏区别内存溢出Out Of Memory是指程序在申请内存时,没有足够的内存空间供其使用,出现Out Of Memory内存泄漏Memory Leak是指程序在申请内存后,由于某种原因无法释放已申请的内存空间,导致这块内存无法再次被利用,造成系统内存的浪费memory leak会最终会导致out of memory。内存溢出分类栈内存溢出(StackOverflowError)程序所要求的栈深度过大导致,可以写一个死递归程序触发。如何解决一般是程序问题,最大可能是递归
2022-04-27 00:24:42
445
原创 内存溢出场景
内存溢出原因内存中加载的数据量过大。如一次性从数据库中读大量数据集合类中有对对象类的引用,使用完后未清空,使得JVM不能回收代码有死循环或者循环产生过多对象实体使用的第三方软件的bug启动参数内存值设置过小内存溢出如何避免static静态对象和变量不要滥用及时关闭各种连接和流,如文件流,sftp连接...
2022-04-26 23:47:04
205
原创 ReentrantReadWriteLock
ReentrantReadWriteLock是混合式锁,当有读锁被其它线程持有期间,写锁线程只能堵塞等待前面所有的读锁释放,写锁堵塞之后进来的读锁只能排队到写锁线程后面,当读锁释放完毕后写锁获取成功,写锁释放完毕后,排在写锁后面的读锁可以同时获取到读锁。...
2022-04-25 12:46:03
96
原创 两个java微服务之间通过MultipartFile传输文件
报错:feign.codec.EncodeException: Content-Type “multipart/form-data” not set for request body of type StandardMultipartFile解决:在需要调用远程文件服务的服务A的接口@PostMapping注解中添加consumes = “multipart/form-data”...
2022-04-25 10:46:56
1512
2
原创 java的unsafe
概念Java和C++语言的一个重要区别就是Java中我们无法直接操作一块内存区域,不能像C++中那样可以自己申请内存和释放内存。Java中的Unsafe类为我们提供了类似C++手动管理内存的能力。Unsafe类,全限定名是sun.misc.Unsafe,从名字中我们可以看出来这个类对普通程序员来说是“危险”的,一般应用开发者不会用到这个类。Unsafe类是"final"的,不允许继承。且构造函数是private的,因此我们无法在外部对Unsafe进行实例化。获取UnsafeUnsafe无法实例化,
2022-04-24 21:01:13
1137
原创 @Transactional失效问题
最近开发的时候,遇到一个 @Transactional注解失效的问题。场景是:方法A和方法B都在同一个类里,方法A没有 @Transactional注解,方法B有 @Transactional注解,A方法调用B方法,结果事务一直没生效,debug日志说是事务没有被spring管理。后面研究好久发现了原因:这是由于Spring AOP代理的原因造成的,因为只有当 @Transactional 注解的方法在类以外被调用的时候,Spring 事务管理才生效。 解决办法就是避免同一类中自调用或者使用 Aspect
2022-03-26 13:22:14
503
原创 贷款还款方式总结
利随本清一次性还本付息。先息后本到期一次还本,按一定周期还息。(利息正常还,本金最后一期一次付清)等额本息每期还款金额一样(第一期和最后一期可能不一样)标准等额本息:P:贷款本金R:月利率N:还款期数等额本金每期还本金额相等,利息按标准天数计息规则计算等本还款法公式:月还款额=月还本金+月还利息月还本金=贷款本金/贷款期数月还利息=剩余本金*贷款月利率随借随还...
2021-11-17 21:11:01
316
原创 Java锁
synchronized在 JDK 1.6 之前,synchronized 是重量级锁,效率低下。从 JDK 1.6 开始,synchronized 做了很多优化,如偏向锁、轻量级锁、自旋锁、适应性自旋锁、锁消除、锁粗化等技术来减少锁操作的开销。synchronized 同步锁一共包含四种状态:无锁、偏向锁、轻量级锁、重量级锁,它会随着竞争情况逐渐升级。synchronized 同步锁可以升级但是不可以降级,目的是为了提高获取锁和释放锁的效率。synchronized 的底层原理synchroni
2021-06-03 21:03:06
108
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人