请选择 进入手机版 | 继续访问电脑版
本站特色:极好的技术研究氛围!所有技术交流,必有回复!

疯狂Java联盟

 找回密码
 加入联盟
查看: 224|回复: 1

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

[复制链接]
发表于 2018-12-7 16:02:22 | 显示全部楼层 |阅读模式
一 介绍

在高并发的场景之下,Hystrix中提供了请求缓存的功能,可以方便地开启和使用请求缓存来优化系统,达到减轻高并发时请求线程的消耗、降低请求响应时间的效果。愿意了解源码的朋友直接求求交流分享技术:二一四七七七五六三三

二开启请求缓存功能

在实现HystrixCommand或HystrixObservableCommand时,通过重载getCacheKey()方法来开启请求缓存。

例如:

  1. public class CommandUsingRequestCache extends HystrixCommand<Boolean> {



  2.     private final int value;



  3.     protected CommandUsingRequestCache(int value) {

  4.         super(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"));

  5.         this.value = value;

  6.     }



  7.     @Override

  8.     protected Boolean run() {

  9.         return value == 0 || value % 2 == 0;

  10.     }



  11.     //通过getCacheKey方法中返回的请求缓存key值,就能让该请求命令具备缓存功能。此时当不同的外部请求

  12.     //处理逻辑调用了同一个依赖服务时,Hystrix会根据getCacheKey方法返回的值区分是否是重复请求,

  13.     //如果它们的cachekey相同时候,那么该依赖服务值会在第一个请求达到时被真实的调用一次,另外一个

  14.     //请求则直接从请求缓存中返回结果,所以开启缓存有以下好处:

  15.     //减少重复请求数,降低依赖服务的并发度

  16.     //在同一用户请求的上下文中,相同依赖服务的返回数据始终保持一致。

  17.     //请求缓存在run()和construct()执行之前生效,所以可以有效减少不必要的线程开销。

  18.     @Override

  19.     protected String getCacheKey() {

  20.         return String.valueOf(value);

  21.     }

  22. }
复制代码

三 清理失效缓存功能

使用请求缓存时,如果只是读操作,那么不需要考虑缓存内容是否正确的问题,但是如果请求命令中还有更新数据的操作,那么缓存中的数据就需要我们在进行写操作时进行及时处理,以防止读操作的请求命令获取到失效的数据。

在Hystrix中,可以通过HystrixRequestCache.clear()方法来进行缓存的清理。

例如:


  1. //当我们对GetterCommand命令实现了请求缓存之后,那么势必需要为SetterCommand命令实现清理缓存,以保证

  2. //prefixStoredOnRemoteDataStore被更新之后,Hystrix请求缓存中相同的缓存的结果被移除,这样下一次根据id

  3. //获取prefixStoredOnRemoteDataStore时,不会从缓存去获取数据

  4. public class CommandUsingRequestCacheInvalidation {



  5.     /* represents a remote data store */

  6.     private static volatile String prefixStoredOnRemoteDataStore = "ValueBeforeSet_";



  7.     //根据id获取数据

  8.     public static class GetterCommand extends HystrixCommand<String> {



  9.         private static final HystrixCommandKey GETTER_KEY = HystrixCommandKey.Factory.asKey("GetterCommand");

  10.         private final int id;



  11.         public GetterCommand(int id) {

  12.             super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("GetSetGet"))

  13.                     .andCommandKey(GETTER_KEY));

  14.             this.id = id;

  15.         }



  16.         @Override

  17.         protected String run() {

  18.             return prefixStoredOnRemoteDataStore + id;

  19.         }



  20.         @Override

  21.         protected String getCacheKey() {

  22.             return String.valueOf(id);

  23.         }



  24.         //该方法从默认的Hystrix并发策略中根据GETTER_KEY获取命令的请求缓存对象HystrixRequestCache的实例

  25.         //然后再调用该请求缓存对象的clear方法,对Key为id值的缓存内容进行清理。

  26.         public static void flushCache(int id) {

  27.             HystrixRequestCache.getInstance(GETTER_KEY,

  28.                     HystrixConcurrencyStrategyDefault.getInstance()).clear(String.valueOf(id));

  29.         }



  30.     }

  31.     //用于更新prefixStoredOnRemoteDataStore的值

  32.     public static class SetterCommand extends HystrixCommand<Void> {



  33.         private final int id;

  34.         private final String prefix;



  35.         public SetterCommand(int id, String prefix) {

  36.             super(HystrixCommandGroupKey.Factory.asKey("GetSetGet"));

  37.             this.id = id;

  38.             this.prefix = prefix;

  39.         }



  40.         @Override

  41.         protected Void run() {

  42.             // persist the value against the datastore

  43.             prefixStoredOnRemoteDataStore = prefix;

  44.             //在调用了写prefixStoredOnRemoteDataStore之后,增加了对GetterCommand

  45.             //中静态方法flushCache的调用,以实现对时效缓存的清理工作。

  46.             GetterCommand.flushCache(id);

  47.             // no return value

  48.             return null;

  49.         }

  50.     }

  51. }
复制代码

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

 楼主| 发表于 2018-12-7 16:02:48 | 显示全部楼层
喜欢文章的可以持续关注更新哦
您需要登录后才可以回帖 登录 | 加入联盟

本版积分规则

视频、代码、电子书下载
请关注"疯狂图书"公众号
QQ交流1群: 545923995  未满
微信群请扫二维码
QQ交流1群:
545923995
(未满)

小黑屋|手机版|Archiver|疯狂Java联盟 ( 粤ICP备11094030号 )

GMT+8, 2019-1-22 20:47 , Processed in 0.331608 second(s), 7 queries , File On.

快速回复 返回顶部 返回列表