这个用户很懒,还没有个人简介
私信
主帖 19
回帖
视频
提问
回答
资源
专栏
SimpleNestedLoopJoin我们来看一下当进行join操作时,mysql是如何工作的。常见的join方式有哪些?如图,当我们进行连接操作时,左边的表是「驱动表」,右边的表是「被驱动表」SimpleNestedLoopJoin这种连接操作是从驱动表中取出一条记录然后逐条匹配被驱动表的记录,如果条件匹配则将结果返回。然后接着取驱动表的下一条记录进行匹配,直到驱动表的数据全都匹配完毕「因为每次从驱动表取数据比较耗时,所以MySQL并没有采用这种...
2022-06-06 17:37:09 204浏览 0点赞 0回复 0收藏
不用Spring管理事务?如果对AOP的实现不太熟悉的话可以看我之前的文章,或者到我网站www.javashitang.com上查看系列文章2w字搞懂SpringAOP的前世今生让我们先来看一下不用spring管理事务时,各种框架是如何管理事务的使用JDBC来管理事务使用Hibernate来管理事务业务逻辑和事务代码是耦合到一块的,并且和框架的具体api绑定了。当我们换一种框架来实现时,里面对事务控制的代码就要推倒重写,并不一定能保证替换后的api和之前的a...
2022-06-06 17:36:53 220浏览 0点赞 0回复 0收藏
BeanFactoryTransactionAttributeSourceAdvisor对应的Advice的实现类为TransactionInterceptor,即针对事务增强的逻辑都在这个类中。筛选的逻辑我们就先不分析了,后面会再简单提一下我们来看针对事务增强的逻辑,当执行被Transactional标记的方法时,会调用到如下方法(TransactionInterceptorinvoke有点类似我们的Around)TransactionInterceptorinvokeTransactionAspectSupportinvokeWithinTransaction我挑出这个方法比较重...
2022-06-06 17:36:42 203浏览 0点赞 0回复 0收藏
消息丢失如何排查?当我们在使用mq的时候,经常会遇到消息消费异常的问题,原因有很多种,比如producer发送失败consumer消费异常consumer根本就没收到消息「那么我们该如何排查了」其实借助RocketMQDashboard就能高效的排查,里面有很多你想象不到的功能首先我们先查找期望消费的消息,查找的方式有很多种,根据消息id,时间等「消息没找到?」说明proder发送异常,也有可能是消息过期了,因为rocketmq的消息默认保存72h,此时...
2022-06-06 17:36:29 192浏览 0点赞 0回复 0收藏
从上帝视角看一下消息发送和消费当我们使用RocketMQ时,RocketMQDashboard是一个非常好用的图形化界面工具我们首先在RocketMQDashboard上创建一个topic,每个topic下4个队列每个topic是一类消息的集合,topic下面再细分queue是为了提高消息消费的并发度「当producer发送topic消息时,应该往topic下的哪个queue来发送呢?」producer会采用轮询的策略发送「那么consumer应该消费哪个queue下的消息呢?」当有一个消费者时当然是消...
2022-06-06 17:35:58 296浏览 0点赞 0回复 0收藏
手写一个异步工具类我是小识,新来了一个公司。这个公司呢,有个特点,就是很鼓励大家封装各种实用的工具类,提高开发效率。于是我就到处看项目的源码,看看有没有什么能改进的?果然让我发现了。项目中到处充斥着newThread类来异步执行代码的逻辑newThread(r).start();我们可以封装一个异步工具类啊第一版说干就干,把上面的代码简单封装一下,一个简单的异步工具类就封装好了publicinterfaceExecutor{voidexecute(Runnabler);...
2022-06-06 17:35:50 232浏览 0点赞 0回复 0收藏
底层存储当其他人问你Redis是如何用单线程来实现每秒10w+的QPS,你会如何回答呢?使用IO多路复用非CPU密集型任务纯内存操作巧妙的数据结构我们今天就来盘盘Redis数据结构到底有多巧妙!「Redis所有的数据结构都是在内存占用和执行效率之间找一个比较好的均衡点,不一味的节省内存,也不一味的提高执行效率」Redis底层就是一个大map,key是字符串,value可能是字符串,哈希,列表等。如何记录这个value的类型呢?我们定义一个类...
2022-06-06 17:29:09 546浏览 0点赞 0回复 0收藏
list3.0版本及以前在redis3.0版本及以前,采用压缩链表(ziplist)以及双向链表(linkedlist)作为list的底层实现。当元素少时用ziplist,当元素多时用linkedlist「linkedlist比较好理解,我们来看一下什么是ziplist?」ziplist并不是一个用结构体定义的数据结构,而是一块连续的内存,在这块内存中按照一定的格式存储值下图是压缩列表的示意图zlbytes的值为0x50(十进制80),表示压缩列表的总长度为80字节zltail的值为0x3c(...
2022-06-06 17:28:39 448浏览 0点赞 0回复 0收藏
RPC框架的实现又到年初了,大家又要开始准备面试了。为了方便大家,我就写几篇面试相关的文章吧,这次是Dubbo相信很多小伙伴已经看了很多Dubbo的八股文了。比如,Dubbo支持哪些序列化框架,支持哪些注册中心,支持哪些集群容错策略,支持服务降级吗?但是你知道Dubbo服务导出和服务引入的过程吗?服务降级是如何实现的?等等本文就从源码的角度来分享一下Dubbo的整个调用过程(放心,图示为主,辅助一少部分源码)「RPC框架的实...
2022-06-02 16:39:35 219浏览 0点赞 0回复 0收藏
Dubbo服务导出「当第三方框架想和Spring整合时,有哪些方式?」实现BeanFactoryPostProcessor接口(对BeanFactory进行扩展)实现BeanPostProcessor接口(对Bean的生成过程进行扩展)Dubbo也不例外,当Dubbo和Spring整合时,会往容器中注入2个BeanPostProcessor,作用如下ServiceAnnotationBeanPostProcessor,将Service注解的类封装成ServiceBean注入容器ReferenceAnnotationBeanPostProcessor,将Reference注解的接口封装成Ref...
2022-06-02 16:39:29 189浏览 0点赞 0回复 0收藏
什么是循环依赖?先说一下什么是循环依赖,Spring在初始化A的时候需要注入B,而初始化B的时候需要注入A,在Spring启动后这2个Bean都要被初始化完成Spring的循环依赖有4种场景构造器的循环依赖(singleton,prototype)属性的循环依赖(singleton,prototype)「spring目前只支持singleton类型的属性循环依赖」构造器的循环依赖ComponentpublicclassConstructorA{privateConstructorBconstructorB;AutowiredpublicConstructorA(C...
2022-06-02 16:39:22 315浏览 0点赞 0回复 0收藏
我还是把上面的例子改进一下,改成用3级缓存的实现publicinterfaceObjectFactory<T>{TgetObject();}publicclassDependencyDemoV3{privatestaticfinalMap<String,Object>singletonObjectsnewHashMap<>(256);privatestaticfinalMap<String,Object>earlySingletonObjectsnewHashMap<>(256);privatestaticfinalMap<String,ObjectFactory<>>singletonFactoriesnewHashMap<>(256);SneakyThrowspublicstatic<T>TgetBean(Class<T>beanCl...
2022-06-02 16:39:15 219浏览 0点赞 0回复 0收藏
缓存是在哪起作用的?个人认为mybatis一级缓存和二级缓存并不是一个很好的设计,工作中我基本上也不会使用一级缓存和二级缓存,因为一旦使用不当会造成很多问题,所以我们今天就来看看到底会有什么问题?上一节我们介绍了Executor会调用StatementHandler执行sql,起一个承上启下的作用。Executor的设计是一个典型的装饰者模式,SimpleExecutor,ReuseExecutor是具体实现类,而CachingExecutor是装饰器类。可以看到具体组件实现...
2022-06-02 16:39:09 291浏览 0点赞 0回复 0收藏
「实验3」开启两个SqlSession,在sqlSession1中查询数据,使一级缓存生效,在sqlSession2中更新数据库,验证一级缓存只在数据库会话内部共享。输出如下sqlSession1和sqlSession2读的时相同的数据,但是都查询了数据库,说明了「一级缓存只在数据库会话层面共享」sqlSession2更新了id为1的学生的姓名,从凯伦改为了小岑,但sqlSession1之后的查询中,id为1的学生的名字还是凯伦,出现了脏数据,也证明了之前的设想,一级缓存只在...
2022-06-02 16:39:04 553浏览 0点赞 0回复 0收藏
测试二级缓存二级缓存是基于namespace实现的,即一个mapper映射文件用一个缓存在本实验中,id为1的学生名称初始化为点点。「实验1」测试二级缓存效果,不提交事务,sqlSession1查询完数据后,sqlSession2相同的查询是否会从缓存中获取数据。执行结果:我们可以看到,当sqlsession没有调用commit()方法时,二级缓存并没有起到作用。「实验2」测试二级缓存效果,当提交事务时,sqlSession1查询完数据后,sqlSession2相同的查询是...
2022-06-02 16:38:58 350浏览 0点赞 0回复 0收藏
SpringAOP概述最近看seata源码的时候,随处可见springaop的api,于是一边看seata,一边又把springaop总结了一下我们在使用Spring框架的时候,经常需要和Spring的2大特性,IOC和AOP打交道,之前写了一篇《2w字搞懂SpringBean的一生》从源码层面分析了IOC的执行流程,本篇文章就接着分享一下AOP的底层实现,比较基础的内容本篇文章就不多做介绍了,主要侧重于底层api的设计理念「AOP这种设计理念常见的概念如下」「AOP的主要应用...
2022-06-02 16:38:45 270浏览 0点赞 0回复 0收藏
Advisor前面我们说过在AOP设计理念中,我们用Aspect来声明切面,每个Aspect可以包含多个Pointcut和Advice。「在SpringAOP一代中,Aspect对应的实现为Advisor」。即Advisor是Pointcut和Advice的容器,但是一个Advisor只能包含一个Pointcut和Advice因为Advice的实现方式有两类,因此对应的Advisor也可以分为两类织入「在Spring中将Advice织入到Jointpoint的过程是通过动态代理来实现的」。当然织入的方式有很多种,不仅仅只有动态...
2022-06-02 16:38:38 349浏览 0点赞 0回复 0收藏
SpringAOP自动动态代理的实现方式如果让你实现对象的自动代理,你会怎么做呢?当然是通过BeanPostProcessor来干预Bean的声明周期,聪明!Spring就是这么干的,来验证一下我们的想法看这个类的继承关系,基本上就验证了我们的想法了。我们只要看看他重写了BeanPostProcessor的哪些方法即可?「AbstractAutoProxyCreator重写了如下2个重要的方法」postProcessBeforeInstantiation(Bean实例化前阶段执行)postProcessAfterInitial...
2022-06-02 16:38:32 206浏览 0点赞 0回复 0收藏
EnableAspectJAutoProxy有啥用?「当我们想使用2.0版本的aop时,必须在配置类上加上EnableAspectJAutoProxy注解,那么这个注解有啥作用呢?」Target(ElementType.TYPE)Retention(RetentionPolicy.RUNTIME)DocumentedImport(AspectJAutoProxyRegistrar.class)publicinterfaceEnableAspectJAutoProxy{booleanproxyTargetClass()defaultfalse;booleanexposeProxy()defaultfalse;}可以看到很重要的一句Import(AspectJAutoProxyRegis...
2022-06-02 16:38:22 267浏览 0点赞 0回复 0收藏