无题
随笔
id 不重要: 查询的序列号
select_type 不重要:查询类型:例子:SIMPLE:简单的select不使用union或子查询
table 不重要:表明
type 重要 :
const :最多只有一行记录匹配,当联合主键或唯一索引的所有字段跟常量值比较时,join类型为const。其他数据库也叫做唯一索引扫描
eq_ref / ref :相对于下面的ref区别就是它使用的唯一索引,即主键或唯一索引,而ref使用的是非唯一索引或者普通索引。
fulltext: 理解为效率较差但优先级高,若全文索引和普通索引同时存在时,mysql不管代价,优先选择使用全文索引。全文索引的优先级很高
range: 索引范围查询,常见于使用 =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, IN()或者like等运算符的查询中。
index: 索引全表扫描,把索引从头到尾扫一遍
all : 全表扫描
key:真正用到的索引
key_len : 查询用到的索 ...
Hello World
Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.
Quick StartCreate a new post1$ hexo new "My New Post"
More info: Writing
Run server1$ hexo server
More info: Server
Generate static files1$ hexo generate
More info: Generating
Deploy to remote sites1$ hexo deploy
More info: Deployment
动态规划-背包问题
— 第一次整理:公式
0-1 背包问题:给你一个可装载重量为 W 的背包和 N 个物品,每个物品有重量和价值两个属性。其中第 i 个物品的重量为 wt[i],价值为 val[i]。现在让你用这个背包装物品,每个物品只能用一次,在不超过被包容量的前提下,最多能装的价值是多少?
状态:「背包的容量」和「可选择的物品」
选择: 「装进背包」或者「不装进背包」1234for 状态1 in 状态1的所有取值: for 状态2 in 状态2的所有取值: for ... dp[状态1][状态2][...] = 择优(选择1,选择2...)
如果你没有把这第 i 个物品装入背包,那么很显然,最大价值 dp[i][w] 应该等于 dp[i-1][w],继承之前的结果。 如果你把这第 i 个物品装入了背包,那么 dp[i][w] 应该等于 val[i-1] + dp[i-1][w - wt[i-1]]。
dp[i][w] 表示:对于前 i 个物品(从 1 开始计数),当前背包的容量为 w 时,这种情况下可以装下的最大价值是 dp[i][w]。
首先,由于数组索引从 0 开始,而我 ...
排序相关
排序相关1选择排序算法步骤
12345678910111213141516171819private static void selectSort(int[] a) { for (int i = 0; i < a.length-1; i++) { // 这个地方的标志位含义是后面哪一个比当前这个小,把这个后面的标志位置记录出来 int num = i; for (int j = i+1; j < a.length; j++) { // 排序这里<length是因为要比较到最后,前面<-1是因为最后一个不用拿出来再做比较 if (a[j] < a[num]) { // 比当前的小就是要交换的,找出最小的那个 num = j; } } if (num != i){ int ...
接雨水
暴力解法
将此节点左右两个最高峰找到,如果都比自己小则为自己两个最高峰中最小的那个才是自己能装的最大的水将自己的峰减去即可
12345678910111213141516int trap(int[] height) { int n = height.length; int res = 0; for (int i = 0; i < n-1; i++) { int l_max = 0; int r_max = 0; for (int j = i; j < n; j++) { r_max = Math.max(r_max, height[j]); } for (int j = i; j >=0 ; j--) { l_max = Math.max(l_max, height[j]); } res += Math.min(r_max, l_max) - heig ...
AQS学习
AQS学习AQS 的全称为 AbstractQueuedSynchronizer
AQS是是一个抽象类,主要用来构建锁和同步器。后续在锁里会大量用到
ReentrantLock,Semaphore,其他的诸如 ReentrantReadWriteLock,SynchronousQueue等等皆是基于 AQS 的
1public abstract class AbstractQueuedSynchronizer extends AbstractOwnableSynchronizer implements java.io.Serializable {}
AQS原理:如果被请求的资源空闲,则将当前线程设置为有效的工作线程,并将请求的共享资源设置为占用状态,但是若资源处于被占用的状态,那么就需要一套机制来实现等待和唤醒的操作,AQS就是使用CLH队列来实现(虚拟双向队列):将每一个请求资源的线程封装成一个队列节点
它 ...
java内存模型
JMM:java内存模型jvm/jmm: 前者是jvm内存模型;后者是java内存模型背景: 由于处理器的运算速度与存储设备的运算速度之差距引出了: 基于高速缓存的存储交互很好的解决了处理器和内存的速度矛盾, 再引出了:但是为计算器引入了一个新的问题:缓存一致性(每个处理器都有自己的的高速缓存,但是又公用同一主内存)为了解决上述问题,提出内存模型(多个处理器 -> 高速缓存) ->(一致性协议) -> (主内存)
作用:内存模型(JMM):用来屏蔽java对各种硬件和操作系统的内存访问差异,以实现java程序在各个平台下都能达到一致性的内存访问效果主要目标:定义程序中的各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节(需要注意的是这里的变量:包含着实例字段。静态字段,构成数组对象的元素,不包含局部变量,因为局部变量是线程私有,不存在共享,不存在竞争问题)
内存模型的相关的操作和规则
通过规定变量的使用,通过线程,主内存,工作内存三者之间的交互来使用变量
所有变量都在主内存
线程对变量的操作必须在工作内存中进 ...
Netty学习
Netty 架构按照 Reactor 模式设计和实现,它的服务端通信序列图如下:
具体场景问题:当服务端收到3个I/O请求时,在具体情况下的处理流程如下:
Reactor Thread(反应器线程):
主线程(通常是Reactor Thread)会监听这3个I/O请求,而不会阻塞在单个请求上。
主线程会将这3个请求注册到相应的Selector上,并开始轮询Selector以检测是否有I/O事件发生。
I/O事件就绪:
当某个I/O请求就绪时,主线程的Selector会检测到该请求,并将其标记为就绪状态。
在具体情况下,假设第一个请求就绪,而其他两个尚未就绪。
IOHandler处理:
主线程会触发相应的IOHandler处理就绪的I/O请求。
在这种情况下,IOHandler会处理第一个就绪的请求,执行相应的操作,例如读取数据、写入数据等。
业务线程池处理:
如果IOHandler判断第一个请求的业务逻辑较为复杂或耗时较长,它可以选择将任务转发到业务线程池中进行处理。
在这种情况下,业务线程池会创建一个线程来处理 ...