编辑此页面

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 扩展添加到您的项目中

pom.xml
<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-redis-cache</artifactId>
</dependency>
build.gradle
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 客户端。

环境变量:QUARKUS_CACHE_REDIS_CLIENT_NAME

显示更多

字符串

存储在缓存中的值的默认类型。

环境变量:QUARKUS_CACHE_REDIS_VALUE_TYPE

显示更多

字符串

键类型,默认为 String

环境变量:QUARKUS_CACHE_REDIS_KEY_TYPE

显示更多

字符串

指定一旦条目的创建或最近替换其值经过固定持续时间后,应自动从缓存中删除每个条目。

环境变量:QUARKUS_CACHE_REDIS_EXPIRE_AFTER_WRITE

显示更多

Duration 

指定每个条目在最后一次访问其值后经过固定的持续时间后应自动从缓存中删除。

环境变量:QUARKUS_CACHE_REDIS_EXPIRE_AFTER_ACCESS

显示更多

Duration 

允许识别属于缓存的键的键前缀。 如果未设置,将使用值 "`cache:{cache-name`}"。变量 "`{cache-name`}" 从缓存注解中设置的值解析。

环境变量:QUARKUS_CACHE_REDIS_PREFIX

显示更多

字符串

是否应该使用乐观锁定访问缓存。 有关详细信息,请参阅 Redis 乐观锁定。 默认为 false

环境变量:QUARKUS_CACHE_REDIS_USE_OPTIMISTIC_LOCKING

显示更多

布尔值

如果设置,SCAN 命令(用于实现失效)将具有带有给定值的 COUNT 参数。 如果未设置(默认),则不存在 COUNT 参数。

环境变量:QUARKUS_CACHE_REDIS_INVALIDATION_SCAN_SIZE

显示更多

整数

应用于特定 Redis 缓存的其他配置(优先级最高)

类型

默认

存储在缓存中的值的默认类型。

环境变量:QUARKUS_CACHE_REDIS__CACHE_NAME__VALUE_TYPE

显示更多

字符串

键类型,默认为 String

环境变量:QUARKUS_CACHE_REDIS__CACHE_NAME__KEY_TYPE

显示更多

字符串

指定一旦条目的创建或最近替换其值经过固定持续时间后,应自动从缓存中删除每个条目。

环境变量:QUARKUS_CACHE_REDIS__CACHE_NAME__EXPIRE_AFTER_WRITE

显示更多

Duration 

指定每个条目在最后一次访问其值后经过固定的持续时间后应自动从缓存中删除。

环境变量:QUARKUS_CACHE_REDIS__CACHE_NAME__EXPIRE_AFTER_ACCESS

显示更多

Duration 

允许识别属于缓存的键的键前缀。 如果未设置,将使用值 "`cache:{cache-name`}"。变量 "`{cache-name`}" 从缓存注解中设置的值解析。

环境变量:QUARKUS_CACHE_REDIS__CACHE_NAME__PREFIX

显示更多

字符串

是否应该使用乐观锁定访问缓存。 有关详细信息,请参阅 Redis 乐观锁定。 默认为 false

环境变量:QUARKUS_CACHE_REDIS__CACHE_NAME__USE_OPTIMISTIC_LOCKING

显示更多

布尔值

如果设置,SCAN 命令(用于实现失效)将具有带有给定值的 COUNT 参数。 如果未设置(默认),则不存在 COUNT 参数。

环境变量:QUARKUS_CACHE_REDIS__CACHE_NAME__INVALIDATION_SCAN_SIZE

显示更多

整数

关于 Duration 格式

要写入持续时间值,请使用标准的 java.time.Duration 格式。 有关更多信息,请参阅 Duration#parse() Java API 文档

您还可以使用简化的格式,以数字开头

  • 如果该值仅为一个数字,则表示以秒为单位的时间。

  • 如果该值是一个数字后跟 ms,则表示以毫秒为单位的时间。

在其他情况下,简化格式将被转换为 java.time.Duration 格式以进行解析

  • 如果该值是一个数字后跟 hms,则在其前面加上 PT

  • 如果该值是一个数字后跟 d,则在其前面加上 P

配置 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) 中执行。

相关内容