一 无限极数据获取
1)递归–每个节点都要发送一条sql 不建议用
2)循环-一次性把所以的节点都查询出来,再来组织他们关系
①查询所有节点
②如果是第一级放入返回的list
③如果是非第一级,建立父子关系
1 获取服务 map(id-node)
2 把自己作为父亲一个儿子放进去就ok children=new Array<>();
二 缓存优化
1)你项目中没有使用到缓存?
用过!在哪个项目的那个模块用的缓存,为什么要用它? 经常查询很少修改
2)用得是那个缓存
redis 集群
3)使用缓存好处?
减轻数据库压力
提高访问速度,增强用户体验
4)我们缓存数据很多?-redis集群
**主从复制-单主故障
哨兵模式-每个节点数据都是一样
redis-cluster: 单点故障,高并发,大量数据**
5)缓存穿透,缓存击穿,缓存雪崩-面试必备技能
https://blog.csdn.net/kongtiao5/article/details/82771694
缓存穿透:高并发访问数据库中不存在数据,放入缓存的数据也没有,击穿缓存每次都要查询数据库.
1)有很多种方法可以有效地解决缓存穿透问题,最常见的则是采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被这个bitmap拦截掉,从而避免了对底层数据库的查询压力。
2)另外也有一个更为简单粗暴的方法,如果一个查询返回的数据为空(不管是数据不存在,还是系统故障),仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。
缓存击穿:一个key过期,又来高并发访问. 直接高并发访问数据库.
1)让热点数据永远不过期.
2)加互斥锁,互斥锁参考代码如下 我在访问数据库是你就不要访问
缓存雪崩:一堆key同时过期
设置过期时间不一致就ok. 热点数据永远不过期
if (courseTypesOfDb == null || courseTypesOfDb.size()<1){
//缓存穿透
redisClient.add(COURSETYPE_KEY_IN_CACHE,"[]");
}else{
//转换为json字符串
String jsonArrStr = JSONArray.toJSONString(courseTypesOfDb);
//设置获取
//缓存数据永远不过期 缓存击穿 缓存雪崩
redisClient.add(COURSETYPE_KEY_IN_CACHE,jsonArrStr);
}
三 服务调用
服务间调用–feign-ribbon,hystrix(负载均衡,服务高可用(熔断))
外部调用服务-都是通过zuul-ribbon,hystrix(负载均衡,服务高可用(熔断))
无论是服务间调用或者是外部调用都是进行负载均衡和熔断+降级。
commonService
redis服务是给服务间调用,前端不能直接操作redis
fastdfs直接给前端调用,前端可以直接删除图片和删除图片
**
微服务架构(springcloud)中是怎么做负载均衡?
软负载均衡的实现方式有两种,分别是服务端的负载均衡和客户端的负载均衡
服务端负载均衡:当浏览器向后台发出请求的时候,会首先向反向代理服务器发送请求,反向代理服务器会根据客户端部署的ip:port映射表以及负载均衡策略,来决定向哪台服务器发送请求,一般会使用到nginx反向代理技术。
客户端负载均衡:当浏览器向后台发出请求的时候,客户端会向服务注册器(例如:Eureka Server),拉取注册到服务器的可用服务信息,然后根据负载均衡策略,直接命中哪台服务器发送请求。这整个过程都是在客户端完成的,并不需要反向代理服务器的参与。
微服务架构(springcloud)中是怎么做熔断和降级?
‘Spring Cloud中集成Hystrix框架’
在Spring Cloud微服务设计中需要通过集成Hystrix框架来实现微服务间的熔断保护机制,Hystrix框架会通过监控微服务之间的调用情况,来决定是否启动熔断保护