在Spring Boot中配置Redis作为Hibernate二级缓存


通常情况下,RDBMS 数据库将成为您不断增长的应用程序中的主要可伸缩性瓶颈。这是由于 RDBMS 对水平扩展的天然抵制。已经出现了几种策略来缓解这个问题,包括只读副本、分区、分片以及将一些工作负载卸载到 NoSQL 数据库。
在这篇动手实践的文章中,我们将研究另一种可供 Spring/Hibernate 开发人员使用的技术,它可以大大减轻您过度工作的 RDBMS 的负担:即使用 Hibernate 二级缓存。

在 Hibernate(Spring Data/JPA 中的默认持久化提供者)中有两级缓存:

  • 1级缓存:是Hibernate Session级别的缓存。所以这是一个内部短期缓存,其用途仅限于单个会话。此缓存无法共享,默认情况下处于启用状态。事实上,它不能被禁用。
  • 2 级缓存:是 Hibernate SessionFactory级别的缓存,因此根据定义,它可供所有会话使用。它需要显式配置缓存存储,例如 Ehcache 或 Redis,因此默认情况下禁用。

案例源码

Hibernate L2 缓存支持多个提供程序。两种流行的选择是 Ehcache 和 Redis。

本文的其余部分假定您在本地运行 Redis。如果没有,那么您将需要一些额外的 Redis 以及防火墙配置更改,以便从您的本地开发机器连接到 Redis。
首先,安装Redis....
接下来,我们需要添加和配置Redisson (Redis Java 客户端)。

在您的 pom.xml 文件中,添加依赖项:

 <dependency>
   <groupId>org.redisson</groupId>
   <artifactId>redisson-hibernate-53</artifactId>
   <version>3.19.0</version>
  </dependency>


然后将以下基本的 Redisson 配置文件 redisson.yaml 添加到你的 CLASSPATH 资源下。确保 "address "属性符合你的设置。

singleServerConfig:
  idleConnectionTimeout: 10000
  connectTimeout: 10000
  timeout: 3000
  retryAttempts: 3
  retryInterval: 1500
  password: null
  subscriptionsPerConnection: 5
  clientName: null
  address: "redis://localhost:6379"
  subscriptionConnectionMinimumIdleSize: 1
  subscriptionConnectionPoolSize: 50
  connectionMinimumIdleSize: 10
  connectionPoolSize: 64
  database: 0
  dnsMonitoringInterval: 5000


在代码中启用二级缓存
将以下注释添加到Planet实体类(在 Planet.java 中):

@Cache(region = "planetCache", usage = CacheConcurrencyStrategy.READ_WRITE)

这一行通知 Hibernate 这是一个可缓存的实体,并指示它以名称缓存它:planetCache。
要了解有关缓存并发策略的更多信息,请参阅Hibernate 关于此主题的文档
下一步(也是最后一步)是在 application.properties 中启用缓存:

spring.jpa.properties.hibernate.cache.use_second_level_cache=true

您可以使用上述属性打开和关闭二级缓存。