和@HystrixCommand 同时使用的话怎么保证@CacheableResult拿到正确的返回结果
时间: 2023-11-30 14:18:52 浏览: 114
在使用`@CacheableResult`和`@HystrixCommand`同时使用时,可以在`HystrixCommand`的`fallbackMethod`中先从缓存中获取结果,如果缓存中存在,则直接返回缓存中的结果,否则执行`fallbackMethod`并将`fallbackMethod`的返回结果存到缓存中。具体实现如下:
1. 定义`CacheableResult`注解:
```java
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CacheableResult {
String value();
}
```
2. 定义缓存管理类`CacheManager`:
```java
@Component
public class CacheManager {
private static final Map<String, Object> CACHE = new ConcurrentHashMap<>();
public Object get(String key) {
return CACHE.get(key);
}
public void put(String key, Object value) {
CACHE.put(key, value);
}
}
```
3. 定义AOP切面`CacheableResultAspect`,用于拦截被`@CacheableResult`注解的方法并实现缓存功能:
```java
@Aspect
@Component
public class CacheableResultAspect {
@Autowired
private CacheManager cacheManager;
@Around("@annotation(cacheableResult)")
public Object cacheableResult(ProceedingJoinPoint joinPoint, CacheableResult cacheableResult) throws Throwable {
String key = cacheableResult.value();
Object result = cacheManager.get(key);
if (result != null) {
return result;
}
result = joinPoint.proceed();
cacheManager.put(key, result);
return result;
}
}
```
4. 在需要缓存结果的方法上添加`@CacheableResult`注解,并指定缓存的key:
```java
@Service
public class UserService {
@Autowired
private CacheManager cacheManager;
@CacheableResult("user:1")
@HystrixCommand(fallbackMethod = "getUserByIdFallback")
public User getUserById(Long id) {
// 从数据库中查询用户信息
User user = userDao.getUserById(id);
return user;
}
public User getUserByIdFallback(Long id) {
String key = "user:" + id;
Object result = cacheManager.get(key);
if (result != null) {
return (User) result;
}
return new User();
}
// ...
}
```
这样,在`getUserById`方法执行时,如果缓存中已经存在id为1的用户信息,则直接返回缓存中的结果,否则执行`getUserById`方法并将返回结果存到缓存中。如果`getUserById`方法执行失败,则执行`getUserByIdFallback`方法。在`getUserByIdFallback`方法中,先从缓存中获取结果,如果缓存中存在,则直接返回缓存中的结果,否则返回一个空的`User`对象。这样,就可以保证在使用`@CacheableResult`和`@HystrixCommand`同时使用时,`@CacheableResult`拿到的是正确的返回结果了。
阅读全文