1.引言
Hystrix 为了降低访问服务的频率,支持将一个请求与返回结果做缓存处理。如果再次请求的 URL 没有变化,那么 Hystrix 不会请求服务,而是直接从缓存中将结果返回。这样可以大大降低访问服务的压力。
Hystrix 自带缓存。有两个缺点:
1.是一个本地缓存。在集群情况下缓存是不能同步的。
2.不支持第三方缓存容器。Redis,memcache 不支持的。
所以我们使用spring的cache。
2.redis环境
启动redis服务
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
*/
// 开启EurekaClient功能
// 开启Feign功能
//对hystrixR熔断机制的支持
// 开启缓存@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
*/
(cacheNames={"com.bruceliu"})
public class UserCache {
/**
* 根据用户id查询
* @param id
* @return
*/
(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 清除缓存
*/
(key = "'user' + #id")
public void deleteUserById(Integer id) {
System.out.println("------删除缓存-----:" + id);
}
}
@Cacheable:添加缓存
@CacheEvict:删除缓存
同时注意此注解
同时controller中添加对应的调用方法
value = "/getUser", method = RequestMethod.GET)(
public User getUser(Integer id) {
return this.userCache.getUserById(id);
}
(value = "/del", method = RequestMethod.GET)
public void del(Integer id) {
this.userCache.deleteUserById(id);
}
6.测试
启动consumer服务,分别访问请求,查看效果
User类需要序列化,然后重启再访问,第一次访问
同时查看redis中数据
有了缓存数据,第二次访问id为22的数据就会从缓存中取数据了,这个效果自行演示。调用del方法会将我们的缓存删除。