CS学习记录
2024-02-25 16:20:08 1 举报
AI智能生成
登录查看完整内容
计算机科学学习记录
作者其他创作
大纲/内容
为了知识共享而规划的web
WWW
HTML
URL
Web的成长时代
HTTP诞生背景
0.9
1.0
1.1
2.0
HTTP版本
解析Mac地址的协议
根据IP查询Mac地址
ARP协议
通过路由来将数据传输到目的机器
IP
确保可靠性的传输
Synchronize:同步的
发送一个需要响应的数据包
1.发送端发送代Synchronize标志的数据包
Acknowledgement:告知收到
给发送端响应已收到,接收方还要发送一个发送发送方确认收到的响应
2.接收端收到数据后,回传一个代Synchronize和Acknowledgement标志
3.发送端收到接收方的响应,从响应中得知还要发送确认收到的数据包
通过三次握手策略来确保数据能达到目的地
TCP
提供域名到IP地址的解析
代替IP地址来访问主机
容易记住
IP不容易记住
域名
DNS
相关的协议
HTTP
HTTPS
网络基础
概念
如何探测到通信目标
由哪一遍发起通信
使用哪种语言通信
怎么结束通信
不同硬件、操作系统之间的通信
计算网络设备要相互通信,双方就必须基于相同的方法
通信的规则就称为协议
根据不同用途产生了各种协议
协议
TCP/IP协议族
应用通过什么规则传输
向用户提供应用服务时通信的活动
作用
FTP
应用层
联网计算机间数据传输
为上层:应用层,提供处于网络连接中的两台计算机之间的数据传输
传输控制协议
用户数据报文协议
UDP
传输层
网络互连层
处理网络上流动的数据包
数据包是网络传输的最小数据单位
规定了数据包到达目标计算机的路径
网络层
数据链路层
处理网络连接的硬件部分
控制操作系统、硬件的设备驱动、NIC(网络适配器,网卡)及光纤
链路层
4层
方便更新各层的实现:HTTP协议版本从1.0升级到2.0,不需要把整个协议都改掉
就像面向接口编程,我们只要设计接口,不需要关心具体实现
好处
分层管理
发送方从应用层往下走,接收方则往应用层往上走
生成HTTP报文
客户端请求一个Web页面,应用层生成一个HTTP报文,转发给传输层
生成TCP报文
为了方便传输,传输层(TCP)把HTTP报文进行分割,并在各个报文上标记序号及端口号,转发给网络层
生成IP报文
在网络层(IP协议),添加通信目的地的mac地址,生成IP数据包,转发给链路层
各层数据包通过封装进行传输
HTTP实例
通信流程
TCP/IP
计算机网络
待排序的记录存放在计算机随机存储器中进行的排序过程
基本操作是将一个记录插入到已排好序的有序表中,从而得到一个新的、记录数增1的有序表
子主题
实现
直接插入排序
折半插入排序
2-路插入排序
希尔排序
分类
插入排序
起泡排序
快速排序
交换排序
简单选择排序
树形选择排序
堆排序
选择排序
归并排序
计数排序
按原则
简单排序
先进排序
基数排序
按工作量
比较大小
将记录从一个位置移至另一个位置
排序基本操作
数组
默认存储方式
存放在连续的一组存储单元上
排序过程中,只是改变记录之间的次序关系,而不进行插入、删除操作,且在排序结束时尚需调整记录,故采用静态链表
静态链表
待排序记录存储在一组地址连续的存储单元内,同时另外设一个只是各个记录存储位置的地址向量,在排序过程中不移动记录本身,而是移动地址向量中这些记录的地址,在排序结束后在按照地址向量中的值调整记录的存储位置
待排序记录的存储方式
内部排序
待排序记录的数据量很大,以至内存一次不能容纳全部记录,在排序过程中尚需对外存进行访问的排序过程
外部排序
排序
O(n)遍历
转换成有序数组
数组无序
二分查找
数组有序
数组的查找
查找
O(1):常量个空间
O(n):随着数据规模变化的空间
性能指标取值
空间消耗
平均时间复杂度
最差时间复杂度
如何确定?
稳定性
性能指标
性能
算法
将待插入的节点next指向头节点的next
将头节点指向新插入的节点
头插法
将尾节点指向头节点
将尾节点的next指向待插入的节点
将尾节点指向待插入的节点
尾插法
创建
长度
插入
删除
操作
单链表
循环链表
双链表
链表
结点
节点还是结点?
n个结点的有限集
有且仅有一个根结点
各节点有各自的子结点,且结点不会存在相交的子结点
定义
结点的直接孩子结点个数
结点的度
双亲
孩子
兄弟
结点的度为0
叶子
根结点为1,根结点的子结点为2,依次类推
层次
几代人的意思
树的的最大层次
树深度
术语
多棵不相交树的集合
森林
扩展
子树有左右之分,顺序不能任意颠倒
特点
第1层至多拥有2的0次方个结点,即1个根结点
第2层至多有2的1次方个结点,即至多2个结点
依次,1,2,4,8,2的指数
第i层上至有多2的i-1次方个结点
等比数列求和的应用
即各层至多的结点数之和:1+2+4+8+...+2的i-1次方
深度为k的二叉树至多有2的k次方减1个结点
叶子结点数n0比度为2的结点数n2多1,即n0=n2+1
性质
除叶子结点外,其他结点的子节点数都为2
满二叉树
叶子结点只能出现在最大的两层上
各结点的左子树深度和右子树的深度不大于1
n个节点完全二叉树深度为不大于以2为底n的对数+1
等等...
完全二叉树
又称二叉查找树
各结点的左子树的值比结点的值小
各结点的右子树的值比结点的值大
特性
二叉排序树
自动平衡的二叉树
AVL树
各结点的左子树的深度与右子树的深度差值不能超过1
自动平衡的完全二叉树
平衡二叉树
特殊分类
遍历二叉树
线索二叉树
特性总结
二叉树转化成数组或链表
数组或链表转二叉树
二叉树与线性序列互转
个人理解
表达式计算
SQL解析树
用于内存查找
应用
二叉树
树是存在顺序的
查找树或排序树
是一种平衡的多路查找树
结点最大直接结点个数
树的度
树的阶
文件系统
各节点至多有m颗子树
若根结点不是叶子结点,则至少有两颗子树
除根结点外的所有非终端(叶子)结点至少有 m/2向上取整 颗子树
所有非终端(叶子)结点中包含n个按关键字有序的元素及指向子节点的指针
所有叶子结点都出现在同一层上,并且不带任何信息
m阶B-树的特性
m阶B-树的特性自我理解
B-树
B-树的变型
有n个子树的结点中包含n个关键字
所有叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子结点本身依据关键字的大小自小而大顺序链接
所有的非终端结点可以看成是索引部分,结点中仅含有其子树中的最大(或最小)关键字
m阶B+树的特性
不大于k1的指针指向子树,该子树的关键都比k1小或等于
不大于k3的指针指向的子树,该子树的所有关键字的都不大于k3
m个关键字就有m个子树
结点中关键字是有序的
非叶子结点只存关键字不存具体的元素
叶子结点存数据,且所有叶子结点都是相连的,
叶子结点存放所有的元素
m阶B+树的特性自我理解
根据n个字段创建的索引,即为n阶B+树
MySQL应用理解
B+树
特性分类
树
根据哈希函数算出字典地址
直接定址法
数字分析法
平方取中法
折叠法
用的比较多
除留余数法
随机数
哈希函数
开放地址法
再哈希法
链地址法
解决哈希冲突
哈希表
数据结构
好的章节
西北大学——数据结构
二叉树的遍历
北京大学——数据结构与算法
二叉树的构建
中国人民解放军陆军工程大学——数据结构
教程
栈
队列
递归
非递归
先序
中序
后序
广度优先遍历(BFS)
层序遍历
深度优先遍历(DFS)
遍历
重建二叉树
深度
宽度
小结
数据结构与算法
数据库系统(下):管理与技术
参考
索引字段
行指针
索引项
索引文件
主文件
一般性特点
关于索引应用的评价
关于索引相关的概念含义的区分
什么是索引及为什么需要索引
基本知识
创建和维护索引的SQL语句
索引应用需要注意效果
SQL语言中的索引创建与维护
稠密索引
稀疏索引
稀疏索引如何定位记录
稠密索引如何定位记录
稠密索引和稀疏索引
主索引
辅助索引
主索引vs.辅助索引
主索引与辅助索引
聚簇索引
非聚簇索引
聚簇索引和非聚簇索引
正排
倒排
倒排索引
B树
常见形式
多级索引
多属性索引
一般散列索引
可扩展散列索引
线性散列索引
散列索引
网格索引
其他结构的索引
其他类型的索引
索引字段值
指向索引块或数据块或数据块中记录的指针
指针
组成
索引字段值和指针间隔存储,以索引字段值开始,以索引字段值结束
指针数量比索引字段值少1
一块中索引项的组织
B+树索引
B+树的基本概念
一块中存放多少个索引项(n的大小)?
非叶子节点指针指向索引块,叶节点指针指向主文件的数据块或数据记录
叶节点的最后一个指针可能不同于他的其他指针——始终指向其下一个数据块
叶节点和非叶节点的指针指向什么?
索引字段值重复出现于叶节点和非叶节点
指向主文件的指针仅出现于叶节点
所有叶节点即可覆盖所有键值的索引
索引字段值在叶结点中是按顺序排列的
级数(层数)相同——平衡
插入/删除记录时,伴随着结点的分裂与合并
分裂与合并将调整部分结点块中的索引项
B+树的存储约定
用B+树建立键属性稠密索引
用B+树建立稀疏索引(或主索引)
用B+树建立非键属性稠密索引
用B+树建立不同的索引
索引字段值仅在出现一次或者在叶结点或者非叶结点
指向主文件的指针出现于叶节点或非叶结点
所有结点才能覆盖所有键值的索引
B Tree
一块中存放的索引项个数是否相同?
索引字段值都出现在哪里?
指向主文件的指针存在哪里?
分裂与合并的方法是否一致?
B+ Tree 示例
B Tree示例
B+树 vs. B树
如何利用B+树进行检索?
如何利用B+树进行增加和删除操作?
B+树的增加和删除操作时如何进行分裂和合并?
什么条件下分裂与合并?
分裂与合并时如何调整B+树的指针?
B+树还要考虑什么
散列
基本概念
散列索引的插入和删除
散列的问题
拟解决的问题
基本思想
操作示例
回归操作特点
索引
B+Tree索引
回顾
数据库系统
交集
并集
交差集
连接类型
inner join
full outer join
left outer join
标准的
right outer join
mysql实现的
通过left join 和 IS NULL来实现
计算出只在左表出现的
通过left join和 is null来实现
计算只在右表出现的记录
join
一组原子性的SQL查询
automicity
事务是不可分割的最小单元
原子性
consistency
从一个一致性状态转变成另一个一致性状态
不会导致数据丢失,如转账不会导致钱凭空消失
一致性
isolation
一个事物所做的修改在提交前,对其他事务是不可见的
隔离性
durability
一旦事务提交,所做的修改就会永久保存到数据库中
持久性
ACID
可以读取到其他事物未提交修改
脏读
同一事务中多次读取相同的记录可能结果不同
不可重复读
同一事务多次中读取范围内记录可能结果不同
幻读
事务读取存在的问题
存在的问题
read uncommitted
未提交读
解决的问题
read committed
提交读
repeatable read
可重复读
serializable
可串行化
隔离级别
多版本控制
悲观锁
乐观锁和悲观锁
事务
from 后面跟上多个表
多表查询
多表查询=full join || join
多表查询和连接查询的区别
问题小结
SQL
存不存在幻读?
默认隔离级别
InnoDB
MyISAM
Memory
存储引擎
覆盖索引
MySQL
数据库
缓存算法
死锁的四个条件
操作系统
MVC
MVVP
架构模式
并发理论
基础
画图让抽象问题形象化
举例让抽象问题具体化
分解让复杂问题简单化
解决面试题的思路
清晰的书写
清晰的布局
合理的命名
代码的规范性
代码的完整性
高质量的代码
理论
代码比较简洁,性能不如循环
性能比较好
循环
递归 vs. 循环
3. 数组中重复的数字
4. 二维数组中的查找
5. 替换空格
面试题
剑指offer
算法题
1、判断哈希表是否为空,是空的话先初始化哈希表
不存在的话就创建一个单链表结点存放该键值对
键相同时,就把原结点取出,并将该结点的换成新值的单链表结点,并返回旧值
是红黑树结点的话,将键值对存入相应的树结点
键存在的话就取出旧结点,返回旧值,新值
键不存在,新建单链表结点链接到到链表尾结点,并判断该链表的结点数量是否达到链表转换成树的阈值了,是的话将该链表转换成很黑树存储
不是红黑树结点,遍历链表,判断键是否存在
元素加入后,判断map中键值对个数是否达到元素数量的阈值,达到的话就rehash一次
键不相同时,即产生哈希冲突,判断当前结点是否是红黑树结点
存在的话就判断已有结点的键是否是相同
2、根据key算出该key在哈希表中存放的位子下标,判断该位置上是否存在结点,
put一个键值对的过程
HashMap
Map
集合
是在运行状态下,对于任意一个类,都能够知道这个类的所有属性和方法,能够获取任意属性的值、调用任意方法
类名.class
Class.forName(\"java.lang.String\")
new String().getClass()
instance.getClass()
获取Class对象三种方法
Class.getDeclareMethods
Class.getDeclareMethod
获取Method方法
Class.getDeclaredField
获取Field方法
Class.getDeclaredAnnotation***
Class.getAnnotation***
获取类上的注解
只返回public修饰的
get***()
返回所有的
getDeclared**()
get**() 和 getDeclared**()的区别
问题
Class
Method.setAccessible(true)
设置方法可访问性
Method.invoke(instance)
调用方法
getAnnotation
getDeclaredAnnotations
获取方法上的注解
Method
Field.setAccessible(true)
设置属性的可访问性
设置对象属性的值
Field.get(instance)
获取对象属性的值
获取类属性上的注解
Field
相关类
访问公有属性(public)
访问私有属性(private)
访问类的的所有属性
访问公有方法(public)
访问私有方法(private)
访问类的所有方法
类名
类修饰符
包信息
父类
实现接口
构造方法,方法和字段
系统教程
反射
用@interface声明一个注解
添加@Target注解指定作用目标:类,属性,方法...
添加@Retention注解指定保留策略
添加@Documented注解
自定义注解
注解解析及作用
注解
动态代理
反射与注解
BufferedInputStream
DataInputStream
ObjectInputStream
PushBackInputStream
FilterInputStream
ByteArrayInputStream
InputStream
输入
BufferedOutPutStream
ByteArrayOutputStream
ObjectOutPutStream
FilteroutoutStream
PipedOutPutStream
FileOutputStream
DataOutputStream
OutputStream
输出
字节流
BufferedReader
CharArrayReader
FilterReader
PipedReader
InputStreamReader
StringReader
Reader
BufferedWriter
CharArrayWriter
StringWriter
FilterWriter
PipedWriter
PrintWriter
OutputStreamWriter
Writer
字符流
通过减少对本机API的调用次数来优化输入和输出。
Buffered输入输出
数组(字符、字节)类的输入输出
Filter类的输入输出
文件输入输出
Piped输入输出
LineNumber输入
Pushback输入
打印输出
通用的
Data字节输入输出
Object字节输入输出
StringBuffer输入,已废弃
字节输入输出特有
字符串的字符输入输出
字符输入输出特有
字节流转字符流
自我总结
处理原始二进制数据的I / O。
处理字符数据的I / O,自动处理与本地字符集之间的转换。
缓冲流
Java基本数据流
ObjectOutputStream
对象流
官网教程分类
FileReader
读取文件
FileWriter
写入文件
文件
IO
server
NIO
IO/NIO
为什么String 传递时却不能被修改?
引用类型传递时为什么能被修改?
具体分析
只按值传递
值传递还是引用传递
默认是不初始化的在加载时
可以指定类加载器
ClassLoader.loadClass(name)
默认初始化在加载时
通过当前的类加载器加载,即谁调用就用调用的类加载器加载
可以通过其重载的方法改变是否初始化及指定类加载器
Class.forName(name)
https://javabeat.net/class-forname-classloader-loadclass-difference/
https://www.cnblogs.com/zabulon/p/5826610.html
https://stackoverflow.com/questions/8100376/class-forname-vs-classloader-loadclass-which-to-use-for-dynamic-loading?r=SearchResults
Class.forName和ClassLoader.loadClass的区别
类加载
5个哲学家坐在一张圆桌上吃中餐(中国菜,用筷子吃饭的)
在他们每两个人之间放一根筷子
哲学家时而思考,时而进餐
获取筷子失败时,放下筷子,隔段时间进行获取,这样不会导致饿死
每个哲学家都持有自己左边的筷子而不释放,并且等待并获取右边的筷子,每个人都这么做,导致每个人右边的筷子永远不会空出
根据获取筷子的方式不同可能导致饿死
哲学家进餐问题
背景
每个线程(人、事务)永远的持有一个锁(资源),并且其他线程(人、事务)都尝试获得这个锁(资源)时,那么他们将永远阻塞
锁顺序死锁
资源死锁
死锁类型
支持定时的锁
避免方式
数据库管理系统
JVM
线程系统如何避免
如何避免死锁
每个线程持有哪些锁
在哪些栈帧中获得这些锁
阻塞线程正在等待获取哪个锁
包含的信息
线程转储信息:Thread Dump
死锁的诊断
死锁
活跃性、性能与测试
Java
编程语言
简单工厂
工厂方法
抽象工厂
工厂模式
策略模式
代理模式
模板方法
装饰器
设计模式
定义配置文件中需要动态变换的属性
可以在配置文件中的其他位置使用
属性
设置Mybatis运行时行为
全局性地开启或关闭所有映射器配置文件中已配置的任何缓存。
true
cacheEnabled
延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态。
false
lazyLoadingEnabled
开启时,任一方法的调用都会加载该对象的所有延迟加载属性。 否则,每个延迟加载属性会按需加载(参考 lazyLoadTriggerMethods)。
aggressiveLazyLoading
是否允许单个语句返回多结果集(需要数据库驱动支持)。
multipleResultSetsEnabled
使用列标签代替列名。实际表现依赖于数据库驱动,具体可参考数据库驱动的相关文档,或通过对比测试来观察。
useColumnLabel
允许 JDBC 支持自动生成主键,需要数据库驱动支持。如果设置为 true,将强制使用自动生成主键。尽管一些数据库驱动不支持此特性,但仍可正常工作(如 Derby)。
False
useGeneratedKeys
指定 MyBatis 应如何自动映射列到字段或属性。 NONE 表示关闭自动映射;PARTIAL 只会自动映射没有定义嵌套结果映射的字段。 FULL 会自动映射任何复杂的结果集(无论是否嵌套)
PARTIAL
autoMappingBehavior
指定发现自动映射目标未知列(或未知属性类型)的行为。
NONE: 不做任何反应WARNING: 输出警告日志('org.apache.ibatis.session.AutoMappingUnknownColumnBehavior' 的日志等级必须设置为 WARN)FAILING: 映射失败 (抛出 SqlSessionException)
NONE
autoMappingUnknowColumnBehavior
配置默认的执行器。SIMPLE 就是普通的执行器;REUSE 执行器会重用预处理语句(PreparedStatement); BATCH 执行器不仅重用语句还会执行批量更新。
SIMPLE REUSE BATCH
SIMPLE
defaultExecutorType
设置超时时间,它决定数据库驱动等待数据库响应的秒数。
任意正整数
未设置 (null)
defaultStatementTimeout
\t为驱动的结果集获取数量(fetchSize)设置一个建议值。此参数只可以在查询设置中被覆盖。
defaultFetchSize
指定语句默认的滚动策略。(新增于 3.5.2)
\tFORWARD_ONLY | SCROLL_SENSITIVE | SCROLL_INSENSITIVE | DEFAULT(等同于未设置)
defaultResultSetType
\t是否允许在嵌套语句中使用分页(RowBounds)。如果允许使用则设置为 false。
safeRowBoundsEnabled
是否允许在嵌套语句中使用结果处理器(ResultHandler)。如果允许使用则设置为 false。
True
safeResultHandlerEnabled
是否开启驼峰命名自动映射,即从经典数据库列名 A_COLUMN 映射到经典 Java 属性名 aColumn。
mapUnderscoreToCamelCase
MyBatis 利用本地缓存机制(Local Cache)防止循环引用和加速重复的嵌套查询。 默认值为 SESSION,会缓存一个会话中执行的所有查询。 若设置值为 STATEMENT,本地缓存将仅用于执行语句,对相同 SqlSession 的不同查询将不会进行缓存。
SESSION | STATEMENT
SESSION
localCacheScope
当没有为参数指定特定的 JDBC 类型时,空值的默认 JDBC 类型。 某些数据库驱动需要指定列的 JDBC 类型,多数情况直接用一般类型即可,比如 NULL、VARCHAR 或 OTHER。
JdbcType 常量,常用值:NULL、VARCHAR 或 OTHER。
OTHER
jdbcTypeForNull
指定对象的哪些方法触发一次延迟加载。
用逗号分隔的方法列表。
lazyLoadTriggerMethods
指定动态 SQL 生成使用的默认脚本语言。
一个类型别名或全限定类名。
org.apache.ibatis.scripting.xmltags.XMLLanguageDriver
defaultScriptingLanguage
指定 Enum 使用的默认 TypeHandler 。(新增于 3.4.5)
\t一个类型别名或全限定类名。
org.apache.ibatis.type.EnumTypeHandler
defaultEnumTypeHandler
指定当结果集中值为 null 的时候是否调用映射对象的 setter(map 对象时为 put)方法,这在依赖于 Map.keySet() 或 null 值进行初始化时比较有用。注意基本类型(int、boolean 等)是不能设置成 null 的。
callSettersOnNulls
当返回行的所有列都是空时,MyBatis默认返回 null。 当开启这个设置时,MyBatis会返回一个空实例。 请注意,它也适用于嵌套的结果集(如集合或关联)。(新增于 3.4.2)
returnInstanceForEmptyRow
指定 MyBatis 增加到日志名称的前缀。
任何字符串
未设置
logPrefix
指定 MyBatis 所用日志的具体实现,未指定时将自动查找。
SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING
logImpl
指定 Mybatis 创建可延迟加载对象所用到的代理工具。
CGLIB | JAVASSIST
JAVASSIST (MyBatis 3.3 以上)
proxyFactory
指定 VFS 的实现
自定义 VFS 的实现的类全限定名,以逗号分隔。
vfsImpl
允许使用方法签名中的名称作为语句参数名称。 为了使用该特性,你的项目必须采用 Java 8 编译,并且加上 -parameters 选项。(新增于 3.4.1)
true | false
useActualParamName
指定一个提供 Configuration 实例的类。 这个被返回的 Configuration 实例用来加载被反序列化对象的延迟加载属性值。 这个类必须包含一个签名为static Configuration getConfiguration() 的方法。(新增于 3.2.3)
一个类型别名或完全限定类名。
configurationFactory
设置
类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写。
类型别名
类型处理器
对象工厂
MyBatis 允许你在映射语句执行过程中的某一点进行拦截调用。
插件
MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中, 现实情况下有多种理由需要这么做。例如,开发、测试和生产环境需要有不同的配置;或者想在具有相同 Schema 的多个生产数据库中使用相同的 SQL 映射。还有许多类似的使用场景。
环境配置
MyBatis 可以根据不同的数据库厂商执行不同的语句,这种多厂商的支持是基于映射语句中的 databaseId 属性。
数据库厂商标识
既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要来定义 SQL 映射语句了。
映射器
内容
配置文件
一次数据库会话中,执行多次查询条件完全相同的SQL,MyBatis通过一级缓存的方案优化这部分场景
SqlSession级别的缓存
cacheEnabled=true
localCacheScope=SESSION
mybatis配置文件配置缓存设置
使用配置
在一个session中,查询相同条件的查询,会查缓存
同一个session中对相同的记录进行修改操作时,该记录的缓存会失效
缓存失效
只在数据库会话内部共享
一个没有容量限定的HashMap
原理
默认的SESSION的缓存,对于不同session中,可能读到脏数据
存在问题
非分布式部署环境下,设置localCacheScope为STATEMENT
如何解决存在的问题
一级缓存
namespace缓存
相同namespace下所有操作语句,都影响着同一个Cache
多个SqlSession共享
实现了SqlSession之间的数据共享
粒度更细,能够到namespace级别
mybatis配置文件中启用cacheEnabled,默认启用
cache使用类型
默认值:PerpetualCache
可以自定义实现
type
回收策略
最近最少使用:移除最长时间不被使用的对象。
LRU
先进先出:按对象进入缓存的顺序来移除它们。
FIFO
软引用:基于垃圾回收器状态和软引用规则移除对象。
SOFT
弱引用:更积极地基于垃圾收集器状态和弱引用规则移除对象。
WEAK
取值
默认值为:LRU
eviction
最多缓存对象的个数
size
是否只读,若配置可读写,则需要对应的实体类能够序列化。
readOnly
若缓存中找不到对应的key,是否会一直blocking,直到有对应的数据进入缓存。
blocking
<cache/>
代表引用别的命名空间的Cache配置,两个命名空间的操作使用的是同一个Cache。
<cache-ref namespac=\"\"/>
在mapper文件中添加cache相关标签
<select>标签中添加useCache=true,默认值为false
不需要添加flushCache属性,默认值为false
select
<insert>/<update>/<delete>中flushCache属性默认为true
不需要useCache属性
insert/update/delete
使用
多表查询时,对于不同namespace,维护的缓存可能不一致,会出现脏读
基于本地的,分布式环境无效
多表查询时脏读的解决方法:多表放在同一个namespace下
分布式环境解决方法:使用redis实现自定义的缓存类型
如何解决
二级缓存
优先查询二级缓存,其次查询一级缓存,最后查询数据库
一级缓存、二级缓存执行流程
一级缓存和二级缓存都存在相关问题,如果能够解决相关问题的话可以使用,只是需要人为去改造,不通用
用不用Mybatis缓存
缓存
Mybatis
控制哪方面的反转
不好理解,还是使用依赖注入比较好理解
控制反转/依赖注入
接口注入
setter注入
构造器注入
注入方式
IoC 的应用场景
IoC容器概述
IoC原理
服务定位器:Service Locator
原理和模式
根据名称
根据名称、参数
根据类型
根据类型、参数
获取bean
根据名称是否包含bean
根据名称判断是否是单例
根据名称判断是否原型
根据名称判断bean是否属于某个类型
根据名称获取bean的类型
根据名称获取别名
功能
获取唯一编号
获取应用名称
获取显示名称
获取启动日期
获取父上下文
获取自动转配的beanFactory
获取环境
继承BeanFactory功能
发布应用事件
模式资源文件解析器
获取bean是从BeanFactory中获取的
设置唯一编号
设置父上下问
设置环境
添加beanFactory后处理器
添加应用监听器
添加协议解析器
刷新
注册暂停钩子
关闭
是否活跃
获取bean工厂
通过事件广播器发送事件:ApplicationEventMulticaster
发布事件
启动时间
是否关闭
初始化存放早期应用事件list
初始化上下文信息
初始化配置信息,properties
验证需要的配置信息
预刷新
获取beanFactory
设置类加载器
表达式解析器
PropertyEditor注册器
添加bean后处理器
忽略的依赖接口
预处理beanFactory
后处理beanFactory
调用在上下文中注册为bean的工厂处理器。
注册拦截Bean创建的Bean处理器。
为此上下文初始化消息源。
初始化事件广播器
onRefresh
检查并注册监听器
完成上下文beanFactory的初始化
完成刷新
刷新应用
ClassPathXmlApplicationContext
FileSystemXmlApplicationContext
类结构
AbstractApplicationContext
ConfigurableApplicationContext
ApplicatinContext
WebApplicationContext
BeanFactory
获取对象
获取对象类型
是否是单例
FactoryBean
组件
IoC容器的设计与实现
Resource定位
载入
注册
BeanDefinition的三个基本过程
是由refresh()方法来启动的
IoC容器的初始化过程
IoC容器的依赖注入
核心技术
用户密码
Spring Security Oauth2
IoC是一种设计思想,是某种设计模式
DI是IoC的一种实现
IoC和DI
Aspect oriented programming:面向切面编程
AOP
面向对象编程
OOP
IoC 和AOP
在Spring IoC容器中仅存在一个实例
说明
singleton
每次从容器中调用Bean时,都会返回一个新的实例
prototype
每次HTTP请求都会创建一个新的Bean,仅适用于WebApplicationContext环境
request
同一个HTTP Session共享一个Bean,不同的Session使用不同Bean,仅适用于WebApplicationContext环境
session
一般用于Portlet应用环境,该作用域仅适用于WebApplicationContext环境
globalSession
注解中使用@Scope注解
xml中bean的scope属性
作用域
初始化
销毁
生命周期
Bean的作用域和生命周期
构造方法注入
setter/字段 注入
Bean的注入方式
构造方法注入时会出现
Bean的循环依赖
Spring
框架
Remote Dictionary Services的首字母缩写:远程字典服务
MERZ,朋友圈语意:愚蠢
端口:6379
意大利人开发的
排行榜
分布式锁
字符串
key:键
简单动态数组:Simple Dynamic String(SDS)
未使用字节数
保存值的字符个数
字符数组
动态数组
动态释放空间
预分配
惰性分配
分配空间类型
具体结构
数字
可存放数据类型
set*
设置值
带过期时间的设置值
追加值
位上设置值
位上带过期时间的设置值
不存在时设置值
不存在时带过期时间设置值
存在时设置值
存在时带过期时间的设置
设置值并获取旧指
类型
get*
获取值
获取值的子串
获取指定位上的值
mutliSet*
设置多个键值
不存在时设置多个键值
多键设置值
mutliGet*
多键获取值
incr*
自增
加、减整数
加、减浮点数
值加、减
string:字符串
前置节点
后置节点
值
元素结构
表头节点
表尾节点
节点数
节点值复制
节点值释放
节点值对比
无环双向链表
linkedlist
ziplist
存放类型
*Push
压入一个
压入多个
key存在时压入一个
在某个元素前压入一个元素
左、右边压入
压入元素
*Pop
抛出一个元素
抛出一个元素,阻塞到元素到达或超时
左、右抛出
抛出元素
index
根据下标获取元素
获取指定位置元素
range
根据下表获取范围中的值
获取范围
set
根据下标设置值
设置指定下标位置的元素
n<0,从尾到头删除n个
n=0,删除全部
根据n决定怎么删
删除元素
获取列表中元素个数
获取大小
删除下表不在start到end内的元素
修剪不在范围内元素
list:列表
字典类型
私有数据
为什么要存两张hash表?
哈希表数组:2个元素的数组
当rehash不进行是值为1
rehash索引
字典
哈希表数组:哈希表实体元素数组
哈希表大小
用于计算索引值
总是等于哈希表大小-1
哈希表大小掩码
哈希表已有节点数
键
下一个元素的指针
哈希表实体元素
计算hash值的函数
复制键的函数
复制值的函数
对比键的函数
销毁键的函数
销毁值的函数
hash:字典
set:集合
跳跃表:skiplist
zset:有序集合
基础数据结构
值加、减操作是原子性的?线程安全?
根据不存在时带过期时间的设置来实现
分布式锁如何实现?
string
阻塞队列
list
字典中存放了两个hash表
一个hash表是用来插入键值对的
另一个哈希表在rehash时用的,在第一个hash元素的基础上计算出后一个hash表的大小
然后将第一个hash标中的元素rehash到第二个Hash表上
第一个hash表的元素全部rehash到第二个上后,将第一个hash的内存释放,把第二个hash表当作第一个hash表然后就完成了rehash
如何进行rehash的
渐进式rehash
插入时?
还是空闲是运行
何时进行rehash
hash
待验证功能
redis
简单
复制
有序
快
设计目标
类似文件系统(树形结构)
分层命名空间
永久节点
临时节点
B到KB
大小
节点数据
stat结构
节点
节点更改时,将触发并删除监视(改一次就会删除,不会一直监视)
条件更新和监视
顺序一致性
单系统影像
可靠性
及时性
担保
存在与否
获取节点数据
设置节点数据
获取子节点
同步
API
由每台服务器数据库副本提供服务
读请求
来自客户端的所有请求都被转发到领导者服务器
关注者接收来自领导者的消息提议并同意消息传递
协议处理写请求
由协议处理
写请求、更改服务器状态
请求处理
数据复制
Zookeeper Atomic Broadcast
不是一种通用的分布式一致性算法
是一种特别为Zookeeper设计的崩溃可恢复的原子消息广播算法
ZAB协议
Zookeeper
附近门店
如何避免
雪崩
概述
穿透
击穿
缓存存在的问题
项目中怎么用的redis?
单机
单机还是集群?
集群怎么用?
中间件
计算机技术笔记
0 条评论
回复 删除
下一页