发表于: 2019-11-14 21:17:02
1 877
今天做了什么:
深入了解Mysql,Redis
学习使用Hibernate(小课堂)
收获:
Mysql
1.读写分离
基于主从复制架构
主从复制: 串行化 , (主从延迟)在高并发场景有延时
2.索引
B+ 树索引(包括普通索引、唯一索引、主键索引),哈希索引,全文索引,R-TREE 索引
Mysql 传统意义上的索引为B+ 树索引,B+ 树索引的本质就是B+ 树在数据库中的实现,由于B+ 树的高扇出性,数据库中的B+ 树的高一般为2-4层,因此查找某一键值的行记录只需2-4次IO,大概0.02~0.04秒。
哈希索引是一种自适应的索引,数据库会根据表的使用情况自动生成哈希索引,我们人为是没办法干预的。
全文索引用于实现关键词搜索。但它只能根据空格分词,因此不支持中文。
聚簇索引和非聚簇索引
聚簇索引:表数据按照索引的顺序来存储的,也就是说索引项的顺序与表中记录的物理顺序一致。对于聚集索引,叶子结点即存储了真实的数据行,不再有另外单独的数据页。 在一张表上最多只能创建一个聚集索引,因为真实数据的物理顺序只能有一种
非聚簇索引: 表数据存储顺序与索引顺序无关。对于非聚集索引,叶结点包含索引字段值及指向数据页数据行的逻辑指针,其行数量与数据表行数据量一致。
3.事务的隔离级别
读未提交
读已提交
可重复读
串行化
分别解决脏读(读了回滚),不可重复读(两次读不一致),幻读(前一次读的结果无法支持后续操作)
Redis
持久化策略
半持久化模式: 不定期的通过异步方式保存到磁盘上
全持久化模式: 把每一次数据变化都写入到一个append only file(aof)里面
持久化方式:
RDB
在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。
优劣势:
性能最大化
存在数据丢失
AOF Append only file
以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。
优劣势:
更高的数据持久性
文件更大,恢复更慢
总结 : 性能 VS 缓存一致性
数据淘汰策略
6种数据淘汰策略:
volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
volatile-random:从已设置过期时间的数据集(server.db[i].expires)中随机选择数据淘汰
allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
no-enviction(驱逐):禁止驱逐数据
redis中并不会准确的删除所有键中最近最少使用的键,而是随机抽取maxmeory-samples个键,删除这几个键中最近最少使用的键。
小课堂什么是Hibernate:
知识背景:
作者 Gavin King,在工作中因为不满EJB的种种不足,而自行花费两年的时间开发出最原始的Hibernate,后来被Jboss收购了Gavin King所在的公司(最主要是看上了Hibernate),后来的Jboss被红帽收购,所以现在Hibernate为红帽旗下的产品。
讲到了Hibernate怎么能不提一下什么叫做JPA(Java persistence API),是JavaEE5标准的ORM接口标准,是一种规范和接口,并不是ORM的具体实现,用于实现这一套规范的框架有很多,其中Hibernate就是一个这样的框架。
JPA,ORM,Hibernate之间的关系:
ORM是一种思想,JPA是这种思想的规范约束,Hibernate是这种思想和规范的具体实现。
mybatis是半自动的,mybatis自动化的地方在于它把数据给我们封装后返回给我们,手动的部分在于我们自己来写sql,这样的方式很灵活,我们可以根据需求写最优的sql语句。
hibernate是全自动的,sql都帮我们写好了,但是这也是hibernate一个很大的缺点,有时候它给的sql语句并不是最优的,就极大的影响了我们的效率。
使用步骤
1.持久化对象
2.对象-关系映射文件
反映了持久化类和数据库表的映射信息,类似于mybatis中的mapper
3.Hibernate配置文件
配置数据库连接以及Hibernate运行时所需要的各个属性的值.
其中可以指定方言, 使得用户无需关心数据库具体细节
Hibernate六大核心接口:
1、Configuration接口:通过Configuration().configure()读取并解析hibernate.cfg.xml配置文件,并启动Hibernate
由hibernate.cfg.xml中的< mapping resource=”com/xx/User.hbm.xml”/>读取并解析映射信息
2、SessionFactory接口:负责初始化Hibernate(通过config.buildSessionFactory() 创建SessionFactory)
3、Session接口:负责持久化对象的CRUD操作(sessionFactory.openSession() 打开Sesssion)
4、Transaction接口:负责事务(session.beginTransaction() 创建事务Transation; session.getTransaction().commit() 提交事务)
5、Query接口和Criteria接口:负责执行各种数据库查询(持久化操作)
最后需要关闭Session,关闭SesstionFactory.
缓存机制与对象状态
Hibernate的缓存机制包括一级缓存(session级别)、二级缓存(sessionFactory级别)以及查询缓存。
遇到的问题
明天的计划
继续补充相关基础.
评论