1.引言

Hystrix 为了降低访问服务的频率,支持将一个请求与返回结果做缓存处理。如果再次请求的 URL 没有变化,那么 Hystrix 不会请求服务,而是直接从缓存中将结果返回。这样可以大大降低访问服务的压力。

Hystrix 自带缓存。有两个缺点:

1.是一个本地缓存。在集群情况下缓存是不能同步的。
2.不支持第三方缓存容器。Redis,memcache 不支持的。

所以我们使用spring的cache。

2.redis环境

启动redis服务
玩转SpringCloud专题(十六)-SpringCloud之Hystrix缓存_spring

2.添加依赖

添加Hystrix和redis相关的依赖

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>1.3.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

3.修改配置文件

在application.properties中添加redis的相关配置

# Redis
spring.redis.database=0
#Redis 服务器地址
spring.redis.host=127.0.0.1
#Redis 服务器连接端口
spring.redis.port=6379
#Redis 服务器连接密码(默认为空)
spring.redis.password=
#连接池最大连接数(负值表示没有限制)
spring.redis.pool.max-active=100
#连接池最大阻塞等待时间(负值表示没有限制)
spring.redis.pool.max-wait=3000
#连接池最大空闭连接数
spring.redis.pool.max-idle=200
#连接汉最小空闲连接数
spring.redis.pool.min-idle=50
#连接超时时间(毫秒)
spring.redis.pool.timeout=600

4.修改启动类

添加​​@EnableCaching​​ 注解放开缓存

/**
* @author bruceliu
* @create 2019-10-15 14:36
* @description
*/
@SpringBootApplication
@EnableDiscoveryClient // 开启EurekaClient功能
@EnableFeignClients // 开启Feign功能
@EnableCircuitBreaker//对hystrixR熔断机制的支持
@EnableCaching // 开启缓存@EnableCaching // 开启缓存
public class ConsumerApp {

public static void main(String[] args) {
System.out.println("服务的调用端启动8082.....");
SpringApplication.run(ConsumerApp.class,args);
}
}

5.缓存处理

service中添加对应的处理方法

package com.bruceliu.cache;

import com.bruceliu.bean.User;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Component;

/**
* @BelongsProject: springcloud0310
* @BelongsPackage: com.bruceliu.cache
* @Author: bruceliu
* @QQ:1241488705
* @CreateTime: 2020-03-11 17:15
* @Description: TODO
*/
@CacheConfig(cacheNames={"com.bruceliu"})
@Component
public class UserCache {

/**
* 根据用户id查询
* @param id
* @return
*/
@Cacheable(key = "'user' + #id")
public User getUserById(Integer id) {
System.out.println("*******查询*************:" + id);
User u = new User();
u.setId(9999);
u.setUsername("缓存中用户名");
u.setNote("缓存中备注");
return u;
}

/**
* 根据用户id删除数据
* @param id
* @CacheEvict 清除缓存
*/
@CacheEvict(key = "'user' + #id")
public void deleteUserById(Integer id) {
System.out.println("------删除缓存-----:" + id);
}

}
@Cacheable:添加缓存
@CacheEvict:删除缓存

同时注意此注解

同时controller中添加对应的调用方法

@RequestMapping(value = "/getUser", method = RequestMethod.GET)
public User getUser(Integer id) {
return this.userCache.getUserById(id);
}

@RequestMapping(value = "/del", method = RequestMethod.GET)
public void del(Integer id) {
this.userCache.deleteUserById(id);
}

6.测试

启动consumer服务,分别访问请求,查看效果
玩转SpringCloud专题(十六)-SpringCloud之Hystrix缓存_缓存_02
User类需要序列化,然后重启再访问,第一次访问
玩转SpringCloud专题(十六)-SpringCloud之Hystrix缓存_redis_03
玩转SpringCloud专题(十六)-SpringCloud之Hystrix缓存_缓存_04
同时查看redis中数据
玩转SpringCloud专题(十六)-SpringCloud之Hystrix缓存_redis_05
有了缓存数据,第二次访问id为22的数据就会从缓存中取数据了,这个效果自行演示。调用del方法会将我们的缓存删除。
玩转SpringCloud专题(十六)-SpringCloud之Hystrix缓存_redis_06
玩转SpringCloud专题(十六)-SpringCloud之Hystrix缓存_缓存_07