二级缓存

什么是二级缓存

MyBatis 中的二级缓存是指作用于映射器(Mapper)范围的缓存,也就是跨多个 SqlSession 的会话缓存。当开启二级缓存后,MyBatis 将会使用一个全局的缓存来存储查询结果,这个缓存的生命周期更长,可以跨越多个 SqlSession。

二级缓存的作用

MyBatis 的二级缓存主要作用是减少数据库查询次数,提高数据访问的效率。它是跨 SqlSession 的,在 Mapper 级别共享,这意味着当不同的 SqlSession 执行相同的查询时,可以重用之前查询的结果,而不需要再次执行数据库操作。

  1. 提高性能:二级缓存可以大幅减少对数据库的查询次数,特别是对于那些不经常变化的数据,通过缓存可以快速获取结果,从而加快应用程序的响应速度。

  2. 减少数据库负载:通过使用缓存,减少了对数据库的直接访问,这可以在高并发场景下显著降低数据库的压力,保护数据库不被过度使用。

  3. 跨会话共享:不同用户或请求的相同数据可以被缓存在二级缓存中,实现跨会话共享,这对于读多写少的应用场景尤其有益。

  4. 支持分布式:通过集成第三方缓存管理器(如 Ehcache、Redis 等),MyBatis 的二级缓存还可以支持分布式缓存,这使得在集群环境中的应用能够共享缓存数据,进一步提升应用的可伸缩性和性能。

二级缓存的使用场景

  1. 读操作远多于写操作:如果应用主要执行数据库查询操作,而数据库更新操作不太频繁,那么使用二级缓存可以保持数据被高效读取。

  2. 数据库负载较高:当应用面临高并发请求时,如果数据库查询成为瓶颈,二级缓存可以减少对数据库的直接查询压力。

  3. 数据变化不频繁:如果数据变动不是很频繁,并且可以容忍一些延时(数据不需要实时更新),那么二级缓存可以提供较为静态的数据,减少数据库访问。

  4. 对数据库响应时间有严格要求:如果系统需要快速响应用户请求,二级缓存可以减少查询延迟,提供更快的数据访问速度。

  5. 数据一致性要求不是非常严格:在一些情况下,数据的绝对一致性不是特别关键,可以接受短时间内数据的轻微不一致。

  6. 分布式系统:如果你的应用是分布式的,缓存可以配置成分布式缓存,这样不同的服务器实例可以共享缓存数据,从而减少本地服务器和数据库服务器的压力。

  7. 系统资源有限:如果服务器资源(如 CPU、内存)相对有限,使用二级缓存可以减少资源的消耗,尤其是 CPU 和 I/O 资源。

二级缓存和一级缓存之间的区别

一级缓存(Local Cache):

  • 作用范围:一级缓存是 MyBatis 中的默认缓存,它的作用范围仅限于同一个 SqlSession 内部。如果在同一个 SqlSession 内部执行多次相同的 SQL 查询,第一次查询之后的结果会被缓存在这个 SqlSession 中,后续的相同查询就可以直接从缓存中获取结果,而不需要再次访问数据库。
  • 生命周期:一级缓存随着 SqlSession 的生命周期开始和结束。当 SqlSession 关闭或者提交更改时(如执行了 insert、update 或 delete 操作),一级缓存就会清空。

二级缓存(Global Cache):

  • 作用范围:二级缓存是跨 SqlSession 的。它可以被多个 SqlSession 共享,也就是说,不同的 SqlSession 可以共享相同的缓存数据。
  • 配置:二级缓存需要在 MyBatis 的配置文件中显式地开启,并且通常需要对它进行更为详细的配置,比如缓存大小、清除策略等。
  • 生命周期:二级缓存的生命周期可以跨越多个 SqlSession,可以长久地存储数据,直到达到缓存的某种清除条件,如缓存满了、时间过期或手动清除。

[!example] 实例场景

考虑一个在线商城应用,其中有一个商品信息页面,用户可能会频繁地查询同一商品的信息。

  • 使用一级缓存:当用户在同一用户会话(即 SqlSession)中多次查询同一商品时,商品信息可以从一级缓存中直接获取,提高了该会话的查询效率。
  • 使用二级缓存:当不同的用户(即不同的 SqlSession)查询同一商品信息时,如果该信息已经被缓存到二级缓存中,那么无论是哪个用户会话查询都可以直接从二级缓存中获取结果,显著减少了数据库访问次数。