• 中国正青春大型征集,iphoneX等着你! 2019-08-16
  • 《人民日报》与红旗渠 2019-08-16
  • “双一流”建设名单落地:非新无以为进,非旧无以为守 2019-08-09
  • 佛山中式家居品牌“大招”强势登入东阳红木家具市场 2019-08-05
  • 湖南第六批短期援藏队联合中南大学湘雅医院在山南市开展“爱眼护眼”活动 2019-08-05
  • “常青藤爸爸”一年盈利5000万秘方:靠质量和流量 2019-07-18
  • “她用生命完成了最后一堂课” 2019-07-18
  • 各地聚焦学习十九大精神--新疆频道--人民网 2019-07-17
  • 龙船礼 有讲究 百岁龙 抖精神 2019-07-14
  • 王岐山会见土耳其外长恰武什奥卢 2019-07-14
  • 校企共赢 奥园与北大经济学院达成合作并共同举行中国经济高端论坛 ——凤凰网房产北京 2019-07-05
  • 汕头一企业埋暗管偷排 4直接责任人被刑事拘留 2019-06-28
  • 坚守岗位守护绿城美丽与整洁 2019-06-02
  • 最高降39.28万元 捷豹路虎进口车型调价 2019-06-02
  • 新华时评:磋商,不等于反复折腾 2019-05-03
  • 五分钟内反应回复,平均十分钟解决任何IT技术问题,按难度跟工作量收费!

    彩票开奖:java B2B2C Springcloud电子商务平台源码------Hystrix的缓存使用

    IT侠客 |浏览249次 |售价:0元 |联系博客主
    收藏|2018/12/07 11:27

    陕西11选5前二和值走势图 www.wpyw.net 一 介绍


    在高并发的场景之下,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;
            }
        }
    }

    整体代码结构如下:

    代码.jpg

    咨询/回复该博客即可获得 2 经验值,咨询/回复被采纳即可获得 2 经验值!
    咨询/回复

    验证码

      换一个
    全部回答(0)
    +1
     加载中...
  • 中国正青春大型征集,iphoneX等着你! 2019-08-16
  • 《人民日报》与红旗渠 2019-08-16
  • “双一流”建设名单落地:非新无以为进,非旧无以为守 2019-08-09
  • 佛山中式家居品牌“大招”强势登入东阳红木家具市场 2019-08-05
  • 湖南第六批短期援藏队联合中南大学湘雅医院在山南市开展“爱眼护眼”活动 2019-08-05
  • “常青藤爸爸”一年盈利5000万秘方:靠质量和流量 2019-07-18
  • “她用生命完成了最后一堂课” 2019-07-18
  • 各地聚焦学习十九大精神--新疆频道--人民网 2019-07-17
  • 龙船礼 有讲究 百岁龙 抖精神 2019-07-14
  • 王岐山会见土耳其外长恰武什奥卢 2019-07-14
  • 校企共赢 奥园与北大经济学院达成合作并共同举行中国经济高端论坛 ——凤凰网房产北京 2019-07-05
  • 汕头一企业埋暗管偷排 4直接责任人被刑事拘留 2019-06-28
  • 坚守岗位守护绿城美丽与整洁 2019-06-02
  • 最高降39.28万元 捷豹路虎进口车型调价 2019-06-02
  • 新华时评:磋商,不等于反复折腾 2019-05-03
  • 竞猜计算器 湖北快乐十分十一选五 福建22选5大星走势图 单双中特 安徽新11选5开奖走势 三期极限平特肖尾 双色球现场直播 排列p5走势图 赛马会彩票官方下载 体育彩票6十1开奖今天 北京pk赛车投注官网 深圳风采2019031 重庆幸运农场网上买 体育彩票竟彩足球 360湖北快3遗漏数据