什么是缓存(cache)?
存在内存中的临时数据
将用户经常查询的数据存放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库文件)查询,而是从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题
为什么使用缓存?
减少和数据库的交互次数,减少系统开销,提高系统效率
什么样的数据能使用缓存?
经常查询且不经常发生改变的数据
什么是数据库并发操作
数据库是一个共享资源,可以允许多个用户并行地存取数据库。但这样就会产生多个用户程序并发存取同一数据的情况,若对并发操作不加控制就可能会存取和存储不正确的数据,破坏数据库的一致性,所以数据库管理系统必须提供并发控制机制。并发控制机制的好坏是衡量一个数据库管理系统性能的重要标志之一。
大多数互联网业务,往往读多写少,这时候,数据库的读会首先成为数据库的瓶颈,我们就可以使用缓存来解决该问题。同“读写分离”不同,读写分离是通过多个读库,分摊了数据库读的压力,而存储则是通过缓存的使用,减少了数据库读的压力。
当然,缓存也不是没有缺点的
对于缓存,我们必须要考虑的就是高可用,不然,如果缓存一旦挂了,所有的流量都同时聚集到了数据库上,那么数据库是肯定会挂掉的。
Mybatis缓存(了解):
Mybatis包含了一个非常强大的查询缓存特性,它可以非常方便地配置和定制,缓存可以极大地提升查询效率
Mybatis系统中默认定义了两级缓存:一级缓存和二级缓存
默认情况下只有一级缓存开启(SqlSession级别的缓存,也称为本地缓存)
二级缓存需要手动开启和配置,它是基于namespace级别的缓存(mapper级别的)
为了提高扩展性,Mybatis定义了缓存接口Cache。我们可以通过Cache接口来自定义二级缓存
一级缓存:
也叫本地缓存,只在一次sqlSession中有效,随着SqlSession对象的关闭而关闭
默认开启
缓存失效的情况:
增删改操作可能会改变原来的数据,所以必定会刷新缓存
查询不同数据
查询不同的Mapper.xml
手动清理缓存sqlSession.clearCache();
二级缓存:
一级缓存作用域太低了,所以诞生了二级缓存
基于namespace级别的缓存,一个名称空间对应一个二级缓存
步骤:
- 开启全局缓存
<!-- 显示的开启全局缓存 -->
<setting name="cacheEnabled" value="true"/>
- 在Mapper.xml中添加一行属性
<cache/>
- 序列化实体类
public class User implements Serializable {
...
}
所有的数据都会先被放在一级缓存中,只有当会话提交或关闭的时候才会提交到二级缓存中
缓存顺序:
先看二级缓存中有没有
再看一级缓存中有没有
查询数据库
自定义缓存Ehcache:…