1、LRU缓存机制:
LRU是一种缓存替换算法,就是将最近最少使用的页面或者元素进行替换,将最近最多使用的页面或者元素保持在缓存里。
2、rabbitmq 消息队列
(1)解耦:将系统按照不同的业务功能拆分出来,消息生产者只管把消息发布到 MQ 中而不用管谁来取,消息消费者只管从 MQ 中取消息而不管是谁发布的。消息生产者和消费者都不知道对方的存在;
(2)异步:主流程只需要完成业务的核心功能;对于业务非核心功能,将消息放入到消息队列之中进行异步处理,减少请求的等待,提高系统的总体性能;
(3)削峰/限流:将所有请求都写到消息队列中,消费服务器按照自身能够处理的请求数从队列中拿到请求,防止请求并发过高将系统搞崩溃;
3、多线程
实现线程:继承Thread类;实现Runnable接口;实现Callable接口
避免死锁最简单的方法就是阻止循环等待条件
,将系统中所有的资源设
置标志位、排序,规定所有的进程申请资源必须以一定的顺序(升序或降序)
做操作来避免死锁
wait()方法用于线程间通信,如果等待条件为真且其它线程被唤醒时它会
释放锁,而 sleep()方法仅仅释放 CPU 资源或者让当前线程停止执行一段时间,
但不会释放锁。
4、hashmap底层原理
jdk1.7:底层是基于 数组+链表 组成的
put方法:
- 判断当前数组是否需要初始化
- 如果 key 为空,则 put 一个空值进去
- 根据 key 计算出 hashcode
- 根据计算出的 hashcode 定位出所在桶
- 如果桶是一个链表则需要遍历判断里面的 hashcode、key 是否和传入 key 相等,如果相等则进行覆盖,并返回原来的值,如果不相等则加一个实体
- 如果桶是空的,说明当前位置没有数据存入;新增一个 Entry 对象写入当前位置
get方法:
- 首先也是根据 key 计算出 hashcode,然后定位到具体的桶中
- 判断该位置是否为链表。
- 不是链表就根据 key、key 的 hashcode 是否相等来返回值。
- 为链表则需要遍历直到 key 及 hashcode 相等时候就返回值。
- 啥都没取到就直接返回 null 。
![](https://i-blog.csdnimg.cn/blog_migrate/0c0cf2a3de6ecd93cacf35dd7dae1d48.png)
jdk1.8:底层是基于 数组+链表+红黑树 组成的
5、springcloud五大组件
springcloud常用五大组件:
1、服务发现——Netflix Eureka
2、负载均衡——Netflix Ribbon
3、断路器——Netflix Hystrix
4、服务网关——Netflix Zuul
5、分布式配置——Spring Cloud Config
Eureka 是分为 server 和 service , server 通常只有一个(多个可以提高高可用性及容错),service 有一般多个。service 通常都是单个 springboot 程序,启动时向 server 注册自己,这样,在 RestTemplate 或者 feign 调用时,不需要根据 ip 及 端口 去查找,只需要知道你这个 springboot 程序的 applic.name 即可(当ip地址多的时候,每启动一下就配置一次会很麻烦)。
Ribbon 一般结合 RestTemplate 去使用,RestTemplate 默认实现了 负载均衡,轮询机制,及多个相同 application.name 的程序,不同ip或端口,Ribbon 不需要知道你的ip和端口,只需要知道你在 Eureka server 注册的名字,便会 不断对具有相同名字的 程序进行轮询。
Hystrix 断路器,一般 Ribbon 去访问某个 程序应用时,这个程序挂掉了,此时如果没任何措施,可能引起连锁反应,最后导致不可想象的后果,而 断路器 的作用就是,当这个程序不可用时,及时切断之间联系,当程序恢复时,在保持关联。
Zuul 网关,他的作用类似 nginx 的反向代理,除此之外,还可以配置权限验证等。当后台有多个应用时,app或者前端程序想访问后端接口时,统一格式,否则程序一多便会出现混乱。
Spring Cloud Config 分布式配置,他的作用见名知意,通过 连接 git 或 mvn 等,实现统一的 文件配置,结合 spring cloud bus 可以实现动态的属性配置。