-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathleaderGo
139 lines (97 loc) · 9.37 KB
/
leaderGo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
极客时间 陈皓(左耳听风) :https://coolshell.cn/
jdk6引入serviceProvider
--> 概念上更接近实现方组织上位于实现方所在的包中实现和接口在一个包中
-->当接口属于调用方时,我们就将其称为spi,全称为:service provider interface,spi的规则如下:
概念上更依赖调用方组织上位于调用方所在的包中实现位于独立的包中(也可认为在提供方中)
ServiceLoader可以通过service provider的配置文件来装载指定的service provider。当服务的提供者,提供了服务接口的一种实现之后,
我们只需要在jar包的META-INF/services/目录里同时创建一个以服务接口命名的文件。该文件里就是实现该服务接口的具体实现类。
而当外部程序装配这个模块的时候,就能通过该jar包META-INF/services/里的配置文件找到具体的实现类名,并装载实例化,完成模块的注入。
-->DriverManager初始化时也运用了spi的思想,使用ServiceLoader把写到配置文件里的Driver都加载了进来。
我们打开mysql-connector-java的jar包,果然在META-INF/services下发现了上文中提到的接口路径,打开里面的内容,
可以看到是com.mysql.jdbc.Driver
jvm tomcat 类加载:
-->tomcat下catalina.properties common.loader ->https://zhuanlan.zhihu.com/p/24168200
linux:nohub 后台执行 ./mqnamesr
Netty:基于JDK中Future的基础上,添加异步监听等方法,反映了Netty事件驱动的本质
ChannelFuture extends Future<>,Promise extends Future https://www.kancloud.cn/ssj234/netty-source/433211
java内存分布:https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484884&idx=1&sn=0d9b841ce0fc300c78ade2a87ffbfb46&source=41#wechat_redirect
javap是jdk自带的反解析工具。它的作用就是根据class字节码文件,反解析出当前类对应的code区(汇编指令)、本地变量表、异常表和代码行偏移量映射表、常量池等等信息。
linux调优:uptime - top(3秒) - pidstat - perf top (perf record记录) - vmstat - iostat
-->模拟压测(并发调用,多次):apachebench - sysbench - webbench - http_load - siege
缓存/数据库同步策略: 一 1.先删除缓存;2.再写数据库;3.休眠500毫秒;4.再次删除缓存(缓存淘汰或到期自动刷新,设置不同淘汰时间兜底)。
异步订阅binlog推送Redis (Canal) 二 读Redis:1.热数据基本都在Redis;2.写MySQL:增删改都是操作MySQL;3.更新Redis数据:MySQ的数据操作binlog,来更新到Redis
分库分表路由策略(无限扩容,权重有取舍的分配):hash和range:类似ConcurrentHashMap(以id(0-400万)划分group1,如果要扩容(之后(400万-880万)数据落在group2)),
-->之后根据hash取模落在不同的水平分库上(DB_1....),之后再range落在不同的水平分表上(Table_1.....)
HashMap(开放链表hash寻址):1.为什么可以使用位运算(&)来实现取模运算(%)呢?这实现的原理如下:
X % 2^n = X & (2^n – 1),2^n表示2的n次方,也就是说,一个数对2^n取模 == 一个数和(2^n – 1)做按位与运算 。
假设n为3,则2^3 = 8,表示成2进制就是1000。2^3 = 7 ,即0111。此时X & (2^3 – 1) 就相当于取X的2进制的最后三位数。
从2进制角度来看,X / 8相当于 X >> 3,即把X右移3位,此时得到了X / 8的商,而被移掉的部分(后三位),则是X % 8,也就是余数;
2.其实,使用位运算代替取模运算,除了性能之外,还有一个好处就是可以很好的解决负数的问题。因为我们知道,hashcode的结果是int类型,而int的取值范围是-2^31 ~ 2^31 – 1,
即[ -2147483648, 2147483647];这里面是包含负数的,我们知道,对于一个负数取模还是有些麻烦的。如果使用二进制的位运算的话就可以很好的避免这个问题。首先,不管hashcode的值是正数还是负数。
length-1这个值一定是个正数。那么,他的二进制的第一位一定是0(有符号数用最高位作为符号位,“0”代表“+”,“1”代表“-”),
这样里两个数做按位与运算之后,第一位一定是个0,也就是,得到的结果一定是个正数
单例模式:1.懒汉 2.饿汉 3.静态工厂getInstance加synchronized
4.静态工厂/双重==null检查加锁,volatile static修饰instance防止指令重排序
5.static{代码块初始化instance} 6.枚举类型,构造方法初始化instance,保证只加载一次
这样里两个数做按位与运算之后,第一位一定是个0,也就是,得到的结果一定是个正数模式
这样里两个数做按位与运算之后,第一位一定是个0,也就是,得到的结果一定是个正数
电子书:https://www.itpanda.net/book/
docker网络模型:1.Bridge:主机利用虚拟网桥/虚拟网卡分配 2.Host:与主机共享网络network namespace,但文件系统等依然隔离;
3.Container:与其他容器共享网络network namespace,但不共享文件系统等;
4.None:主机不分配,用户手动分配;
Kubernetes的网络模型组成
1.Pod内部docker容器之间网络通信[基础docker网络理论]
2.Pod所在的网络之间通信[基础docker网络理论]:通过etcd(类似zookeeper)收集node之间的网络信息
3.Pod和Service之间网络通信[Kubernetes网络理论]
4.外界与Service之间网络通信[Kubernetes网络理论]
时序数据库:InfluxDB(+grafana可用于k8s可视化)
TCP:seq number ack滑动窗口(HTTP2.0概念)
握手(SYN-ACK可以一起,所以三次握手);
挥手(FIN只能单独发送,确认没有消息互发了,之后三次挥手断开连接)
Spring如何实现AOP?,您可以这样说:
AnnotationAwareAspectJAutoProxyCreator是AOP核心处理类
AnnotationAwareAspectJAutoProxyCreator实现了BeanProcessor,其中postProcessAfterInitialization是核心方法。
核心实现分为2步
getAdvicesAndAdvisorsForBean获取当前bean匹配的增强器 createProxy为当前bean创建代理
getAdvicesAndAdvisorsForBean核心逻辑如下
a. 找所有增强器,也就是所有@Aspect注解的Bean
b. 找匹配的增强器,也就是根据@Before,@After等注解上的表达式,与当前bean进行匹配,暴露匹配上的。
c. 对匹配的增强器进行扩展和排序,就是按照@Order或者PriorityOrdered的getOrder的数据值进行排序,越小的越靠前。
createProxy有2种创建方法,JDK代理或CGLIB
a. 如果设置了proxyTargetClass=true,一定是CGLIB代理
b. 如果proxyTargetClass=false,目标对象实现了接口,走JDK代理
c. 如果没有实现接口,走CGLIB代理
linux虚拟网络设备(TUN/TAP)
CMS和g1区别:
1.CMS采用标记清除,会产生内存碎片,故只用于老年代
2.G1采用标记-整理,可预测性强,不会产生内存碎片,g1不针对整个新生代或老年代,而是将堆分为一块块大小相同的Region(地址连续的内存空间)
根集合(记忆集);卡表(脏卡标记GC Roots,老年代对年轻代的引用));
https://www.cnblogs.com/heyonggang/p/11718170.html
iproute工具包取代net-tools下的ifconfig,route,ifup,ifdown,netstat等命令
java四种引用:1.强引用:new对象和string复制,gc不可回收,会抛出oom,要使其可回收可设其为null;
2.SoftReference:当内存不足时可回收,SoftReference ref=new SoftReference(aMyObject, ReferencQueue);
-->如果队列为空,将返回一个null,否则该方法返回队列中前面的一个Reference对象;
3.WeakReference:无论内存充足与否都会被回收;
4.虚引用(PhantomReference)
CORS请求:请求头多了origin字段,
-->服务端返回Access-Control-Allow-Origin: http://api.bob.com
Access-Control-Allow-Credentials: true
Access-Control-Expose-Headers: FooBar
Content-Type: text/html; charset=utf-8
-->JSONP只支持Get请求,可兼容老式浏览器
Vue/React虚拟dom:diff算法(比较new和old的差异,js原生构建dom太耗性能),只比较同层级,先比较父再比较child
js模块化:
<script src="js/require.js" defer async="true" ></script>
async属性表明这个文件需要异步加载,避免网页失去响应。IE不支持这个属性,只支持defer,所以把defer也写上。
Flux 的最大特点,就是数据的"单向流动"。
-->用户访问 View
View 发出用户的 Action
Dispatcher 收到 Action,要求 Store 进行相应的更新
Store 更新后,发出一个"change"事件
View 收到"change"事件后,更新页面
IO设计模式:Actor、Reactor、Proactor;
Storm(): spout(水龙头)-tuple(元数组)-> Bolt(处理) -tuple-> Bolt(另一个) ->---流数据无限处理中..
zookeeper:Nimbus(主) Supervisor(从;以Topology(包含多个进程)处理)
TF-IDF与余弦相似性的应用(词频,权重):1.自动提取关键词 2.找出相似文章 http://www.ruanyifeng.com/blog/2013/03/tf-idf.html
dp:空间换时间 dp自下而上 状态转移方程 记录上一步 避免无状态递归;
-->https://juejin.im/post/5dcb8201e51d45210f046f5a . https://mp.weixin.qq.com/s/mJ_jZZoak7uhItNgnfmZvQ