- 博客(16)
- 收藏
- 关注
原创 webstorm查看代码历史记录
转载于:https://www.cnblogs.com/alvin553819/p/7127109.html。在webstorm中 文件界面右键,local History --> show History。如果想回到某一次的代码。把中间的代码按>>移入到右边即可。上面能看到具体的日期和编写的代码。
2024-09-06 10:43:13 263
原创 浅析ConcurrentHashMap
和HashMap一样,是一个存放键值对的容器。使用hash算法来获取值的地址,因此时间复杂度是O(1)。查询非常快。同时,是线程安全的HashMap。专门用于多线程环境。
2024-05-15 13:03:28 688
原创 简单工厂模式和策略模式的区别
从工厂模式的代码中可以看到 工厂模式主要是返回的接口实现类的实例化对象,最后返回的结果是接口实现类中的方法,而策略模式是在实例化策略模式的时候已经创建好了,我们可以再策略模式中随意的拼接重写方法,而工厂模式是不管方法的拼接这些的,他只关注最后的结果,不注重过程,而策略模式注重的是过程。策略模式的宗旨就是将各项方法之间连接起来,达到一个新的方法,微服务的宗旨也是防止服务的多次调用,降低代码的耦合度,因此这么看来策略模式和微服务还是比较相像的。分别写两个实现类,一个是小明的实现类,一个是小红的实现类。
2024-04-25 12:31:35 421 1
原创 Redis和Mysql如何保证数据一致性?
先阐明一下Mysql和Redis的关系:Mysql是数据库,用来持久化数据,一定程度上保证数据的可靠性;Redis是用来当缓存,用来提升数据访问的性能。关于如何保证Mysql和Redis中的数据一致(即缓存一致性问题),这是一个非常经典的问题。使用过缓存的人都应该知道,在实际应用场景中,要想实时刻保证缓存和数据库中的数据一样,很难做到。基本上都是尽可能让他们的数据在绝大部分时间内保持一致,并保证最终是一致的。
2024-04-17 20:01:36 950
原创 RocketMQ 如何保证消息不丢失?
producer消息发送方式虽然有3种,但为了减小丢失消息的可能性尽量采用同步的发送方式,同步等待发送结果,利用同步发送+重试机制+多个master节点,尽可能减小消息丢失的可能性。在broker端,消息丢失的可能性主要在于刷盘策略和同步机制。RocketMQ默认broker的刷盘策略为异步刷盘,如果有主从,同步策略也默认的是异步同步,这样子可以提高broker处理消息的效率,但是会有丢失的可能性。因此可以通过同步刷盘策略+同步slave策略+主从的方式解决丢失消息的可能。
2024-04-15 12:23:30 876 1
原创 spring redis缓存穿透、缓存击穿、缓存雪崩以及解决方案
缓存穿透 :缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,由于缓存中没有数据,请求会直接穿透到数据库中,从而引起数据库的压力过大,严重影响系统的性能。解决缓存穿透的常用方法有两种。在上面的代码中,我们先在缓存中查询数据,如果不存在,则去数据库中查询,并将数据缓存到Redis中,并增加随机的过期时间。缓存击穿是指一个非常热点的数据在缓存中过期之后,正好在这个时间段内有大量的请求访问该数据,这些请求会直接穿透到数据库中,从而引起数据库的压力过大,严重影响系统的性能。
2024-03-10 15:34:50 753 1
原创 spring三级缓存解决循环依赖
singletonObjects:缓存经过了完整生命周期的beanearlySingletonObjects:缓存未经过完整生命周期的bean,如果某个bean出现了循环依赖,就会提前。
2024-03-05 13:10:38 1598
原创 设计模式-中介者模式
中介者模式是一种行为型设计模式,它用于减少对象之间互相通信的复杂性。中介者模式通过创建一个中介者对象,将对象之间的通信集中交给该对象来处理,而不是直接相互交流,就是用一个中介对象来封装一系列的对象交互。中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。是符合迪米特原则的典型应用。迪米特原则:减少对象之间的依赖,即一个对象应当对其它对象有尽可能少的了解二、优缺点减少对象之间的耦合度,使其变得简单易维护。提高代码的重用性和可扩展性,增强了系统的灵活性和可维护性。
2024-02-28 20:50:44 1734
原创 springAOP底层原理浅析
JDK通过反射,生成一个代理类,这个代理类实现了原来那个类的全部接口,并对接口中定义的所有方法进行了代理。5、从拦截器链中依次获取第一个通知开始进行执行,在执行过程中,为了方便找到下一个通知是哪一个,会有CgibMethodInvocation的对象,找的时候是从-1的位置依次开始查找的并且执行的。CGLiB直接操作字节码,生成类的子类,重写类的方法完成代理。aop是ioc的一个扩展功,先有的ioc,再有的aop,只是ioc的整个流程中新增的一个扩展点而已:BeanPostProcessor。
2024-01-14 15:10:04 1623 1
原创 【springbean的生命周期】
销毁:第8~10步,第8步其实也可以算到销毁阶段,但不是真正意义上的销毁,而是先在使用前注册了销毁的相关调用接口,为了后面第9、10步真正销毁Bean时再执行相应的方法。初始化:初始化的阶段的步骤比较多,5、6步是真正的初始化,第 3、4 步为在初始化前执行,第7步在初始化后执行,初始化完成之后,Bean就可以被使用了。Bean生命周期里初始化的过程相对步骤会多一些,比如前置、后置的处理。属性赋值:第 2 步,为 Bean 设置相关属性和依赖。实例化:第 1 步,实例化一个 Bean 对象。
2024-01-07 21:35:06 349
原创 【无标题】
Comparable和Comparator都是两个接口,接口都可以用来实现集合中元素的比较、排序,Comparator位于包java.util下,而Comparable位于包java.lang下,Comparable接口将比较代码嵌入自身类中,而Comparator既可以嵌入到自身类中,也可以在一个独立的类中实现比较。
2023-10-30 22:07:36 46 1
原创 HashSet去重原理解析
HashSet的特点1.元素不能重复且无序2.允许有null值3.线程不安全4.底层的数据结构是HashMapHashset的实现原理1.在HashSet中,元素被存放在HashMap的key中,value则是一个常量对象,所以HashSet能够保证元素的不重复。
2023-10-29 23:07:45 482 1
原创 arrayList和vector的区别
从上面的分析可知,在ArrayList的前面或中间插入数据时,你必须将其后的所有数据相应的后移,这样必然要花费较多时间,所以,当你的操作是在一列 数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的元素时,使用ArrayList会提供比较好的性能;在Java集合框架中的大部分类的大小是可以随着元素个数的增加而相应的增加的,我们似乎不用关心它的初始大小,但如果我们考虑类的性能问题时,就一定要考虑尽可能地设置好集合对象的初始大小,这将大大提高代码的性能。ArrayList:查询快(有索引的存在)
2023-10-17 13:35:28 72
原创 ArrayList扩容机制
调用addAll(Colection c)方法时,当前没有元素(容量为0的话),首次扩容会max(10,实际元素个数)(从10和实际加入元素个数中选择最大容量进行扩容),当前存在有元素时,则max(原容量1.5倍,实际元素个数)2.传容量构造,当参数为0时,创建ArrayList后容量为0,添加第一个元素后,容量为1,此时ArrayList是满的,下次添加元素时需正常扩容。1.无参构造,创建ArrayList后容量为0,添加第一个元素后,容量变为10,此后若需要扩容,则正常扩容。
2023-10-12 15:16:55 59
原创 StringBuffer与StringBuilder扩容机制
一次追加长度不仅超过初始容量,而且按照 当前容量*2+2 扩容一次也不够,其容量会直接扩容到与所添加的字符串长度相等的长度。之后再追加的话,还会按照 当前容量*2+2进行扩容。jdk5.0新增的,线程不安全的,效率高;底层使用byte]存储。底层使用byte[]存储。StringBuffer 的有参构造初始容量为:字符串参数的长度+16。一次追加长度超过当前容量,则会按照 当前容量*2+2 扩容一次。底层使用byte[]存储。的无参构造初始容量为:16,下图为无参构造的源码。有参和无参扩容方法都一样的。
2023-10-09 18:04:03 116
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人