一 介绍

在高并发的场景之下,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;}@Overrideprotected Boolean run() {return value == 0 || value % 2 == 0;}//通过getCacheKey方法中返回的请求缓存key值,就能让该请求命令具备缓存功能。此时当不同的外部请求//处理逻辑调用了同一个依赖服务时,Hystrix会根据getCacheKey方法返回的值区分是否是重复请求,//如果它们的cachekey相同时候,那么该依赖服务值会在第一个请求达到时被真实的调用一次,另外一个//请求则直接从请求缓存中返回结果,所以开启缓存有以下好处://减少重复请求数,降低依赖服务的并发度//在同一用户请求的上下文中,相同依赖服务的返回数据始终保持一致。//请求缓存在run()和construct()执行之前生效,所以可以有效减少不必要的线程开销。@Overrideprotected 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;}@Overrideprotected String run() {return prefixStoredOnRemoteDataStore + id;}@Overrideprotected 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;}@Overrideprotected Void run() {// persist the value against the datastoreprefixStoredOnRemoteDataStore = prefix;//在调用了写prefixStoredOnRemoteDataStore之后,增加了对GetterCommand//中静态方法flushCache的调用,以实现对时效缓存的清理工作。GetterCommand.flushCache(id);// no return valuereturn null;}}
}
复制代码

整体代码结构如下: 资料和源码来源

转载于:https://juejin.im/post/5c09e045f265da617006eecc

java B2B2C Springcloud电子商务平台源码------Hystrix的缓存使用相关推荐

  1. java B2B2C Springcloud电子商务平台源码-服务网关过滤器

    过滤器作用 我们的微服务应用提供的接口就可以通过统一的API网关入口被客户端访问到了.但是,每个客户端用户请求微服务应用提供的接口时,它们的访问权限往往都需要有一定的限制,系统并不会将所有的微服务接口 ...

  2. java B2B2C Springcloud电子商务平台源码-RabbitMQ基础概念...

    RabbitMQ是一个由erlang开发的AMQP的开源实现. 需要JAVA Spring Cloud大型企业分布式微服务云构建的B2B2C电子商务平台源码 一零三八七七四六二六 AMQP,即Adva ...

  3. java B2B2C Springcloud电子商务平台源码 -Feign之源码解析

    什么是Feign Feign是受到Retrofit,JAXRS-2.0和WebSocket的影响,它是一个jav的到http客户端绑定的开源项目. Feign的主要目标是将Java Http 客户端变 ...

  4. java B2B2C Springcloud电子商务平台源码-security简单使用

    security的简单原理: 需要JAVA Spring Cloud大型企业分布式微服务云构建的B2B2C电子商务平台源码:壹零叁八柒柒肆六二六 使用众多的拦截器对url拦截,以此来管理权限.但是这么 ...

  5. java B2B2C Springcloud电子商务平台源码

    鸿鹄云商大型企业分布式互联网电子商务平台,推出PC+微信+APP+云服务的云商平台系统,其中包括B2B.B2C.C2C.O2O.新零售.直播电商等子平台.愿意了解源码的朋友直接求求交流分享技术:二一四 ...

  6. java B2B2C Springboot电子商务平台源码-Feign 基本使用

    1. [microcloud-consumer-feign]为了可以使用到 feign 支持,需要修改 pom.xml 配置文件,引入相关依赖包:需要JAVA Spring Cloud大型企业分布式微 ...

  7. java B2B2C Springboot电子商务平台源码-Feign设计原理

    什么是Feign? 电子商务平台源码请加企鹅求求:一零三八七七四六二六.Feign 的英文表意为"假装,伪装,变形", 是一个http请求调用的轻量级框架,可以以Java接口注解的 ...

  8. java B2B2C Springboot电子商务平台源码-SSO单点登录之OAuth2.0登录认证

    之前写了很多关于spring cloud的文章,今天我们对OAuth2.0的整合方式做一下笔记,首先我从网上找了一些关于OAuth2.0的一些基础知识点,帮助大家回顾一下知识点: 一.oauth中的角 ...

  9. java B2B2C springmvc mybatis电子商务平台源码

    用java实施的电子商务平台太少了,使用spring cloud技术构建的b2b2c电子商务平台更少,大型企业分布式互联网电子商务平台,推出PC+微信+APP+云服务的云商平台系统,其中包括B2B.B ...

最新文章

  1. Reddit引入Envoy支持架构改造,性能显著提升
  2. thrift使用小记_CUDev-ChinaUnix博客
  3. centos查看模块信息和模块路径
  4. C/C++中的数据类型转换
  5. 禁用内存清理_win10电脑开机内存占用高达80%以上如何解决
  6. 欢乐纪中某A组赛【2019.1.19】
  7. 1、Springboot环境的搭建
  8. 人工智能TensorFlow工作笔记007---认识张量
  9. 产品设计中不可忽视的意见反馈功能
  10. 数控编程球面计算机,Mastercam9.1的数控编程
  11. Python·设计模式
  12. python画离散点_python 画散点图
  13. 笔记本电脑怎么录制屏幕
  14. DTU有什么用?工业级DTU的特点是啥?
  15. 电力监控服务器维修,地铁电力监控系统(PSCADA)发生故障应该如何处理
  16. 用户体验 | 银行如何优化APP用户体验
  17. 怎样用excel剔除异常数据_注意避坑 | 这10个错误的Excel使用方法别再用了!
  18. 【羊了个羊】什么!第二关难如上青天,能不能简单版??
  19. python 定时发送微信,利用python在微信中实现一个定时发送消息的功能
  20. 高级OS(十五) - 中断机制以及中断上下部运行和内核代码分析

热门文章

  1. 孤岛惊魂3闪退win10win11下运行办法
  2. 三国群英传霸业之王服务器维护,《三国群英传:霸王之业》1月7日维护更新公告...
  3. 如何修改mc服务器密码是什么意思,mc服务器密码设置密码
  4. 科研热点|2022诺贝尔奖各领域奖项已揭晓(附获奖者详细信息)~
  5. git分支(存在意义和使用方法)
  6. 整理一些es6的基础东西。记录成长
  7. 说说计算机发展史在你印象里都有哪些内容,第三课 时间的脚印(精选5篇)
  8. html倒计时10s,vue做30s倒计时,在最后10s倒数的时候有个放大的效果
  9. 平克四部曲之《白板》
  10. 利用switch实现春夏秋冬