zoukankan      html  css  js  c++  java
  • springboot实现内存缓存

    题记:实现缓存大部分可以使用redis实现,简单、便捷,redis在针对应用部署多服务器是很好的,但如果针对单一服务器,内存缓存更好。

    1、创建CacheLoader.java

    import java.util.Iterator;
    import java.util.Map;
    
    /**
     * Created by Tisa on 2018/5/9.
     * 将数据库表记录加载到jvm
     */
    public class CacheLoader<V,T> {
        /**
         * 将数据库中的记录加载到jvm缓存,使用Map存储
         *
         * @param from 从数据库load出的记录
         * @param to
         */
        public void loadCache(Map<V, T> from, Map<V, T> to) {
            if (!from.isEmpty()) {
                Iterator<V> iterator = to.keySet().iterator();
                while (iterator.hasNext()) {
                    V key = iterator.next();
                    if (to.containsKey(key)) {
                        to.remove(key);
                    }
                }
                to.putAll(from);
            } else {
                to.clear();
            }
        }
    }

    2、在springboot启动项目时加载进内存,创建ProvinceAppkeyAndSecretCache.java 

    import com.entity.ProvinceAppkeyAndAppsecret;
    import com.entity.ProvinceInfo;
    import com.mapper.ProvinceAppkeyAndSecretMapper;
    import com.mapper.ProvinceInfoMapper;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    
    import javax.annotation.PostConstruct;
    import java.util.*;
    import java.util.concurrent.ConcurrentHashMap;
    
    /**
     * @author:yangwj
     */
    @Component
    public class ProvinceAppkeyAndSecretCache {
        private static final Map<String, ProvinceAppkeyAndAppsecret> provinceAppkeyAndSecretCache = new ConcurrentHashMap<>();
        @Autowired
        private ProvinceAppkeyAndSecretMapper provinceAppkeyAndSecretMapper;
    
        @PostConstruct
        public void init() {
            Map<String, ProvinceAppkeyAndAppsecret> provinceAppkeyAndSecretMap = loadProvinceInfo();
            CacheLoader<String, ProvinceAppkeyAndAppsecret> loader = new CacheLoader<String, ProvinceAppkeyAndAppsecret>();
            loader.loadCache(provinceAppkeyAndSecretMap, provinceAppkeyAndSecretCache);
        }
    
        private Map<String, ProvinceAppkeyAndAppsecret> loadProvinceInfo() {
            Map<String, ProvinceAppkeyAndAppsecret> map = new HashMap<>();
            List<ProvinceAppkeyAndAppsecret> list = provinceAppkeyAndSecretMapper.selectAll();
            if (list == null) {
                return Collections.emptyMap();
            }
            Iterator<ProvinceAppkeyAndAppsecret> iterator = list.iterator();
            while (iterator.hasNext()) {
                ProvinceAppkeyAndAppsecret next = iterator.next();
                map.put(next.getAppkey(), next);
            }
            return map;
        }
    
        public ProvinceAppkeyAndAppsecret get(String appkey) {
            return provinceAppkeyAndSecretCache.get(appkey);
        }
    }

    3、在controller中调用

    @RestController
    @RequestMapping("Cache")
    public class CacheController extends BaseOrderController {
            private static final Logger LOGGER = LoggerFactory.getLogger(com.controller.CacheController.class);
    
            @Autowired
            private ProvinceAppkeyAndSecretCache provinceAppkeyAndSecretCache;
    
            @RequestMapping("/cache")
            public String orderRelationUpdateNotify(HttpServletRequest request) {
                String appKey = request.getParameter("appKey");
                //从内存中获取
                ProvinceAppkeyAndAppsecret provinceAppkeyAndAppsecret =provinceAppkeyAndSecretCache.get(appKey);
            }
    }
  • 相关阅读:
    MVC View基础(转)
    ASP.NET MVC:自定义 Route 生成小写 Url(转)
    python抓取360百科踩过的坑!
    数组循环移位的几种解法
    volatile型变量自增操作的隐患
    HAWQ技术解析(十八) —— 问题排查
    系列网页。前端开发流程
    Python图像处理(8):边缘检測
    析构函数
    Spring(八)编码剖析@Resource注解的实现原理
  • 原文地址:https://www.cnblogs.com/ywjfx/p/10026524.html
Copyright © 2011-2022 走看看