您的位置  > 互联网

一级缓存和二级缓存的区别,你知道吗?

简单来说,缓存就是缓冲区中存储的内容,或者可以理解为内存中存储的内容。 用户可以将经常查询的内容放入缓存中,再次使用时直接从缓存中取出值,无需再次查询数据库。 这样做的好处是响应速度快,减少系统资源(网络资源、CPU资源等)的开销; 缺点是需要内存资源。 一旦服务器关闭,缓存就会丢失,重启后需要重新将数据写入内存。

缓存

缓存分为一级缓存和二级缓存。 一级缓存默认开启,二级缓存需要手动开启。

一级缓存是有范围的一级缓存。 在同一个中,如果执行相同的查询SQL,会第一次查询数据库并写入缓存。 第二次再次执行时,会直接从缓存中取数据。 如果两次执行查询sql之间有增删改查操作,缓存就会被清除。

二级缓存是一级缓存。 作用域是同一作用域下的sql语句。 当第一次执行查询SQL时,查询结果将存储在二级缓存区域中。 第二次执行相同的查询SQL时,将直接从缓存中获取数据。 如果两次执行查询sql之间有增删改操作,二级缓存就会被清除。

1.开启二级缓存

(1)修改目录下的配置文件,添加启用二级缓存的配置和打印执行SQL的配置

# 开启mybatis的二级缓存
mybatis.configuration.cache-enabled=true
# 开启sql打印
logging.level.com.batis.mapper=debug

(2)修改该目录下对应目录的文件


<cache eviction="LRU" flushInterval="100000" readOnly="true" size="1024">
cache>

阐明:

:回收策略

LRU 最近最少使用,移除最长时间没有使用的对象,这是默认值

FIFO先进先出,按照对象进入缓存的顺序移除对象

SOFT软引用,根据垃圾收集器状态和软引用规则删除对象

WEAK 弱引用,根据垃圾收集器状态和弱引用规则更积极地删除对象

:刷新间隔,单位毫秒,表示每100秒刷新一次缓存。 如果不设置,则每次调用该语句时都会刷新。

:只读属性可以设置为 true 或 false。 只读缓存将缓存对象的相同实例返回给所有调用者,因此这些对象无法修改,这提供了重要的性能优势。 读写缓存会通过序列化返回缓存对象的副本,速度较慢但更安全,因此默认为 false。

size:可以设置为任何正整数,记住缓存对象的数量和运行环境中可用内存资源的数量。 默认值为 1024。

(3)实体对象是必须的,否则会报错

public class User implements Serializable{
}

(4) 启动项目,如果

Cache Hit Ratio . #表示缓存开启了.....

2.启动batis项目并使用工具测试

查询用户:

打印sql日志,可以看到详细的查询过程(红框)。 查询语句在第一次查询期间被调用。 随后的绿色框是多个查询。 没有调用查询语句,而是直接取缓存值; 100秒后,进行第二次查询,再次调用查询语句,多次查询后从缓存中取出值。 :

插入用户并执行查询:

从上图的执行结果可以看出,先执行查询操作,将查询结果更新到缓存中,后续的查询直接从缓存中获取值。 之后执行插入用户的操作,当多次执行查询操作时,会先调用查询语句将查询结果写入缓存,后续操作直接获取值​​​​来自缓存。

至此,集成二级缓存内容全部讨论完毕,测试完全符合预期!

如果有需要改进的地方,希望各位同学不吝赐教并指正。 非常感谢!

参考文章链接: