zookeeper
Zookeeper入门工作机制从设计模式角度来理解,是一个基于观察者模式设计的分布式服务管理框架,负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,ZK就将 负责通知已经在ZK上注册的哪些观察者 做出相应的反应。
特点
1)Zookeeper:一个领导者(Leader),多个跟随者(Follower)组成的集群。
2)集群中只要有 半数以上节点存活,Zookeeper集群就能正常服务。所以Zookeeper适合安装奇数台服务器。
3)全局数据一致:每个Server保存一份相同的数据副本,Client无论连接到哪个Server,数据都是一致的。
4)更新请求顺序执行,来自同一个Client的更新请求按其发送顺序依次执行。
5)数据更新原子性,一次数据更新要么成功,要么失败。
6)实时性,在一定时间范围内,Client能读到最新数据。
数据结构ZooKeeper 数据模型的结构与 Unix 文件系统很类似,整体上可以看作是一棵树,每个节点称做一个 ZNode。每一个 ZNode 默认能够存储 1MB 的数据,每个 ZNode 都可以通过其路径唯一标识。
...
Elasticsearch
Elasticsearch首先数据有结构化数据和非结构化数据还有半结构化数据。
结构化数据一般为二维的表结构,一般是用sql来查询,可以用索引增加效率,但是扩展方面很麻烦。
非结构化数据是不能用二维表来记录的数据,比如报表,一般用key -value 结构来存储,相对来说快。
半结构化数据就是类似XML,把内容和结构混在一起,但是查询内容不容易
现在就是为了解决这个实时数据的分析和采集就用Elasticsearch
是什么是一个开源的高扩展的分布式全文搜索引擎,全站搜索,整个网站匹配的文章。
那么同类型的还有Solr,然后ES一般实时数据,Solr用静态数据,变动不大的查询。
喜欢监控和指标还有分布式索引那么勇ES。
入门安装Elasticsearch 分为 Linux 和 Windows 版本,基于我们主要学习的是Elasticsearch的Java 客户端的使用,所以课程中使用的是安装较为简便的Windows版本。
目录
含义
bin
可执行脚本目录
config
配置目录
jdk
内置JDK目录
lib
类库
logs
日志目录
modules ...
SpringCloud
红色部分是Alibaba
1、从boot和cloud版本选型开始最终选型123456Java 17+cloud 2023.0.0boot 3.2.0 cloud alibaba 2022.0.0.0-RC2Maven 3.9+Mysql 8.0+
推演过程为什么选版本?怎么选型呢?
SpringCloud 和 SpringCloud Alibaba 截然不同,根据工作需要可以直接学SpringCloudAlibaba
SpringBoot版本选择
git源码地址 https://github.com/spring-projects/spring-boot/releases/
官网看Boot版本 3.2.0
也就是直接看官网,但是官网有延后,还要看 git源码上的版本说明,配合着看
那谁决定谁呢?
若同时使用Boot和cloud,由话事人cloud决定boot版本
Spring cloud Alibaba 毕业版本依赖关系
2、关于Cloud各种组件的停更/升级/替换微服务理论知识入门什么是微服务
形象一点来说:微服务就像搭积木,每个微服务都是一个零件一个继母, ...
Java注解
Java注解首先java注解非常常用,所以这里开一篇文章理解Java注解的原理。
Java注解定义注解就是个标签,一个元数据。
元数据就类似于描述数据的数据,比如书籍元数据,写的就是书籍序列号,简介,作者这些。
不改变属性,不执行方法。
告诉编译器,框架,甚至是运行时
所以有些是通过反射实现,有些只是告诉编译器一些信息而已,各种各样。
如何定义注解123@interface MyAnnotatin{ String value() default "";}
使用注解:在类,方法、字段的那个代码元素上使用即可。
12345@MyAnnotation(value = "example")public class MyClass{ @MyAnnotation public void myMethod(){}}
注解怎么起作用?
靠工具,靠框架比如runtime级别的注解,框架在运行时会反射去读取
那么注解上面还有注解。
这个就是元注解
元注解@Retention:用来定义注解的保留策略, ...
Springboot3
SpringBoot3从SpringBoot2开始web编程分为了两个流派,
一个使用Servlet技术栈,可以称为传统派,一个使用Reactive技术栈,也就是响应式技术栈,使用Servlet编程的话,会使用ServletAPI规范,配上Servlet容器,比如Tomcat再配合Spring一系列技术栈,比如Spring MVC,SpringSecurity,SpringData来构建web应用,这种称为阻塞同步的BIO模型。
一个使用响应式技术栈,按照Reactive和Stream规范,搭配上Netty和Tomcat在Servlet3.1+标准上也支持异步请求。有了这些容器搭配Spring SecurityReactive框架做安全验证,SpringWebFlux框架做MVC,SpringDataReactive做数据处理。这样就能挖掘CPU的能力处理大量并发
前置知识
java17
Spring、SpringMVC、MyBatis
Maven、IDEA
环境要求
环境&工具
版本
SpringBoot
3.0.4+
IDEA
2021+
jA ...
redis 高级篇
Redis高级篇Redis单线程 VS 多线程 入门面试题1、redis到底是单线程还是多线程
2、IO多路复用
3、redis为什么快?
Redis为什么选择单线程?redis3以及之前是单线程的。
redis4之后才慢慢支持多线程 支持异步删除,部分多线程,直到redis6/7之后才稳定,完全支持多线程。
那以前我们说redis是单线程是什么意义
主要是指Redis的网络IO和键值对读写是由一个线程来完成的,Redis在处理客户端的请求时包括获取(socket读),解析,执行,内容返回(socket写)等都由一个顺序串行的主线程处理,这就是所谓的单线程,这也是redis对外提供剪枝存储服务的主要流程。
但是Redis的其他功能,比如持久化RDB、AOF、异步删除、集群数据同步等等,其实是由额外的线程执行的。Redis命令工作线程是单线程的,但是,整个Redis来说,是多线程的。
也就是说一个命令set但是这时候需要RDB,AOF,这时候就会新开一个线程,处理这些。
但是操作十大类型的原子性操作都是单线程的。
Redis3单线程时代但性能依旧很快的原因
从硬件的角度,Redis是基 ...
Spring面试
Spring相关面试什么是循环依赖循环依赖就是A依赖B,然后B又依赖A了,无法确定加载模块顺序
Spring如何解决循环依赖Spring主要用三级缓存来解决循环依赖
一级缓存:用于存储完全初始化完成的单例Bean
二级缓存:用于存储尚未完全初始化,但已经实例化的Bean
三级缓存:用于存储对象工厂,比如AOP代理对象创建的时候就需要工厂了。
解决步骤就是:
步骤 1:开始创建 Bean A
Spring 调用 A 的构造方法,实例化 A 对象(此时 A 的属性还未注入)
将 A 的 ObjectFactory放入三级缓存(singletonFactories)
singletonFactories.put("a", () -> getEarlyBeanReference("a", a));
步骤 2:为 A 填充属性(发现依赖 B)
Spring 发现 A 需要注入 B
于是转去创建 B
步骤 3:开始创建 Bean B
实例化 B 对象
将 B 的 ObjectFactory 放入三级缓存
为 B 填充属性 → 发现依赖 A
步骤 ...
SpringMVC
SpringMVCSpringMVC是spring为展现层提供的基于MVC设计理念的优秀WEB框架
SpringMVC通过一套注解,可以让普通的JAVA类成为contrllor控制器,无需继承Servlet
实现了控制层和Servlet之间的解耦。SpringMVC支持Rest风格的URL写法SpringMVC采用了松耦合,可热插的主键结构,比其他的框架更具扩展性和灵活性。
框架执行流程
1DispatcherServlet:前端控制器用户请求到达前端控制器,它就相当于 mvc 模式中的 c,dispatcherServlet 是整个流程控制的中心,由 它调用其它组件处理用户的请求,dispatcherServlet 的存在降低了组件之间的耦合性。
2 HandlerMapping:处理器映射器HandlerMapping 负责根据用户请求找到 Handler 即处理器,SpringMVC 提供了不同的映射器实现不同的 映射方式,例如:配置文件方式,实现接口方式,注解方式等。
3 Handler:处理器 (自己定义的Controller处理单元)它就是我们开发中要编写的具体业务控制器。 ...
动态代理和反射
动态代理和反射由于这两个东西很重要经常用,所以我专门用一个文章来讲解,忘了就看着一个就够了
反射反射机制就是在 运行的时候 获取类的结构信息,比如方法,字段,构造函数并操作对象的一种机制。
反射操作相对于静态调用有比较高的性能开销,因为他涉及到动态解析和方法调用。所以在性能敏感的场景中,尽量避免使用反射。可以通过 缓存反射结果 避免反射性能问题。
反射主要有个Class类,通过Class类的实例可以获取类的各种信息。
反射的主要主要功能:
创建对象:通过Class.newInstance 或者Constructor.newInstance()创建对象实例
访问字段:通过Field类访问和修改对象的字段。
调用方法:使用Method类调用对象的方法
获取类对象:获取类的名称、父类、接口等信息。
类的元数据存在方法区 / 元空间,Class 实例存在堆中,反射通过堆中的 Class 实例,访问方法区的元数据,进而操作对象。
动态代理首先了解静态代理
一个租房子问题,中介就是这个原理。
缺点代理需要手动创建,简单来说就是房主和中介都要实现租房接口,这个租房接口规定了租房的规范,然后消 ...
算法理解(口语化)
算法理解(口语化)前导要学算法首先要熟悉 IO 模板这里先提前学 IO模板
提前告诉数据量的类型
1234567891011121314151617181920import java.io.*;import java.util.*;public class Main{ //这里注意要抛出异常 public static void main(String[] args) throws IOException{ //注意输入和输出流 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StreamTokenizer in = new StreamTokenizer(br); PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); while(in.nextToken() != S ...









