点击下载教程项目代码:netflix_hystrix_demo.zip
@CacheRemove 是 Hystrix 框架中用于控制缓存清除操作的一个注解。
当一个被 @HystrixCommand 注解修饰的方法启用缓存(通常通过 @CacheResult 注解等方式)后,Hystrix 会根据方法的参数等因素将其结果缓存起来。而 @CacheRemove 注解可以指定在其他方法执行时清除相关缓存。
例如,假设有一个服务提供用户信息查询功能,通过 @CacheResult 缓存了 getUserById 方法的结果。当用户信息更新时,就可以使用 @CacheRemove 在更新用户信息的方法上标注,以清除缓存中旧的用户信息。
@CacheRemove 注解源码如下:
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 methods used to invalidate cache of a command. * 标记用于使命令缓存无效的方法。 * Generated cache key must be same as key generated within {@link CacheResult} context. * * @author dmgcodevil */ @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD}) @Documented public @interface CacheRemove { /** * Command name is used to find appropriate Hystrix command that cache should be cleared. * 命令名称用于找到应清除缓存的适当 Hystrix 命令。 * @return command name */ String commandKey(); /** * Method name to be used to get a key for request caching. * 用于获取请求缓存键的方法名称。 * The command and cache key method should be placed in the same class and have same method signature except * cache key method return type, that should be <code>String</code>. * 命令和缓存键方法应放在同一个类中,并且除了缓存键方法的返回类型(应为“String”)外,具有相同的方法签名。 * <p/> * cacheKeyMethod has higher priority than an arguments of a method, that means what actual arguments * of a method that annotated with {@link CacheResult} will not be used to generate cache key, instead specified * cacheKeyMethod fully assigns to itself responsibility for cache key generation. * cacheKeyMethod(缓存键方法)比方法的参数具有更高的优先级,这意味着用 @CacheResult * 注解的方法的实际参数将不会用于生成缓存键,相反, * 指定的 cacheKeyMethod 完全承担了生成缓存键的责任。 * By default this returns empty string which means "do not use cache method". * 默认情况下,这将返回空字符串,意思是“不使用缓存方法”。 * @return method name or empty string */ String cacheKeyMethod() default ""; }
@CacheRemove 注解的属性如下:
用于指定对应的 Hystrix 命令的键值,也就是要清除其缓存的那个 Hystrix 命令,一般就是关联的被 @HystrixCommand 注解标注且有缓存设置(如使用了 @CacheResult )的方法名称,如果不指定,默认会根据方法名来匹配。
指定生成缓存键的方法,这个方法与之前设置缓存时生成缓存键的方法通常是同一个,以此来确保能准确找到需要被清除的缓存项对应的缓存键,该方法需要返回一个字符串类型的缓存键值。
该注解通常会与 @HystrixCommand 注解一起配合应用在相关的方法上。当带有 @CacheRemove 注解的方法被执行时,就会触发缓存清除动作。例如:
@Service public class MyService { @CacheResult(cacheKeyMethod = "generateCacheKey") @HystrixCommand public String getData(String key) { // 模拟获取数据的操作 } // 移除缓存 @CacheRemove(commandKey = "getData", cacheKeyMethod = "generateCacheKey") @HystrixCommand public void updateData(String key) { // 模拟更新数据的操作,此处重点在于触发缓存清除 } private String generateCacheKey(String key) { return "cacheKey:" + key; } }
在上述示例中,getData 方法使用了 @CacheResult 注解用于缓存该方法的执行结果,其缓存键通过 generateCacheKey 方法生成。而 updateData 方法使用了 @CacheRemove 注解,当 updateData 方法执行(比如模拟的数据更新操作完成后),会基于 getData 方法(通过 commandKey 指定)对应的缓存键(由 cacheKeyMethod 生成)来清除相应的缓存数据,这样后续再调用 getData 方法获取数据时,就会重新执行方法去获取最新的数据,而不是使用旧的缓存数据。