zoukankan      html  css  js  c++  java
  • 不忘初心,方得始终。内存数据刷新改造小记

    获取地区数据的api接口(程序代码见文末),原先的实现是初次http请求时一次性加载到内存变量里,以后的调用则直接从内存变量读取。这样虽然快,但弊端显而易见,当数据有更新,只能通过重启站点服务的方式搞定。
    所以,要改造。
    直觉想到的是用redis缓存。

    在coding的时候,突然觉得还是从内存上做文章多好啊,毕竟读内存是最快的方式了。于是,想到了一个办法,每到整点清空数据变量。代码如下。使用地区数据的地方不再直接访问areaStr变量,而是调用getAreaStr()方法。

    import org.joda.time.DateTime;
    
    private static String areaStr = "";
    private  String getAreaStr(){
        //整点清除数据,重新调用rpc并加载到内存
        int minuteOfHour = DateTime.now().getMinuteOfHour();
        if (0 == minuteOfHour) {
            areaStr = "";
        }
    
        if (StringUtil.isBlank(areaStr)) {
            log.info("初始化地区数据到内存");
            //rpc请求
            areaStr = threeLevelClient.selectAreaList();
        }
        
        return areaStr;
    }

    还没等自测,我就意识到不对头了。这是web接口啊,那整点没有http请求的话,岂不是就达不到刷新数据的预期了!
    还是不忘初心的好!就用redis来搞。——考虑到数据量大,我还是做了点改动:把数据放到内存里,通过redis来控制内存数据的刷新。

    private static String areaStr = "";
    private static JedisCluster jc = JedisClusterUtil.getJedisCluster();
    
    // 地区数据量大(2712条),不宜直接放到redis里。这里通过redis控制内存数据的刷新。
    private void resetAreaStr() {
        final String areaStr_Key = "payment_api_areaStr";
        String value = jc.get(areaStr_Key);
        if (StringUtils.isBlank(value)) {
            areaStr = threeLevelClient.selectAreaList();
            jc.setex(areaStr_Key, 300, "1");
            log.info("重置redis缓存:" + areaStr_Key);
    
        }
        if (StringUtils.isBlank(areaStr)) {
            log.info("初始化地区数据到内存");
            //rpc请求
            areaStr = threeLevelClient.selectAreaList();
        }
    }

    这样无疑是不错的方案了。使用areaStr之前调用resetAreaStr()方法即可。

        @RequestMapping("cityQuery")
        public void cityQuery(HttpServletResponse response) throws Exception {
    
    //        log.debug("payment_api----获取地区列表:{}", areaStr);
            resetAreaStr();
            List<JSONObject> areaList = JSON.parseArray(areaStr, JSONObject.class);
    
            List<Map<String, String>> showAreaList = new ArrayList<>();
            areaList.forEach(one -> {
                Map<String, String> bankInfo = new HashMap<>();
                bankInfo.put("provinceName", one.getString("provinceName"));
                bankInfo.put("areaName", one.getString("areaName"));
                showAreaList.add(bankInfo);
            });
    
            log.info("集合size:{}", areaList.size());
    
            WebUtil.outputJson(showAreaList, response);
    
        }
  • 相关阅读:
    SVN的安装和使用手册2
    svn安装
    【1】第一篇 Postman的初级使用之设置环境快速切换生成环境与测试环境
    【4】Postman之Tests(断言)
    RIDE,如何指定report,log,output的存放位置
    python启动robotframework-ride失败,解决方案
    Python安装第三库超时的解决方法
    python 识别登陆验证码图片(完整代码)
    代码-字典
    Python数据分析入门
  • 原文地址:https://www.cnblogs.com/buguge/p/10603438.html
Copyright © 2011-2022 走看看