- 博客(22)
- 收藏
- 关注
原创 一致性哈希算法原理详解
在服务器B未移除时,图片3应该被缓存到服务器B中,可是当服务器B移除以后,按照之前描述的一致性哈希算法的规则,图片3应该被缓存到服务器C中,因为从图片3的位置出发,沿顺时针方向遇到的第一个缓存服务器节点就是服务器C,也就是说,如果服务器B出现故障被移除时,图片3的缓存位置会发生改变,但是,图片4仍然会被缓存到服务器C中,图片1与图片2仍然会被缓存到服务器A中,这与服务器B移除之前并没有任何区别,这就是一致性哈希算法的优点。圆环的正上方的点代表0,0点右侧的第一个点代表1,以此类推,2、3、4、5、6……
2024-05-14 22:57:32 651
原创 全面解析微服务保护(二、流量控制)
可以看到这⾥200个⽤户,50秒内发完,QPS为4,超过了我们设定的阈值2 ⼀个http请求是访问/order/save:运⾏的结果:完全不受影响。重启服务,访问/order/query和/order/save,可以查看到sentinel的簇点链路规则中,出现了新的资。需求:给/order/prod/{pid}这个资源设置限流,最⼤QPS为10,利⽤排队的流控效果,超时时⻓设置为5s。配置流控规则,当/order/ update资源被访问的QPS超过5时,对/order/query请求限流。
2024-04-22 14:25:58 788
原创 全面解析微服务保护(一、Sentinel)
1.初识Sentinel1.1.雪崩问题及解决⽅案1.1.1.雪崩问题微服务中,服务间调⽤关系错综复杂,⼀个微服务往往依赖于多个其它微服务。如图,如果服务提供者I发⽣了故障,当前的应⽤的部分业务因为依赖于服务I,因此也会被阻塞。此时, 其它不依赖于服务I的业务似乎不受影响。服务器⽀持的线程和并发数有限,请求⼀直阻塞,会导致服务器资源耗尽,从⽽导致所有其它服务都不 可⽤,那么当前服务也就不可⽤了。
2024-04-22 11:10:39 970
原创 全面理解微服务通信Dubbo
Dubbo是阿⾥巴巴开源的基于 Java 的⾼性能 RPC分布式服务框架,致⼒于提供⾼性能和透明化的RPC远程服务调⽤⽅案,以及SOA服务治理⽅案。Spring Cloud Alibaba微服务开发框架集成了Dubbo,可实现微服务对外暴露Dubbo协议的接⼝,Dubbo协议相⽐RESTful协议速度更快RPC:RPC是远程过程(Remote Procedure Call)的缩写形式,调⽤RPC远程⽅法就像调⽤本地。
2024-04-19 14:08:40 674 1
原创 Redis的线程模式
多路I/O复用模型是利用 select、poll、epoll 可以同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有 I/O 事件时,就从阻塞态中唤醒,然后程序就会轮询一遍所有的流(epoll 是只轮询那些真正发出了事件的流),并且依次顺序的处理就绪的流,这种做法就避免了大量的无用操作。在redis的多线程模式下,获取、解析命令,以及输出结果着两个过程,可以配置成多线程执行的,因为它毕竟是我们定位到的主要耗时点,但是命令的执行,也就是内存操作,依然是单线程运行的。
2024-04-19 13:57:29 1014 1
原创 Map常用遍历方式 以及 性能对比
遍历Map集合的常用方式有三种:使用keySet的方式,使用entrySet的方式,使用values()取值的方式,这三种方式中,都有对应的for循环遍历和遍历的方式取值。keySet是键的集合,Set里面的类型即key的类型;entrySet是键-值对的集合,Set里面的类型是Map.Entry,Entry是一个键-值对;keySet():迭代后只能通过get()取key;entrySet():迭代后可以e.getKey(),e.getValue()取key和value,返回的是Entry接口;
2024-04-17 19:11:50 463
原创 微服务通信
1.Feign远程调⽤先来看我们以前利⽤RestTemplate发起远程调⽤的代码//通过restTemplate调用商品微服务String url ="service-product";Product product = restTemplate.getForObject("http://"+url+"/product/" + pid, Product.class);存在下⾯的问题:代码可读性差,编程体验不统⼀参数复杂URL难以维护1.1 Feign简介F
2024-04-16 16:02:49 244 1
原创 微服务网关
Spring Cloud Gateway 是 Spring Cloud 的⼀个全新项⽬,该项⽬是基于 Spring 5.0,Spring。我们在配置⽂件中写的断⾔规则只是字符串,这些字符串会被Predicate Factory读取并处理,转变为路由判断的条件。路由和负载均衡:⼀切请求都必须先经过gateway,但⽹关不处理业务,⽽是根据某种规则,把请。2. 路由⽬标(uri):路由的⽬标地址,http代表固定地址,lb代表根据服务名负载均衡。WebFlux,属于响应式编程的实现,具备更好的性能。
2024-04-16 14:26:23 543 1
原创 聚簇索引、非聚簇索引、间隙锁
索引就是一种的数据结构,通过缩小一张表中需要查询的数据来加快搜索的速度。如果没有索引,数据库不得不进行全表扫描。好比书的目录,让你更快的找到内容。1、索引的优点:(1)大大减少查询需要检索的行数,加快查询速度,避免进行全表扫描,这也是创建索引的最主要的原因。(2)如果索引的数据结构是B+树,在使用分组和排序时,可以显著减少查询中分组和排序的时间。(3)通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
2024-04-12 12:44:17 515
原创 Redis的企业级解决方案【缓存预热、雪崩、击穿、穿透】
缓存预热就是系统启动前,提前将相关的缓存数据直接加载到缓存系统。避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题!用户直接查询事先被预热的缓存数据。二、缓存雪崩(
2024-03-11 19:28:20 1748 1
原创 全面理解AOP(基本应用和实现方法)
AOP ( 面向切面编程),AOP 是一种编程思想,是面向对象编程(OOP)的一种补充。实现在不修改源代码的情况下给程序动态统一添加额外功能的一种技术。AOP可以拦截指定的方法并且对方法增强,而且无需侵入到业务代码中,使业务与非业务处理逻辑分离,比如Spring的事务,通过事务的注解配置,Spring会自动在业务方法中开启、提交业务,并且在业务处理失败时,执行相应的回滚策略。
2024-03-03 19:42:12 2129
原创 Spring Bean的生命周期
图一:图二:Bean的生命周期为 :实例化(Instantiation) -> 属性赋值 (Populate)-> 初始化(Initialization) -> 销毁(Destruction)首先是实例化、属性赋值、初始化、销毁这 4 个大阶段;再是初始化的具体操作,有 Aware 接口的依赖注入、BeanPostProcessor 在初始化前后的处理以及 InitializingBean 和 init-method 的初始化操作;
2024-03-03 15:46:40 1571
原创 全面理解Spring IOC(控制反转)与DI(依赖注入)
把创建对象的权利交给容器,对象的实例不再由调用者来创建,而是由容器来创建,容器会负责控制程序之间的关系,而不是由调用者的程序代码直接控制。这样,控制权由应用代码转移带了容器,控制权发生了反转,这就是控制反转。它是spring框架的核心思想之一。1.2 DI(Dependency Injection)定义:当某个java 实例需要另一个java实例时,创建被调用者的工作不是由调用者实现,而是由spring容器来完成,然后注入调用者,因此称为依赖注入。
2024-02-26 23:19:25 882 1
原创 JDBC全集 JDBC 类和接口 工作原理 连接数据库案列,SQL注入,JDBC三层架构,连接池技术
JDBC是什么JDBC(Java Database Connectivity)是JAVA访问数据库的解决方案JDBC定义了一套标准接口,即访问数据库的通用API,实现不同的数据库厂商根据各自数据库的特点去实现这些接口JDBC希望用相同的方式访问不同的数据库,让具体的数据库操作与数据库厂商实现无关,从而在不同数据库之间轻易的进行切换(跨平台性)
2023-11-14 23:32:11 83 1
原创 java中Comparable接口与Comparator接口的使用及区别
Comparable是排序接口若一个类实现了Comparable接口,就意味着“该类支持排序”。接口中通过x.compareTo(y)来比较x和y的大小。若返回负数,意味着x比y小;返回零,意味着x等于y;返回正数,意味着x大于y。Comparator 简介Comparator 是比较器接口。我们若需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口);那么,我们可以建立一个“该类的比较器”来进行排序。这个“比较器”只需要实现Comparator接口即可。
2023-10-31 00:09:36 51 1
原创 Java文件流
也可以通过Stream Api处理上的元素。首先通过Stream()方法从堆栈获取流。一旦从Stack上获取了Stream。3.从stack顶部获取元素 peek()方法 查看stack的第一个元素,而且并不移除元素。底层是用数组实现的,相关的方法都增加了同步检车,因此“线程安全,效率低”。2.stack取出并移除元素 pop()4.搜索元素位置 search()方法。使用Stream的进程Stack。先进后出 继承Verctor类。使用Stack反转List。6.迭代stack元素。
2023-10-30 19:18:00 45
原创 集合Queue接口
1.disjoint 判断两个集合中是否存在相同的元素,如果存在,则返回false,不存在返回true。8.List 、Set、Map 创建一个线程安全的List、Set、Map集合。3.frequency 获取集合中,指定元素出现的频率。特点:双端队列:队头和队尾都能进行入队和出队操作。remove()删除元素,如果失败,则抛出异常。element()获取元素,如果失败,则抛出异常。poll()添加元素,如果失败,则返回null。poll()获取元素,如果失败,则返回null。2.fill 填充集合。
2023-10-30 18:55:06 33
原创 Hashset去重原理
将数据对象放入Hashset时,Hashset会先计算出对象的hashcode值来判断对象加入的位置,同时与其他加入对象的hashcode值作比较,如果两个hashcode值不同,先假设对象没有重复出现。但是如果发现有相同hashcode值的对象,这时会调用equals()方法来检查hashcode相等的对象是否真相同。不包含重复元素的集合。更正式地,集合不包含一对元素e1和e2 ,使得e1.equals(e2) ,并且最多一个空元素。set接口的特点:无序、无下标、元素不能重复。来实现元素的不可重复。
2023-10-30 00:21:53 43
原创 ArrayList 和LinkedList的区别
1、ArrayList的实现是基于数组,LinkedList的实现是基于双向链表。2、对于随机访问,ArrayList优于LinkedList3、对于插入和删除操作,LinkedList优于ArrayList4、LinkedList比ArrayList更占内存,因为LinkedList的节点除了存储数据,还存储了两个引用,一个指向前一个元素,一个指向后一个元素。ArrayList类实现了可变数组的大小,存储在内的数据成为元素。它提供了快速基于索引访问元素的方式,对尾部成员的增加和删除支持较好。
2023-10-17 22:08:48 34
原创 HashMap扩容机制
①.判断键值对数组table[i]是否为空或为null,否则执行resize()进行扩容;②.根据键值key计算hash值得到插入的数组索引i,如果table[i]==null,直接新建节点添加,转向⑥,如果table[i]不为空,转向③;③.判断table[i]的首个元素是否和key一样,如果相同直接覆盖value,否则转向④,这里的相同指的是hashCode以及equals;
2023-10-15 22:54:25 157
原创 ArrayList的扩容机制
当前数组由默认构造方法生成的空数组并且第一次添加数据。先将空的扩容至10然后的数组扩容至当前容量的1.5倍;当扩容后的数组不够用时,再对其进行1.5倍的扩容。将数组的长度扩容至1.5倍int newCapacity = oldCapacity + (oldCapacity >> 1)判断所需的长度大小是否小于数组的长度,如果数组的长度小于比所需的小,则执行grow方法进行扩容。判断添加的元素e所需的大小Math.max比较将要扩容的大小与所需的长度哪个大。
2023-10-12 08:01:28 44 1
原创 StringBuilder与StringBuffer的扩容机制
2.它们两个的区别在于StringBuffer是线程安全的但效率低,因为StringBuffer的所有公开方法都是synchronized修饰的,对方法加了层锁同步。2.一次追加长度不仅超过初始容量,而且按照当前容量*2+2扩容一次也不够,其容量会直接扩容到与所添加的字符串长度相等的长度。3.使用append()方法在字符串后面追加值的时候,如果长度超过了该字符串存储空间大小了就需要进行扩容:构建新的并且存储空间更大的字符串,将旧的复制过去;1.一次追加长度超过当前容量,则会按照当前容量*2+2扩容一次。
2023-10-08 19:32:40 93 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人