java B2B2C Springcloud电子商务平台源码------Hystrix的缓存使用
一 介绍
在高并发的场景之下,Hystrix中提供了请求缓存的功能,可以方便地开启和使用请求缓存来优化系统,达到减轻高并发时请求线程的消耗、降低请求响应时间的效果。愿意了解源码的朋友直接求求交流分享技术:二一四七七七五六三三
二开启请求缓存功能
在实现HystrixCommand或HystrixObservableCommand时,通过重载getCacheKey()方法来开启请求缓存。
例如:
public class CommandUsingRequestCache extends HystrixCommand<Boolean> {
private final int value;
protected CommandUsingRequestCache(int value) {
super(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"));
this.value = value;
}
@Override
protected Boolean run() {
return value == 0 || value % 2 == 0;
}
//通过getCacheKey方法中返回的请求缓存key值,就能让该请求命令具备缓存功能。此时当不同的外部请求
//处理逻辑调用了同一个依赖服务时,Hystrix会根据getCacheKey方法返回的值区分是否是重复请求,
//如果它们的cachekey相同时候,那么该依赖服务值会在第一个请求达到时被真实的调用一次,另外一个
//请求则直接从请求缓存中返回结果,所以开启缓存有以下好处:
//减少重复请求数,降低依赖服务的并发度
//在同一用户请求的上下文中,相同依赖服务的返回数据始终保持一致。
//请求缓存在run()和construct()执行之前生效,所以可以有效减少不必要的线程开销。
@Override
protected String getCacheKey() {
return String.valueOf(value);
}
}
三 清理失效缓存功能
使用请求缓存时,如果只是读操作,那么不需要考虑缓存内容是否正确的问题,但是如果请求命令中还有更新数据的操作,那么缓存中的数据就需要我们在进行写操作时进行及时处理,以防止读操作的请求命令获取到失效的数据。
在Hystrix中,可以通过HystrixRequestCache.clear()方法来进行缓存的清理。
例如:
//当我们对GetterCommand命令实现了请求缓存之后,那么势必需要为SetterCommand命令实现清理缓存,以保证
//prefixStoredOnRemoteDataStore被更新之后,Hystrix请求缓存中相同的缓存的结果被移除,这样下一次根据id
//获取prefixStoredOnRemoteDataStore时,不会从缓存去获取数据
public class CommandUsingRequestCacheInvalidation {
/* represents a remote data store */
private static volatile String prefixStoredOnRemoteDataStore = "ValueBeforeSet_";
//根据id获取数据
public static class GetterCommand extends HystrixCommand<String> {
private static final HystrixCommandKey GETTER_KEY = HystrixCommandKey.Factory.asKey("GetterCommand");
private final int id;
public GetterCommand(int id) {
super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("GetSetGet"))
.andCommandKey(GETTER_KEY));
this.id = id;
}
@Override
protected String run() {
return prefixStoredOnRemoteDataStore + id;
}
@Override
protected String getCacheKey() {
return String.valueOf(id);
}
//该方法从默认的Hystrix并发策略中根据GETTER_KEY获取命令的请求缓存对象HystrixRequestCache的实例
//然后再调用该请求缓存对象的clear方法,对Key为id值的缓存内容进行清理。
public static void flushCache(int id) {
HystrixRequestCache.getInstance(GETTER_KEY,
HystrixConcurrencyStrategyDefault.getInstance()).clear(String.valueOf(id));
}
}
//用于更新prefixStoredOnRemoteDataStore的值
public static class SetterCommand extends HystrixCommand<Void> {
private final int id;
private final String prefix;
public SetterCommand(int id, String prefix) {
super(HystrixCommandGroupKey.Factory.asKey("GetSetGet"));
this.id = id;
this.prefix = prefix;
}
@Override
protected Void run() {
// persist the value against the datastore
prefixStoredOnRemoteDataStore = prefix;
//在调用了写prefixStoredOnRemoteDataStore之后,增加了对GetterCommand
//中静态方法flushCache的调用,以实现对时效缓存的清理工作。
GetterCommand.flushCache(id);
// no return value
return null;
}
}
}
代码结构如下:资料和源码来源

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
为什么要学习Python?这10个理由足够了!
如果你定期关注现今的科技发展,那么你可能想知道我为什么要写这篇文章告诉人们学习Python?因为几年前我提倡Java而不是Python。 在2016年,Python取代Java成为高校中最受欢迎的语言,从那时起它受欢迎的程度就没有减退过。 但是,随着新时代的到来,Python正在不断发展壮大。如果你阅读编程和技术新闻或博客文章,那么你可能已经发现了Python的兴起,因为许多流行的开发人员社区,包括StackOverFlow和CodeAcademy都提到了Python作为主要编程语言的兴起。 但是,最大的问题是为什么程序员应该学习Python? 作为一名Java开发人员,我很喜欢它,并且始终会去学习它。但是,这并不能阻止我们学习潜在的新工具和编程语言,这将使我们成为一个更好的程序员。 对于初学者来说很简单,从Python开始是最好的选择。因
-
下一篇
java B2B2C源码电子商务平台 ---搭建Eureka注册中心
一创建一个SpringBoot工程,命名为eureka-server,并在pom.xml中引入必要的依赖,代码如下。愿意了解源码的朋友直接求求交流分享技术:二一四七七七五六三三 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.3.7.RELEASE</version> <relativePath/> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version> </properties> <dependencies> <depen...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker容器配置,解决镜像无法拉取问题
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS8编译安装MySQL8.0.19
- MySQL数据库在高并发下的优化方案
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Dcoker安装(在线仓库),最新的服务器搭配容器使用