AppRouteCache.java 2.18 KB
package com.java110.utils.cache;

import com.java110.dto.system.AppRoute;
import com.java110.utils.util.SerializeUtil;

import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 路由配置(带本地内存缓存,避免每次请求都查远程Redis)
 * Created by wuxw on 2018/4/14.
 */
public class AppRouteCache extends BaseCache {

    //后缀 用来刷缓存时删除 所有以这个为后缀的数据
    public final static String _SUFFIX_APP_ROUTE = "_SUFFIX_APP_ROUTE";

    // 本地内存缓存,避免每次请求都查远程Redis
    private static final Map<String, List<AppRoute>> LOCAL_CACHE = new ConcurrentHashMap<>();

    /**
     * 获取 路由配置(优先从本地缓存读取)
     */
    public static List<AppRoute> getAppRoute(String appId){
        String key = appId + _SUFFIX_APP_ROUTE;

        // 本地内存缓存命中,直接返回,省去远程Redis调用
        List<AppRoute> cached = LOCAL_CACHE.get(key);
        if (cached != null) {
            return cached.isEmpty() ? null : cached;
        }

        List<AppRoute> appRoutes = null;
        Jedis redis = null;
        try {
            redis = getJedis();
            appRoutes = SerializeUtil.unserializeList(redis.get(key.getBytes()), AppRoute.class);
            if(appRoutes == null || appRoutes.size() ==0) {
                return null;
            }
            LOCAL_CACHE.put(key, appRoutes);
        }finally {
            if(redis != null){
                redis.close();
            }
        }
        return appRoutes;
    }


    /**
     * 保存路由信息
     */
    public static void setAppRoute(List<AppRoute> appRoutes){
        String key = appRoutes.get(0).getAppId() + _SUFFIX_APP_ROUTE;
        LOCAL_CACHE.put(key, appRoutes);
        Jedis redis = null;
        try {
            redis = getJedis();
            redis.set(key.getBytes(), SerializeUtil.serializeList(appRoutes));
        }finally {
            if(redis != null){
                redis.close();
            }
        }
    }

    /**
     * 清除本地缓存
     */
    public static void clearLocalCache() {
        LOCAL_CACHE.clear();
    }
}