赞
踩
部分参考资料为https://www.nowcoder.com/tutorial/94/
持续更新中
是一种单独的数据库结构,可以在创建时或者是创建后来创建数据库表的索引,索引可以提高相关的查询速度。
索引可以分为唯一索引和普通索引、单一索引和组合索引、全文索引和空间索引。
组合索引的生效方式按照最左前缀方式生效。
大量的表索引不仅会占用磁盘空间,还会影响insert、delete与update等语句的性能。
不适合创建索引的情况:
MyISAM和InnoDB两种数据库引擎都是使用的B+树格式当作数据库索引结构,但是具体实现方式不一样。 (MEMORY和HEAP引擎可以使用HASH或者BTREE索引)
InnoDB是使用主键作为主索引,整个数据文件就是按照B+树的格式来进行组织的。
MyISAM可以没有主键,数据文件和索引文件是分离的。
回表
数据库查询语句中找到对应行号后再到原数据表中取出对应数据的过程。
| 脏读 | 不可重复读 | 幻读 | |
|---|---|---|---|
| READ UNCOMMITTED 读未提交 | 可能 | 可能 | 可能 |
| READ COMMITTED 读提交 | 不可能 | 可能 | 可能 |
| REPEATABLE READ 可重复读 | 不可能 | 不可能 | 可能 |
| SERIALIZABLE 串行化 | 不可能 | 不可能 | 不可能 |
行级锁
表级锁
死锁:事务互相等待无法推进,解决办法是超时机制以及等待图(wait-for graph)的死锁检测。
查询优化
插入优化
禁用索引
禁用唯一性检查
使用批量插入
LOAD DATA INFILE语句
对于InnoDB引擎的数据库表
大规模数据表的优化
慢查询优化
explain和describe语句用来分析查询语句的执行情况
TCP协议
HTTP协议
https协议
FTP协议
DNS协议
IP协议
域名解析成ip的过程
IP地址、子网掩码、网关
IP寻址
ps 查看想知道的进程信息
# 参数
-A #显示当前所有进程
-aux #查看进程状态
top 查看进程运行状态、内存使用情况
cat 查看文件内容
grep 全局正则表达式搜素。过滤关键词,与前面的命令结合管道使用可以查看到对应的关键信息。
# 参数
-A n --after-context #显示匹配字符后n行
-B n --before-context #显示匹配字符前n行
-C n --context #显示匹配字符前后n行
-c --count #计算符合样式的列数
-i #忽略大小写
-l #只列出文件内容符合指定的样式的文件名称
-f #从文件中读取关键词
-n #显示匹配内容的所在文件中行数
-R #递归查找文件夹
...
hostname 修改主机名
开机自启动
free 查看内存使用情况
-m #以MB为单位显示
-s<间隔秒数> #持续观察内存使用情况
tar
tar -zxvf #提取文件
tar -zcvf #压缩文件
netstat 查询连接数
ps -ef | grep 进程名 # 查看进程pid
netstat -nap | grep 进程id # 查看进程对应的端口信息
netstat -nap | grep 端口号 # 查看该端口对应的进程信息
ping
ICMP协议
kill 命令 根据PID删除进程。
进程与线程
进程间的通信机制
进程的状态
进程(线程)的非抢占式调用和抢占式调用
僵尸进程和孤儿进程
协程是微线程,在子程序内部执行,可在子程序内部中断,转而执行别的子程序,在适当的时候再返回来接着执行。
悲观锁 只要有访问操作都上锁,无论是否发生了并发竞争
乐观锁 访问时如果发生了数据修改再上锁
自旋锁 获取锁失败时会进行自旋操作,轮询获取锁状态,不会阻塞
公平锁 按照先来先到的原则竞争锁就是公平锁
非公平锁 不按照原则竞争资源
共享锁 一般用于读操作
死锁 两个进程互相等待从而都阻塞的一种情况,可以使用等待超时方式进行解决。
select 无差别轮询所有流
poll 无差别轮询,但使用链表存储数据,无最大连接数限制
epoll event poll 事件触发,与文件描述符(FD)关联 ,数据结构为红黑树加双向链表,红黑树存放对应的fd索引结构,双向链表存放回调函数相关,两个数据结构分别对应,且可以快速的插入、删除和查找。
对文件描述符的操作有两种形式
同时以及该多路复用方式的数据结构是什么样的,用什么形式来存储
存储介质
虚拟内存
抽象了应用程序物理内存的细节,将物理内存映射到虚拟内存页中。
由操作系统的页表来保存映射关系,层级最低的页表存放实际页面的物理地址,然后高层级的页表包含指向低层级页表的物理地址。指向顶级的页表的地址存在寄存器中,当发生地址索引时先依次索引,然后找到具体的物理地址。
大页机制 由于内存访问速度较慢,如果逐级查询物理地址就会很慢,所以直接将虚拟地址和物理地址的对应关系存入TLB地址转换cache(快表)中,这样如果能直接从TLB中获取到对应的物理地址,就可以大大提高速度。而如果TLB的命中率降低会很大程度上影响大内存工作集的应用程序,因此往往在分页时增加页的大小,这样存放地址的页表就能变小,TLB能存放的内容就会变多,提高TLB的命中率。
虚拟内存模型
页面置换算法
下面这部分参考自https://blog.csdn.net/sunxianghuang/article/details/51883496
内核
外壳
用户态切换到内核态:
设计模式的部分另外还参考了http://c.biancheng.net/view/1317.html
默认值
包装类
三大核心特性
volatile
synchornized
lock是一个类或者说一个接口
实现方法 参考 https://blog.csdn.net/king_kgh/article/details/78213576
继承Thread类
实现Runnable接口
class Test implements Runnable{ @override void run(){}}
Test test=new Test();
new Thread(test).start();
Runnable task = () -> {
while (true) {
// 输出线程的名字
printThreadInfo();
}
};
// 创建线程对象,并将线程任务类作为构造方法参数传入
new Thread(task).start();
使用内部类
// 基于子类的方式 new Thread() { @Override public void run() { while (true) { printThreadInfo(); } } }.start(); // 基于接口的实现 new Thread(new Runnable() { @Override public void run() { while (true) { printThreadInfo(); } } }).start()
Runnable task = () -> {
while (true) {
// 输出线程的名字
printThreadInfo();
}
};
// 创建线程对象,并将线程任务类作为构造方法参数传入
new Thread(task).start();
使用定时器Timer
通过Callable接口,可实现异常抛出和接受返回值
// 创建线程任务 这里的泛型是指该函数对应的返回值类型(此处为Integer) Callable<Integer> call = () -> { System.out.println("线程任务开始执行了...."); Thread.sleep(2000); return 1; }; // 将任务封装为FutureTask FutureTask<Integer> task = new FutureTask<>(call); // 开启线程,执行线程任务 new Thread(task).start(); // 为所欲为完毕之后,拿到线程的执行结果 Integer result = task.get(); System.out.println("主线程中拿到异步任务执行的结果为:" + result);
基于线程池
JVM由四大部分组成

jdk、jre
jdk是java开发工具包,包括了java开发编译调试环境和java运行环境
jre是java运行环境,只是负责运行,包括java虚拟机环境、java平台核心类、支持文件等
jvm启动过程
java程序运行

java代码编译过程 略
类加载过程
类加载器
通过一个类的全限定名来获取描述该类的二进制字节流
JVM垃圾回收
垃圾回收关注的内存区域主要是堆区域和方法区内存,这块区域有较大的不确定性。
对垃圾的定位
对方法区的回收
垃圾回收方法
完整GC流程
内存泄漏和内存溢出
内存泄漏:指程序运行过程中分配内存给临时变量,但是用完之后却没有被GC回收,始终占用着内存,既不能被使用也不能分配给其他程序使用,于是就发生了内存泄漏。
可能的内存泄露场景
内存泄漏解决方法
内存溢出:指程序运行过程中申请的内存大于系统能够提供的内存,导致无法申请到足够的内存,于是就发生了内存溢出。
反射
在运行过程中获取类的所有属性和方法,包括类类型
委托
类似与函数指针,java中没有该概念,可以借用反射进行实现。
代码块 {}
局部代码块
构造代码块
同步代码块
静态代码块
执行顺序
父类静态块->子类静态块->父类代码块->父类构造器->子类代码块->子类构造器
IOC(Inversion of Control) 控制反转
DI(Dependency Injection) 依赖注入
AOP(Aspect Oriented Programming) 面向切面编程
Bean 需要进行管理的对象
IOC容器,一定要继承BeanFactory接口,其中定义了一些获取Bean对象的接口
@Configuration 代表这是一个java配置文件,根据它来生成IOC容器并装配Bean
@Bean 将被注释的方法返回的对象装配到IOC容器中进行管理,可以用于数据库连接的建立等场景
@Component 通过扫描装配Bean,结合@Value来定义每个属性的初始值,而不需要去逐个使用@Bean来实现
@ComponentScan 标注扫描装配的策略,例如扫描的包的范围,哪些类需要不被装配,哪些类需要被装配,是否延迟初始化等
@AutoWired 需要注入的参数的注解
@Value 可以修饰属性、也可以修饰方法
@ConfigurationProperties 可以直接把属性文件中的某个字段下属的所有内容都读取到类中同名属性中
@PropertySource 修饰主启动类,可以定义待加载的属性文件名
@Transactional 修饰方法,表明该方法需要事务运行,能自动的实现数据库资源的打开和关闭以及事务的回滚和提交(AOP)
@Aspect 定义切面
@Entity 声明一个实例对象,用于后续的jpa映射
@Alias Mybatis指定pojo别名
jdbc
主要是通过JdbcTemplate对象的自动注入,然后自己编写sql语句以及对结果集的对应。
JPA(Hibernate)
MyBatis
事务操作
NoSql
Redis
基本命令
基本数据类型
docker与虚拟机的区别,优势
docker利用namespace进行系统环境隔离,利用cgroup实现资源的隔离限制,利用容器镜像rootfs实现根目录文件的隔离
基础数据类型及大小
| 类型 | 64位(byte) | 32位(byte) |
|---|---|---|
| char | 1 | 1 |
| char* | 8 | 4 |
| short int | 2 | 2 |
| int | 4 | 4 |
| long | 8 | 4 |
| long long | 8 | 8 |
| float | 4 | 4 |
| double | 8 | 8 |
union 联合
模板 template
迭代器
面向对象
虚函数和纯虚函数 virtual关键字
虚函数可以在子类中不定义,而纯虚函数则必须在子类中进行定义
多态
构造函数与析构函数
常函数,在函数后使用const修饰,只能访问数据成员,而不能修改,常量对象也只能调用常函数。
面向对象三大基本特征
内联函数、宏定义的定义,区别以及各自的优缺点和适用场景
C++程序的内存分布
内存对齐
auto关键字
auto a=10;自动类型推导 在变量声明时必须初始化
decltype关键字
decltype(1+2.0) b=2.2; 根据1+2.0的表达式结果的值推导b的类型,在声明时可以不用初始化
智能指针
Lambda函数
生命周期
activity之间的导航
startActivity 不期望获取返回值
startActivityForResult 期望获取返回值
Intent对象 指定目标activity以及操作类型,并且可以携带少量数据
生命周期回调的顺序已有明确定义,特别是当两个 Activity 在同一个进程(应用)中,并且其中一个要启动另一个时。以下是 Activity A 启动 Activity B 时的操作发生顺序:
activity的调用关系
优点
一般在activity/fragment中的onCreate方法中创建绑定
5种核心的数据类型,分别是字符串、哈希、列表(List)、集合(set,元素上限为2^32-1)、有序集合(zset)
Bitmap、HyperLogLog、Geo类型,这些类型都是基于上述核心数据类型实现
Streams数据类型,它是一个功能强大的、支持多播的、可持久化的消息队列
底层存储数据结构
watch
List操作命令
sexnx 加锁命令
set key value nx key seconds #设置锁key值为value,过期时间为second
# 通过观测这个key值来知道此时有没有锁上,从而达到实现分布式锁的目的
del key #删除锁
randomkey 随机返回一个未过期的key
主从架构
master
|_slave 从节点为主节点备份,主节点的数据修改会同步到从节点中,如果主节点宕机,则会做主从切换
|_slave
哨兵架构
client
|
|
哨兵集群 ---------主从结构
|——哨兵节点
|——哨兵节点
客户端通过哨兵集群去访问redis的主从架构,哨兵集群中监听着每台redis节点的状态,如果master节点故障,会由哨兵集群进行主从切换
集群架构

6.0之前,所有的网络IO和键值读写都是一个线程
6.0之后,键值读写是一个线程、但是网络IO这块引入了多线程,但关键的键值读写还是单线程顺序执行,所以依旧是并发线程安全的
单线程却快的原因
RDB持久化
AOF持久化
RDB-AOF混合持久化
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。