点击下载教程项目代码:netflix_hystrix_demo.zip
@CacheKey 注解是 Hystrix 中用于指定缓存 key 的注解,它在方法级别上使用,主要用于控制 Hystrix 命令的缓存行为。
在使用 Hystrix 实现服务容错和降级的过程中,缓存是提高性能的一种重要手段。@CacheKey 注解能够帮助开发人员明确指定哪些参数或参数组合应该作为缓存的键,以便 Hystrix 能够根据这些键来缓存和检索命令的执行结果,从而避免不必要的重复执行,提高系统的响应速度和性能。
@CacheKey 注解通常与 @HystrixCommand 注解一起使用,并且可以标注在方法的参数上。当一个方法被 @HystrixCommand 注解标记为 Hystrix 命令时,Hystrix 会根据 @CacheKey 注解所标注的参数值来生成缓存键,并将该命令的执行结果缓存起来。下次再调用相同的命令且参数值相同时,Hystrix 会直接从缓存中获取结果,而不会再次执行该命令。
@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 方法。