概述
二级缓存的目标是通过不必访问数据库来读取某些信息,从而显著提高性能。
例如,我们可以让 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 小时 |