Redis 缓存
默认情况下,Quarkus 缓存使用 Caffeine 作为后端。也可以使用 Redis 作为后端。
此技术被认为是预览版。 在预览中,不保证向后兼容性和在生态系统中的存在。特定的改进可能需要更改配置或 API,并且成为稳定版本的计划正在进行中。欢迎在我们的邮件列表中或在我们的 GitHub 问题跟踪器中提供反馈。 有关可能的完整状态列表,请查看我们的常见问题解答条目。 |
Redis 作为缓存后端
当使用 Redis 作为 Quarkus 缓存的后端时,每个缓存的项将被存储在 Redis 中
-
后端使用<default> Redis 客户端(如果未另行配置),因此请确保已配置(或使用 Redis Dev Service)
-
Redis 键的构建方式如下:
cache:{cache-name}:{cache-key}
,其中cache-key
是应用程序使用的键,cache:{cache-name}
是前缀。 -
如有必要,该值将被编码为 JSON
使用 Redis 后端
首先,您需要将 quarkus-redis-cache
扩展添加到您的项目中
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-redis-cache</artifactId>
</dependency>
implementation("io.quarkus:quarkus-redis-cache")
然后,按照 Quarkus 缓存指南中的说明,使用 @CacheResult
和其他缓存注解
@GET
@Path("/{keyElement1}/{keyElement2}/{keyElement3}")
@CacheResult(cacheName = "expensiveResourceCache")
public ExpensiveResponse getExpensiveResponse(@PathParam("keyElement1") @CacheKey String keyElement1,
@PathParam("keyElement2") @CacheKey String keyElement2, @PathParam("keyElement3") @CacheKey String keyElement3,
@QueryParam("foo") String foo) {
invocations.incrementAndGet();
ExpensiveResponse response = new ExpensiveResponse();
response.setResult(keyElement1 + " " + keyElement2 + " " + keyElement3 + " too!");
return response;
}
@POST
@CacheInvalidateAll(cacheName = "expensiveResourceCache")
public void invalidateAll() {
}
配置 Redis 后端
Redis 后端使用 <default>
Redis 客户端。 请参阅 Redis 参考 以配置对 Redis 的访问。
在开发模式下,您可以使用 Redis Dev Service。 |
如果您想为您的缓存使用另一个 Redis,请按如下方式配置 client-name
quarkus.cache.redis.client-name=my-redis-for-cache
在写入 Redis 或从 Redis 读取时,Quarkus 需要知道类型。 实际上,对象需要被序列化和反序列化。 为此,您可能需要配置您想要缓存的键和值的类型(类名)。 在构建时,Quarkus 会尝试从应用程序代码中推断类型,但可以使用以下方式覆盖该决策
# Default configuration
quarkus.cache.redis.key-type=java.lang.String
quarkus.cache.redis.value-type=org.acme.Person
# Configuration for `expensiveResourceCache`
quarkus.cache.redis.expensiveResourceCache.key-type=java.lang.String
quarkus.cache.redis.expensiveResourceCache.value-type=org.acme.Supes
您还可以配置缓存条目的生存时间
# Default configuration
quarkus.cache.redis.expire-after-write=10s
# Configuration for `expensiveResourceCache`
quarkus.cache.redis.expensiveResourceCache.expire-after-write=1h
如果未配置 expire-after-write
,则不会驱逐该条目。 您需要使用 @CacheInvalidateAll
或 @CacheInvalidate
注解来使值失效。
下表列出了支持的属性
构建时固定的配置属性 - 所有其他配置属性都可以在运行时覆盖
配置属性 |
类型 |
默认 |
---|---|---|
用于与 Redis 通信的命名 Redis 客户端的名称。 如果未设置,则使用默认的 Redis 客户端。 环境变量: 显示更多 |
字符串 |
|
字符串 |
||
字符串 |
||
指定一旦条目的创建或最近替换其值经过固定持续时间后,应自动从缓存中删除每个条目。 环境变量: 显示更多 |
||
指定每个条目在最后一次访问其值后经过固定的持续时间后应自动从缓存中删除。 环境变量: 显示更多 |
||
允许识别属于缓存的键的键前缀。 如果未设置,将使用值 "`cache:{cache-name`}"。变量 "`{cache-name`}" 从缓存注解中设置的值解析。 环境变量: 显示更多 |
字符串 |
|
是否应该使用乐观锁定访问缓存。 有关详细信息,请参阅 Redis 乐观锁定。 默认为 环境变量: 显示更多 |
布尔值 |
|
如果设置, 环境变量: 显示更多 |
整数 |
|
类型 |
默认 |
|
存储在缓存中的值的默认类型。 环境变量: 显示更多 |
字符串 |
|
键类型,默认为 环境变量: 显示更多 |
字符串 |
|
指定一旦条目的创建或最近替换其值经过固定持续时间后,应自动从缓存中删除每个条目。 环境变量: 显示更多 |
||
指定每个条目在最后一次访问其值后经过固定的持续时间后应自动从缓存中删除。 环境变量: 显示更多 |
||
允许识别属于缓存的键的键前缀。 如果未设置,将使用值 "`cache:{cache-name`}"。变量 "`{cache-name`}" 从缓存注解中设置的值解析。 环境变量: 显示更多 |
字符串 |
|
是否应该使用乐观锁定访问缓存。 有关详细信息,请参阅 Redis 乐观锁定。 默认为 环境变量: 显示更多 |
布尔值 |
|
如果设置, 环境变量: 显示更多 |
整数 |
关于 Duration 格式
要写入持续时间值,请使用标准的 您还可以使用简化的格式,以数字开头
在其他情况下,简化格式将被转换为
|
配置 Redis 键
默认情况下,Redis 后端使用以下键模式存储条目:cache:{cache-name}:{cache-key}
,其中 cache-key
是应用程序使用的键,cache:{cache-name}
是前缀。 变量 {cache-name}
从缓存注解中设置的值解析。 因此,您可以使用 Redis KEYS
命令查找单个缓存的所有条目:KEYS cache:{cache-name}:*
可以使用 prefix
属性配置前缀
# Default configuration
quarkus.cache.redis.prefix=my-cache
# Configuration for `expensiveResourceCache`
quarkus.cache.redis.expensiveResourceCache.prefix=my-expensive-cache
在这些情况下,您可以使用 KEYS my-cache:*
查找默认缓存管理的所有键,并使用以下命令查找 expensiveResourceCache
缓存管理的所有键:KEYS my-expensive-cache:*
。
# Default configuration # The variable "{cache-name}" is resolved from the value set in the cache annotations. quarkus.cache.redis.prefix=my-cache-{cache-name}
在最新的示例中,您可以使用 KEYS my-cache-{cache-name}:*
查找默认缓存管理的所有键。
启用乐观锁定
对缓存的访问可以是直接的,也可以使用 乐观锁定。 默认情况下,禁用乐观锁定。
您可以使用以下方式启用乐观锁定
# Default configuration
quarkus.cache.redis.use-optimistic-locking=true
# Configuration for `expensiveResourceCache`
quarkus.cache.redis.expensiveResourceCache.use-optimistic-locking=true
使用时,键被监视,并且 SET 命令在事务 (MULTI/EXEC
) 中执行。