自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(27)
  • 问答 (5)
  • 收藏
  • 关注

原创 Redis数据结构(读书笔记,持续更新)

C 字符串SDS获取字符串长度的复杂度O(N)获取字符串长度的复杂度O(1)API不安全,可能会造成缓冲区溢出API安全,不会造成缓冲区溢出修改N次字符串长度必须执行N次内存重分配修改N次字符串长度最多执行N次内存重分配只能保存文本数据可以保存文本或者二进制数据。

2023-03-20 16:55:52 144

转载 Redis热点数据问题怎么解决

监控 Redis 单个分片的 QPS,发现 QPS 倾斜到一定程度的节点进行 monitor,获取热点 key, Redis 提供了 monitor 命令,可以统计出一段时间内的某 Redis 节点上的所有命令,分析热点 key,在高并发条件下,会存在内存暴涨和 Redis 性能的隐患,所以此种方法适合在短时间内使用;如果当前 key 的类型是一个二级数据结构,例如哈希类型。根据业务,人肉统计 or 系统统计可能会成为热点的数据,如,促销活动商品,热门话题,节假日话题,纪念日活动等。

2022-12-15 11:13:10 1214

原创 ThreadLocal的实现与内存泄漏问题

ThreadLocal本身并不存储数据,每一个Thread的内部都维护着一个ThreadLocalMap,数据存储在这个ThreadLocalMap中。它的作用是操作维护这个ThreadLocalMap。

2022-12-14 10:29:19 183

原创 SpringBoot自动配置原理(源码)

Spring解析启动类上的所有嵌套的@Import注解,其中就有@EnableAutoConfiguration注解中的@Import(AutoConfigurationImportSelector.class),AutoConfigurationImportSelector类会获取META-INF/spring.factories中(从缓存中)以org.springframework.boot.autoconfigure.EnableAutoConfiguration为key的所有自动配置类,将这些自动配

2022-12-13 15:24:32 207

原创 Java多线程之volatile保证可见性原理

底层在给volatile变量赋值时,会发送一个lock指令,这个指令会锁住特定的内存地址,并将线程中该变量缓存行的数据立即写回主存,并触发总线嗅探机制。读取和修改都会经过总线,总线嗅探机制会嗅探总线上共享变量的改变,如果CPU发现自己线程中缓存的该共享变量被修改了,会将该缓存行置为无效状态,然后从主存中再次加载该共享变量的值。

2022-12-12 17:19:34 930 3

原创 Java多线程之volatile

在Java多线程内存模型中,线程对某个主存中的变量进行修改时,对另一个也用到这个变量的线程来说是不可见的。但需要注意的是,volatile只能保证用到volatile变量代码前后的有序性,不保证再往后的代码(比如println之后的)。下面的代码,我们预想的结果应该是4000,但执行结果是无法预测的。对一个 volatile 变量的写操作 Happens-Before 于对这个 volatile 变量的读操作。解决办法:1. 加锁;交换执行顺序,是不会影响线程1的执行结果的,线程2也一样。

2022-12-12 14:17:37 340

原创 Java多线程之内存模型(JMM)

开始CPU是直接和主存进行交互的,但这样会有一个很大的问题,CPU的计算速度非常快,而主存是硬盘操作,比起CPU会慢很多很多,有时候CPU需要等待主存,导致效率很低。Java多线程内存模型是基于Cpu缓存模型建立的,它的作用是屏蔽掉不同硬件和操作系统的内存访问差异,实现各种平台具有一致的并发效果。线程从主内存中读取一个变量到自己的工作内存,线程结束时再把这个变量写回主内存中,是需要经过以下8个操作。这些操作需要按顺序执行,可以不连续执行,比如read和load之间可以夹杂其他操作。

2022-12-10 11:43:17 1050

原创 Java设计模式之访问者模式

这是一个比较复杂且初理解比较困难的模式,先举个例子,帮助理解这个模式。例子: 无人机群表演的例子,想让无人机群组合成不同的形状,不需要换一批无人机,我们只需要改变无人机群的代码就可以了,不用改变无人机的硬件(高度器和方向器),输入不同的代码,无人机就可以做不同的动作。定义: 封装一些作用于某种数据结构(无人机硬件)的各元素(高度器)的操作(高低),它可以在不改变数据结构的前提下定义作用于这些元素的新的操作(代码)。这个例子中,【数据结构】:无人机或无人机硬件;【各元素】:高度器和方向器;【操作】:飞多高或者

2022-12-09 12:18:37 124

原创 Java设计模式之建造者(生成器)模式

使用建造者模式,相当于有个机器帮你拼,机器人各个部位的拼法内部已经写好了,你只需要点击拼手臂,机器就把手臂拼好了,使用者不需要知道内部到底怎么拼的。建造者模式和模板方法模式长的很像,其中同样的构建过程可以创建不同的表示,用到了模板方法模式的思想,因为拼大黄蜂或者擎天柱,构建过程是一样的,都是拼胳膊、拼脑袋等等。:环境类,建造者的使用者。将一个对象复杂的构造过程,拆分成若干个的简单过程,让其使用者可以轻松的完成对这个对象的构建。:机器人抽象建造者,将机器人复杂的组装过程分解,并将机器人的构建与具体表示分离。

2022-12-08 15:14:28 221

原创 Java设计模式之享元模式

是池化技术的重要实现,主要用于创建大量相似对象时,减少对象的创建,减少内存占用和资源的重复利用,提高性能。这些对象有些公共特征,如需要大量创建、生命周期短用完即弃、对象之间存在部分相同数据,这个时候就可以考虑使用享元模式。举个例子,最近有本书火了,很多人都想看,于是就花钱买了(new对象),但看完学到知识后这本书就没用了,会被垫桌脚或丢弃(gc垃圾回收),这样就导致金钱和资源的浪费。如果图书馆有这本书,大家轮流去借这本书看,看完再还回去,这就提高了资源的重复利用,并且也不会造成金钱的消耗(new对象造成的性

2022-12-07 16:10:12 218

原创 Java设计模式之模板方法模式

将一个算法中的特定步骤延迟到子类中,使得不改变算法结构的情况下自定义步骤内容。比如做法的步骤为放油、放菜、放盐、装盘,这些步骤可以自己DIY,但顺序不能乱,必须是先放油再放菜。也就是父类把做法的步骤顺序框架定好了,子类只需要在这个框架中将步骤实现就可以了。模板方法模式非常简单,就是使用了Java的继承机制:模板抽象类,其中放油、放菜等步骤需要子类实现,doCookie方法为算法的结构,需要用final修改,不允许更改。四、优缺点优点:缺点:

2022-12-07 13:23:16 99

原创 Java设计模式之责任链模式

这个模式使得每一个请求处理者都有机会处理请求。将这些处理者连成一条链,请求再这条链上传递,直到有处理者处理它为止。这样说还是有点抽象。举个例子,请假制度,3天内的假,项目经理就可以批;请假3到7天,需要部门主管批;请假半个月,需要老板批。请假条就在这条链上传递,直到可以批的处理者。:处理者的抽象类。具体的处理者只需要实现处理逻辑的代码。根据请假的天数判断是处理还是给下一个处理者。执行结果:双亲委派模型: 利用责任链模式的思想,将一个类的加载先交给父类加载,父类加载不了自己再加载。SpringMvc拦截器链

2022-12-07 12:36:00 130

原创 Java设计模式之策略模式

定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。策略模式是一种行为型模式,将类的行为独立出来,用于if…else if 比较多的场景,避免传统if判断导致的维护性变差的情况。以线程池拒绝策略为例子,线程池如果阻塞队列满了,需要拒绝一些任务,以拒绝任务为目的,制定一组策略,每个策略以不同的方式拒绝任务。在用的时候可以从中任意选择一个,增删扩展也不会影响到线程池本身。例子:商品价格打折策略,双十一全部7折,店庆全部5折,晚间打9折。:上下文/环境类,可以理解成应用策略的地方,比如店家的收银电

2022-12-06 16:29:49 179

原创 Java设计模式之状态模式

定义: 当一个对象内在状态改变时允许其改变行为,这个对象看起来像改变了其类。在这个模式中,一个类的行为是根据状态改变而改变的。比如下午做什么是根据心情状态改变的,心情好出去玩,心情不好就宅家,同样是做什么,心情状态不同,干的事情就不一样。而且它可以内部的切换状态,比如心情不好下午宅家,宅到一半彩票中了五万,心情状态变好了,然后就出去Happy了。这也是和策略模式的不同之一,策略模式的行为一旦确定就不能改变了。下面就以工单流转的例子细说。运行结果:我们可以发现除了初始化时赋值了具体流程,在之后的工单流转中

2022-12-06 14:14:42 710

原创 Java设计模式之外观模式

将一组复杂的接口调用封装,提供一个简单的外观接口,对于调用者来讲只需要简单的调用这个接口就可以了,复杂的操作都隐藏起来。例如,我们下班回家时只要打开门或说一个命令,就可以自动的打开灯、打开电视等等…四、和适配器比较意图不同。外观模式的意图是简化接口,而适配器的意图是将接口转换成不同的接口优点:缺点:

2022-12-06 13:07:50 153

原创 Java设计模式之适配器模式

定义: 将一个类的接口变成另一个类所期待的另一个接口,从而使因接口不匹配而无法一起工作的两个类能够一起工作。举个例子,苹果手机想用type-c的充电器充电,但充电的口不吻合,所以就需要一个转接头,使type-c能给苹果手机充电。这就是适配器。SpringMvc中因为handler有三种实现方式(implements Controller、implements HttpRequestHandler、@RequestMapping),要执行这三种handler的话,需要对应适配器才行。这就是接口适配器模式的实际

2022-12-06 10:02:55 223

原创 Java设计模式之装饰器模式

在类原有功能的基础上扩展功能。比如字节流转字符流,字符流就相当于是装饰器,在字节流原有的基础之上扩展功能。四、与代理模式的区别(似我非我,本质不同)代理模式: 相当于外卖小哥代客户买肯德基,但外卖小哥并不是客户,只是委托另一个角色去完成你不想干的事。从代码中举例,Spring事务控制,代理模式把开启、关闭、提交、回滚等非业务操作交给代理类去做,但这个代理类不能当成真正的业务类,真正吃肯德基的核心业务还是要被代理类本身来做。装饰器模式: 相当于外卖小哥给自己点了份肯德基,他本身就是客户,做跑腿的事,也做吃

2022-12-05 15:55:30 99

原创 Java设计模式之三大工厂模式

一个实例的创建细节由工厂类决定,使用者只需要给工厂说我要什么东西就可以了。简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。我们需要创建一个安卓手机工厂,根据传入的品牌名,返回对应的安卓手机。三、优缺点优点:== 缺点:==在简单模式中,生产的都是同一个大类下的实例,这就导致能生产的实例的类型有限。已有生产安卓手机的工厂,如果还想生产苹果手机,再加一个工厂要比修改安卓手机工厂要好很多。所以工厂方法模式的本质就是多个工厂,每个工厂生产对应

2022-12-05 12:23:50 115

原创 Java设计模式之单例模式

确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

2022-12-02 13:39:56 88

原创 Java设计模式之观察者模式

在这个模式中,有观察者和被观察者两个角色,当被观察者的状态发生改变时,要让所以观察它的观察者知道这个改变。举个例子,Redis的某个key过期了,需要通知一些对象这个key过期了,需要做一些业务操作。其中redis就是被观察者,一些对象就是观察redis的key过期的观察者。

2022-12-02 09:58:20 543

原创 线程池中的线程是如何保活和回收的

线程池根据阻塞队列的阻塞原理进行线程保活。线程池根据阻塞队列的两种不同的阻塞方式进行回收。如果是非核心线程,如果阻塞时间到了,则退出消失。如果线程因异常情况要消失,会在线程池中补一个线程。

2022-11-29 13:57:51 1925

原创 Spring源码之处理配置类的ConfigurationClassPostProcessor

在Spring容器创建过程中,BeanFactoryPostProcessor可以动态的修改容器的内容。比如PropertyPlaceholderConfigurer可以修改bean定义的占位符。ConfigurationClassPostProcessor是BeanFactoryPostProcessor的实现子类,它负责处理所有被@Configuration标注的类。自定义一个配置类MyConfiguration,在文章中,我们会以加载SpringBoot主入口类(也是配置类)的视角解析加载过程。

2022-11-18 14:47:21 270

原创 Spring源码之BeanFactoryPostProcessor

Spring的重要扩展点,增强beanFactory的功能;可以在加载解析BeanDefinition之后,可以对BeanDefinition进行修改;可以新增一些特殊的BeanPostProcessor,比如新增带有beanFactory的BeanPostProcessor;BeanFactoryPostProcessor的子接口,用于解析注册BeanDefinition,所以它是先于BeanFactoryPostProcessor执行。实现类中很重要。

2022-11-15 13:02:25 223

原创 Spring源码之解析SpringBean的生命周期

【实例化 - doCreateBean前】执行InstantiationAwareBeanPostProcessors的前置处理器,判断是否有已经指定创建好的对象。【实例化 - createBeanInstance】选择实例化的方式,如回调函数、工厂方法、指定构造器等等。【实例化 - createBeanInstance】无特别处理使用默认无参构造实例化(instantiateBean)。【实例化 - createBeanInstance后】利用MergedBeanDefinitionPostProc

2022-11-09 18:00:54 362

原创 SpringBoot源码之BeanDefinitionReader解析与自定义

自定义背景:需要用txt文件作为Bean的配置文件,创建一个TxtBeanDefinitionReader继承AbstractBeanDefinitionReader,并实现父类抽象方法。

2022-11-08 20:59:39 495 3

原创 Spring源码之基于@ComponentScan生成BeanDefinition

注解中的提供的扫描路径加载Bean,扫描的核心方法是doScan()。本文用到的是Spring5.2.4版本的源码。

2022-11-08 14:19:32 401

原创 SpringBean循环依赖及解决办法

循环依赖的构成,是因为多个对象间的互相依赖造成的。解决办法:提前暴露实例化后的bean。用三级缓存的原因是,防止多次getSingleton导致多次创建代理对象。

2022-11-07 15:54:37 534

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除