概述

二级缓存的目标是通过不必访问数据库来读取某些信息,从而显著提高性能。

例如,我们可以让 Ebean 有效地查找二级缓存中的结果,而不是执行“按 ID 查找”或“按唯一键查找”查询。如果我们使用近缓存,这通常会导致对本地映射进行内存查找,甚至不需要远程调用,因此非常快。

之所以称为“二级缓存”,是因为持久性上下文通常称为“一级缓存”。

“二级缓存”有 2 个主缓存 - “Bean 缓存”和“查询缓存”。

Bean 缓存

Bean 缓存保存实体 Bean,并以其Id 值为键,还可以选择以其自然键为键。Bean 缓存可与以下内容一起使用

  • 按 ID 查找
  • 按自然键查找

查询缓存

查询缓存保存查询结果(实体 Bean 的列表、集合、映射和计数),并以查询及其绑定值的哈希值为键。

对基础表的任何更改(插入、更新或删除)都会使查询缓存中的条目失效。这意味着查询缓存通常仅对修改频率相对较低的实体有用(通常是“查找表”,例如国家、货币、状态代码等)。

查询缓存可与以下内容一起使用

  • 查找列表/集合/映射查询

最终一致性

Ebean L2 缓存使用最终一致性

这意味着它有点像“复制滞后”。从 L2 缓存返回的数据可能已过时(毫秒级)。缓存将在相对较短的时间内(毫秒级)进行更改,但无法保证事务数据库提供的读取一致性。

Ebean L2 缓存不会尝试提供事务读取一致性。如果应用程序的一部分需要事务读取一致性,那么我们应该使用数据库来实现。

失效

持久化 Bean或执行更新查询时,Ebean 会自动使缓存失效。

此外,我们可以通过编程方式显式使缓存部分失效

后台通知

默认情况下,Ebean 将在后台执行 L2 缓存更新和失效。如果我们希望在前景执行缓存更新和失效,则需要将 notifyL2CacheInForeground 设置为 true。

近缓存

与 Ebean 在同一进程中运行的缓存是近缓存。对近缓存执行命中是内存映射查找,不会通过网络。对近缓存的命中非常快 - 它实际上是本地内存映射 get()。

Redis、Hazelcast 和 Ignite 的 Ebean L2 Bean 缓存都具有近缓存选项。启用此选项后,将使用本地进程内缓存并首先命中,然后只有在近缓存中未命中时,请求才会转到远程 Redis | Hazelcast | Ignite 缓存。

例如,在启用近缓存的情况下,使用 ebean-redis 对 Customer 进行 Bean 缓存

@Cache(nearCache=true)
@Entity
public class Customer
  • 首先命中本地内存近缓存,如果命中,则返回 Customer
  • 其次,命中远程 Redis 缓存,如果命中,则返回 Customer
  • 第三,查询数据库,返回 Customer,同时加载 Redis 缓存和近缓存

请注意,所有查询缓存仅作为近缓存实现。

区域

我们使用“区域”对缓存进行分组,以便可以通过“区域组”启用和禁用 L2 缓存。

这提供了一种机制,我们可以通过命名区域“功能切换”/启用 L2 缓存。

假设我们的应用程序推出,并且它对产品使用 L2 缓存(我们称该区域为“product-region”)。现在,我们进一步开发,并希望将 L2 缓存用于价格,但是我们还不希望在所有环境中启用它(例如,我们不希望在生产中启用它)。在开发和测试中,我们可能会启用 l2 缓存区域“product-region,price-region”,但在生产中仅启用“product-region”。

@Entity
@Cache(region = "product-region")
public class Product

enabledL2Regions

ebean.enabledL2Regions=product-region,price-region

配置

可以通过 DatabaseConfig 设置的配置选项。

参数 默认值 说明
disableL2Cache false 设置为 true 以全局禁用 L2 缓存
enabledL2Regions 设置启用的 L2 缓存区域(逗号分隔)。默认情况下,所有区域都已启用。
localOnlyL2Cache false 设置为 true 以有效禁用 L2 缓存插件(如 ebean-redis、ebean-hazelcast)
notifyL2CacheInForeground false 设置为 true 以使缓存通知和失效在前景运行。通常,我们希望在后台执行 L2 缓存通知,并且不影响执行事务的性能。
cacheMaxSize 10000
cacheMaxIdleTime 10 分钟
cacheMaxTimeToLive 6 小时
queryCacheMaxSize 1000
queryCacheMaxIdleTime 10 分钟
queryCacheMaxTimeToLive 6 小时