千家信息网

如何进行SpringCloud-Hystrix缓存与合并请求

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,如何进行SpringCloud-Hystrix缓存与合并请求,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。缓存在开发中经常用到,我们常用
千家信息网最后更新 2026年11月03日如何进行SpringCloud-Hystrix缓存与合并请求

如何进行SpringCloud-Hystrix缓存与合并请求,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

缓存在开发中经常用到,我们常用 Redis 这种第三方的缓存数据库对数据进行缓存处理。

结果缓存

在 Hystrix 中也为我们提供了方法级别的缓存。通过重写 getCacheKey 来判断是否返回缓存的数据,getCacheKey 可以根据参数来生成。这样,同样的参数就可以都用到缓存了。

改造之前的 MyHystrixCommand,在其中增加 getCacheKey 的重写实现,代码如下所示。

@Overrideprotected String getCacheKey() {return String.valueOf(this.name);}

在上面的代码中,我们把创建对象时传进来的 name 参数作为缓存的 key。

为了证明能够用到缓存,在 run 方法中加一行输出,在调用多次的情况下,如果控制台只输出了一次,那么可以知道后面的都是走的缓存逻辑,代码如下所示。

@Overrideprotected String run() {System.err.println("get data");return this.name + ":" + Thread.currentThread().getName();}

执行 main 方法,发现程序报错了,如图 1 所示:

完整错误信息如下:

Caused by: java.lang.IllegalStateException: Request caching is not available. Maybe you need to initialize the HystrixRequestContext?

根据错误提示可以知道,缓存的处理取决于请求的上下文,我们必须初始化 Hystrix-RequestContext。

改造 main 方法中的调用代码,初始化 HystrixRequestContext,代码如下所示。

public static void main(String[] args) throws InterruptedException, ExecutionException {    HystrixRequestContext context = HystrixRequestContext.initializeContext();    String result = new MyHystrixCommand("zhangsan").execute();    System.out.println(result);    Future future = new MyHystrixCommand("zhangsan").queue();    System.out.println(future.get());    context.shutdown();}

改造完之后重写执行 main 方法,就可以做正常运行了,输出结果如图 2 所示:

我们可以看到只输出了一次 get data,缓存生效。

缓存清除

刚刚我们学习了如何使用 Hystrix 来实现数据缓存功能。有缓存必然就有清除缓存的动作。

当数据发生变动时,必须将缓存中的数据也更新掉,不然就会出现脏数据的问题。同样地,Hystrix 也有清除缓存的功能。

增加一个支持缓存清除的类,代码如下所示。

public class ClearCacheHystrixCommand extends HystrixCommand {private final String name;private static final HystrixCommandKey GETTER_KEY = HystrixCommandKey.Factory.asKey("MyKey");public ClearCacheHystrixCommand(String name) {super(HystrixCommand.Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("MyGroup"))                .andCommandKey(GETTER_KEY));this.name = name;    }public static void flushCache(String name) {        HystrixRequestCache.getInstance(GETTER_KEY,HystrixConcurrencyStrategyDefault.getInstance()).clear(name);    }@Overrideprotected String getCacheKey() {return String.valueOf(this.name);    }@Overrideprotected String run() {        System.err.println("get data");return this.name + ":" + Thread.currentThread().getName();    }@Overrideprotected String getFallback() {return "失败了 ";    }}

flushCache 方法就是清除缓存的方法,通过 HystrixRequestCache 来执行清除操作,根据 getCacheKey 返回的 key 来清除。

修改调用代码来验证清除是否有效果,代码如下所示。

public static void main(String[] args) throws InterruptedException, ExecutionException {    HystrixRequestContext context = HystrixRequestContext.initializeContext();    String result = new ClearCacheHystrixCommand("zhangsan").execute();    System.out.println(result);    ClearCacheHystrixCommand.flushCache("zhangsan");    Future future = new ClearCacheHystrixCommand("zhangsan").queue();    System.out.println(future.get());}

执行两次相同的 key,在第二次执行之前调用缓存清除的方法,也就是说第二次用不到缓存,输出结果如图 3 所示:

由此可以看出,输出两次 get data,这证明缓存确实被清除了。可以把 ClearCache-HystrixCommand.flushCache 这行代码注释掉再执行一次,就会发现只输出了一次 get data,缓存是有效的,输入结果如图 2 所示。

合并请求

Hystrix 支持将多个请求自动合并为一个请求(代码如下所示),利用这个功能可以节省网络开销,比如每个请求都要通过网络访问远程资源。如果把多个请求合并为一个一起执行,将多次网络交互变成一次,则会极大地节省开销。

public class MyHystrixCollapser extends HystrixCollapser, String, String> {private final String name;public MyHystrixCollapser(String name) {this.name = name;    }@Overridepublic String getRequestArgument() {return name;    }@Overrideprotected HystrixCommand> createCommand(final Collection> requests) {return new BatchCommand(requests);    }@Overrideprotected void mapResponseToRequests(List batchResponse,            Collection> requests) {        int count = 0;for (CollapsedRequest request : requests) {            request.setResponse(batchResponse.get(count++));        }    }private static final class BatchCommand extends HystrixCommand> {private final Collection> requests;private BatchCommand(Collection> requests) {super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"))                    .andCommandKey(HystrixCommandKey.Factory.asKey("GetValueForKey")));this.requests = requests;        }@Overrideprotected List run() {            System.out.println(" 真正执行请求......");            ArrayList response = new ArrayList();for (CollapsedRequest request : requests) {                response.add(" 返回结果 : " + request.getArgument());            }return response;        }    }}

接下来编写测试代码,代码如下所示。

public static void main(String[] args) throws InterruptedException, ExecutionException {    HystrixRequestContext context = HystrixRequestContext.initializeContext();    Future f1 = new MyHystrixCollapser("zhangsan").queue();    Future f2 = new MyHystrixCollapser("zhangsan333").queue();    System.out.println(f1.get() + "=" + f2.get());    context.shutdown();}

通过 MyHystrixCollapser 创建两个执行任务,按照正常的逻辑肯定是分别执行这两个任务,通过 HystrixCollapser 可以将多个任务合并到一起执行。从输出结果就可以看出,任务的执行是在 run 方法中去做的,输出结果如图 4 所示:

看完上述内容,你们掌握如何进行SpringCloud-Hystrix缓存与合并请求的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

缓存 代码 方法 输出 数据 结果 如图 任务 功能 参数 多个 网络 问题 改造 两个 内容 开销 更多 逻辑 错误 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 广东万易互联网科技有限公司惠州分公司 互联网科技公司的优势 互联网金融监管科技数据 未来的互联网科技 联恩商钥互联网科技有限公司 卫星互联网科技股票 互联网之后的科技是什么 须眉科技是互联网公司吗 宁波青枫互联网科技有限公司 互联网科技实习生岗位职责 科技与互联网哪个更好 宜昌元轩互联网科技有限公司 恒生互联网科技指数跳水 呼和浩特新华互联网科技学院 互联网科技大奖都有哪些公司 北京市互联网新科技 启辰互联网科技 南京一网一红互联网科技有限公司 10位科技互联网大佬 互联网领先科技成果宣传视频 互联网黑科技 互联网医疗科技 平安科技 互联网 崇明区互联网教育科技诚信经营 想开互联网科技公司怎么样 华中科技大学互联网的牛人 互联网方面的科技前沿 智帮互联网科技公司最近动向 互联网领先科技活动 北京互联网科技类企业分布
0