缓存查询
2018-05-27 本文已影响16人
幻影翔
缓存的意义
- 将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题。
-
mybatis一级缓存是一个SqlSession级别,sqlsession只能访问自己的一级缓存的数据,二级缓存是跨sqlSession,是mapper级别的缓存,对于mapper级别的缓存不同的sqlsession是可以共享的。
流程图
一级缓存
![](https://img.haomeiwen.com/i3944205/37386bc02e40aab6.png)
第一次发出一个查询sql,sql查询结果写入sqlsession的一级缓存中,缓存使用的数据结构是一个map<key,value>
key:hashcode+sql+sql输入参数+输出参数(sql的唯一标识)
value:用户信息,同一个sqlsession再次发出相同的sql,就从缓存中取不走数据库。如果两次中间出现commit操作(修改、添加、删除),本sqlsession中的一级缓存区域全部清空,下次再去缓存中查询不到所以要从数据库查询,从数据库查询到再写入缓存。
每次查询都先从缓存中查询:
![](https://img.haomeiwen.com/i3944205/dbf0ab8087fec40a.png)
如果缓存中查询到则将缓存数据直接返回。
如果缓存中查询不到就从数据库查询:
![](https://img.haomeiwen.com/i3944205/a09fc632528be184.png)
二级缓存
![](https://img.haomeiwen.com/i3944205/a53a8d21ac91a1eb.png)
二级缓存的范围是mapper级别(mapper同一个命名空间),mapper以命名空间为单位创建缓存数据结构,结构是map<key、value>。
每次查询先看是否开启二级缓存,如果开启从二级缓存的数据结构中取缓存数据,
![](https://img.haomeiwen.com/i3944205/e2e675b0fee407e3.png)
如果从二级缓存没有取到,再从一级缓存中找,如果一级缓存也没有,从数据库查询。