- 博客(24)
- 收藏
- 关注
原创 阅读redis源码——String
redis中最常用的五种数据类型:String、List、Hash、Set、Sorted Set这是一个通用函数,用于实现SETSETEXPSETEXSETNX和GETSET等命令。'flags':区分不同的行为(如NXXXGET等)。'expire':表示以用户传递的 Redis 对象形式设置的过期时间,'unit' 进为时间单位如果设置了GET选项,它会先获取键的当前值,然后再设置新值。大概的流程图是这样的调整参数列表:为了确保命令再持久化或复制到从服务器能够正确执行。
2025-04-13 17:06:56
494
原创 JVM指针压缩
首先先理解一下操作系统是怎么寻址的,以32位的操作系统为例,32位(4个字节)可以表示出2^32个不同的地址,内存的基本计量单位是字节,也就是每个内存地址对应的是 8 位的存储空间,所以2^32个地址可以表示2^32字节的内存空间,也就是4GB的内存空间,所以【结论:4个字节可以表示4GB的内存空间】JVM指针压缩说的是对象头中的【klass word】部分的指针压缩,在jvm内存小于32G的时候默认会开启指针压缩,将【klass word】8字节的指针压缩为4字节的指针。(32G内存的条件下)
2025-04-12 22:29:03
127
原创 java序列化
但是网络传输的本质是基于字节流的,所以虽然序列化成了文本格式和二进制格式最后在网络间传输的时候都会被编码成字节流(例如文本格式的话可以通过UTF-8编码成字节流,二进制格式本身就是字节流,可以直接在网络上传输)字节序列是数据的基本表现形式,而二进制格式是字节序列的一种结构化表示方式,用于特定的编码规则和数据结构,所以一般二进制格式的数据量更小,这也是为什么JDK自带的序列化方法结果很大。二进制格式是一种特定的编码方式,它基于字节,但是是有结构的,用于将数据以二进制形式表示。
2025-04-12 21:02:58
512
原创 java接口和抽象类
是用了abstract的特殊的一种类抽象类不能实例化、抽象方法所在的类必须是抽象类其实抽象类和普通类的区别仅仅在于有没有abstract修饰(也就是能不能实例化,能不能没有方法的实现,其他普通类有的一些特征抽象类都有)例如抽象类已有构造函数,抽象类也可以都是普通方法(没有抽象方法)抽象类的构造方法会在子类实例化的时候被调用,进行一些必要的初始化。
2025-04-08 19:15:20
175
原创 自己写spring整合mybatis
实现了这样一个特殊的接口之后就是一个特殊的类,从spring容器中通过getBean方法取出的对象实际上不是这个类的bean对象,而是这个类的getObject方法返回的bean对象。
2025-04-07 20:32:10
411
原创 redis的网络模型
redis在核心业务处理部分是单线程,但是整个redis是多线程(这里注意像关闭文件、AOF 刷盘、释放内存是后台线程,但是像AOF重写、bgsave保存RDB数据快照是子进程。
2025-04-07 18:49:50
856
原创 synchronized
在java中每个对象主要由三部分组成:【对象头】、【对齐填充】、【实例数据】对象头由两部分组成(数组对象的话还多一个部分是数组长度):【klass Word】(32bits):用于标记这个对象属于哪个类不同的对象状态实际上Mark Word的内容也是不一样的。
2025-04-07 13:08:18
373
原创 海量数据去重(利用redis)
也被问了至少两次好像。。。首先数据量如果比较小的话——set如果数据量很大很大很大很大,set当然就不行了,因为占内存太大了。
2025-04-06 17:16:44
99
原创 redis八股(我觉得一些不是很常见的八股)
(为什么setnx不能可重入,key-value中的value存成线程标识,再获得锁的时候判断一下这个线程标识是不是自己的,如果不是自己的就获得锁失败,如果是自己的就获得成功,但是光判断是不是自己的还不够,还需要标识获得几次锁,所以string数据类型的就不够了,虽然setnx可以插入hash类型的,但是判断是不是自己的锁和获得锁需要时一个原子操作,所以光setnx就不能满足要求了)(其实redisson实现分布式锁的方式跟上面分析的基本上是一致的)(是的也是美团面试的时候问的)指令来实现锁的排他性,
2025-04-06 16:45:06
288
原创 【无标题】
sentinel实现限流、隔离、降级、熔断等功能,本质上就是两件事:1.统计数据:统计某个资源的访问数据(QPS、RT等)2.规则判断:判断限流规则等是否满足。
2025-04-06 13:26:56
396
原创 四种限流算法代码实现(sentinel实现限流的原理)
因为有的时候刚开始数据可能还没加载到缓存中或者什么的,导致开始的时候并发处理的能力较差,等到预热完成之后,就可以实现高并发的处理了,然后这个时候阈值再达到设置的那个值。(第二次面试美团的时候有问我知不知道sentinel限流的底层原理,但是当我我还没学这个只能说不知道sentinel的底层原理,只知道四种限流算法,第一次面试美团的时候问我知不知道限流算法令牌桶什么的当时还没学只能说我不太了解orz)跟漏桶相似,但是桶里面放的是令牌,以固定的速率往桶里生产令牌,获得令牌的请求才能执行,获得令牌失败的拒绝。
2025-04-06 10:49:42
803
原创 阅读spring源码(二)——refresh方法
在这一步才初始化所有的bean:this.finishBeanFactoryInitialization(beanFactory);
2025-04-05 15:37:43
64
原创 阅读spring源码(一)——spring容器的创建过程
在执行完this.register(componentClasses);之后,这个bdm中会多一个bd,也就是传入的配置类的bd。首先来看这个AnnotationConfigApplicationContext这个类。在执行完this.refresh();之后可以看到所有的类的bd都有了。一个spring容器现在就真正的初始化完成了。spring最重要的一个组件就是IOC容器。这个时候还没有三级map。
2025-04-05 14:47:07
120
原创 Spring循环依赖!我好像搞懂了!
一个bean的生命周期(AService为例):1.实例化——>创建一个普通对象2.属性注入(例如BService——>去单例池Map找——>没找到就创建BService)1.实例化BService2.属性注入AService——>去单例池找——>没找到就创建3.填充其他属性4.初始化方法5.将这个bean对象放到单例池中3.填充其他属性4.初始化方法(AOP)5.将这个bean对象放到单例池中这里的AService和BService就构成了循环依赖。
2025-04-04 20:58:19
790
原创 Spring事务生效的底层原理
Configuratinon注解的目的是给这个配置类设置一个代理对象,然后调用产生jdbc的方法和产生事务管理器的方法传入的参数(也就是datasource)都是这个代理对象生成的,这个代理对象生成datasource的方式就是先去容器中找,有就直接返回,没有就调用方法产生一个datasource然后放到容器中。但是如果在调用普通对象的test方法的时候(也就是代理类内部调用的test方法又调用了其他的加了Transcationnal注解的方法,这个注解是不会生效的。
2025-04-04 17:45:20
288
原创 手写min-Spring框架——理解bean的生命周期
Spring的核心实际上就是Spring的IOC容器创建这个IOC容器最重要的就是扫描路径,这里通过一个配置类作为创建容器的参数,将要扫描的路径传入进去。
2025-04-04 15:30:51
652
原创 java动态代理
实际上代理可以说就是实际对象的方法增强,尤其是一些与业务无关的部分或者是想隐藏目标对象,代理的所有方法都会在InvocatianHandler中的invoke中进行执行,可以在这个invoke中判断方法然后进行增强。代理的作用:本质上是将对象的一部分职责转移到代理上,也是对对象本身方法的一个增强。对象有什么方法想被代理,代理就一定要有对应的方法。代理怎么知道有哪些方法要去代理呢?对象和代理都实现这个接口。将这些方法定义在接口中。
2025-04-03 21:27:00
206
原创 java注解
MyTest(a = "张三", b = false, c = {"小猫", "小狗"})这一行实际上是一个注解的实现类对象。如果是解析成员方法上的注解,就应该先获取到该成员方法的method对象,再通过method对象解析上面的注解。比如要解析类上的注解,就应该先获取该类的class对象,再通过class对象解析上面的注解。注解:java代码中的特殊标记,作用是让其他程序根据注解信息来决定怎么执行该程序。判断类、方法、成员变量上是否存在注解,并把注解里的内容解析出来。元注解:修饰注解的注解。
2025-04-03 20:48:49
291
原创 HashMap
为什么JDK1.8之后的HashMap在链表优化使用的是红黑树不是AVL树或者B+树?HashMap的get方法一定安全吗?HashMap的容量指的是什么?
2025-04-02 09:51:29
108
原创 ConcurrentHashMap
concurrntHashMap可以存储null作为key或者value吗?concurrenthashmap在get的时候会加锁吗?那读的时候如果不加锁,读写冲突了怎么办呢?
2025-04-02 09:49:20
66
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人