Netflix Hystrix @CacheKey 注解

点击下载教程项目代码:netflix_hystrix_demo.zip

@CacheKey 注解是 Hystrix 中用于指定缓存 key 的注解,它在方法级别上使用,主要用于控制 Hystrix 命令的缓存行为。

在使用 Hystrix 实现服务容错和降级的过程中,缓存是提高性能的一种重要手段。@CacheKey 注解能够帮助开发人员明确指定哪些参数或参数组合应该作为缓存的键,以便 Hystrix 能够根据这些键来缓存和检索命令的执行结果,从而避免不必要的重复执行,提高系统的响应速度和性能。

@CacheKey 注解通常与 @HystrixCommand 注解一起使用,并且可以标注在方法的参数上。当一个方法被 @HystrixCommand 注解标记为 Hystrix 命令时,Hystrix 会根据 @CacheKey 注解所标注的参数值来生成缓存键,并将该命令的执行结果缓存起来。下次再调用相同的命令且参数值相同时,Hystrix 会直接从缓存中获取结果,而不会再次执行该命令。

@CacheKey 源码

@CacheKey 注解源码如下:

package com.netflix.hystrix.contrib.javanica.cache.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * Marks a method argument as part of the cache key.
 * 将方法参数标记为缓存键的一部分。
 * If no arguments are marked all arguments are used.
 * 如果没有参数被标记,那么所有参数都将被使用。
 * If {@link CacheResult} or {@link CacheRemove} annotation has specified <code>cacheKeyMethod</code> then
 * a method arguments will not be used to build cache key even if they annotated with {@link CacheKey}.
 *
 * @author dmgcodevil
 */
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CacheKey {

    /**
     * Allows specify name of a certain argument property.
     * 允许指定某个参数属性的名称。
     * for example: <code>@CacheKey("id") User user</code>,
     * or in case composite property: <code>@CacheKey("profile.name") User user</code>.
     * <code>null</code> properties are ignored, i.e. if <code>profile</code> is <code>null</code>
     * then result of <code>@CacheKey("profile.name") User user</code> will be empty string.
     *
     * @return name of an argument property
     */
    String value() default "";
}

注意:

(1)@CacheKey 注解将方法参数标记为缓存键的一部分。如果没有标记参数,则使用所有参数。如果 @CacheResult 或 @CacheRemove 注释指定了 cacheKeyMethod,那么即使方法参数被注释为 @CacheKey,也不会用于创建缓存密钥。

(2)@CacheKey 注解允许指定某个参数属性的名称,例如:

@CacheKey("id") User user

或者在复合属性的情况下,例如:

@CacheKey("profile.name") User user

如果属性为 null,则将被忽略,例如,如果 profile 为 null:

@CacheKey("profile.name") User user

此时,@CacheKey 结果将是空字符串。

简单示例

以下是一个简单的示例,展示了如何使用 @CacheKey 注解来实现缓存功能,例如:

@Service
public class MyService {

    @HystrixCommand(cacheKeyMethod = "generateCacheKey")
    public String getData(@CacheKey String key) {
        // 模拟从数据库或其他数据源获取数据的操作
    }

    private String generateCacheKey(String key) {
        return "myCacheKey:" + key;
    }
}

在上述示例中,getData 方法被 @HystrixCommand 注解标记,并且其参数 key 被 @CacheKey 注解标注。同时,通过 cacheKeyMethod 属性指定了一个生成缓存键的方法 generateCacheKey。

在实际执行中,Hystrix 会根据 generateCacheKey 方法生成的缓存键来缓存和检索 getData 方法的执行结果。例如,当第一次调用 getData("key1") 时,会执行 getData 方法并将结果缓存起来,缓存键为 myCacheKey:key1。下次再调用 getData("key1") 时,Hystrix 会直接从缓存中获取结果,而不会再次执行 getData 方法。


说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号