Map缓存工具

老吴2019-01-14 23:31后端259浏览


版权声明:本篇文章为原创文章,转载请注明出处。https://yao2san.com/article/1845

Map缓存工具

在做支付功能时,为防止频繁调取第三方支付接口来获取二维码,所以需要对数据进行缓存(主要是二维码信息),如果缓存中有,则不调用第三方接口,一来减少请求时间,而来避免第三方接口请求并发数量限制。

本来计划是存到redis中,但是似乎redis只能设置统一的过期时间,而不能单独设置某个key的过期时间,因此写了这样一个缓存工具类,采用ConcurrentHashMap实现,一个存放key-value,另一个存放key-time,对这俩个的操作,实现不同key不同过期时间的功能。

提供了5个静态方法:

具体作用看方法名就知道,就不在解释,具体源码如下,也很简单,只有几十行:

/**
 * Created by wxg on 2019/1/14 20:02
 */
public class CacheUtil {
    private static Map<String, Object> cacheMap = new ConcurrentHashMap<>();
    private static Map<String,Long> timeMap = new ConcurrentHashMap<>();
    private static int modCount = 0;
    public static Object put(String key, Object value, int seconds) {
        timeMap.put(key,System.nanoTime()+TimeUnit.SECONDS.toNanos(seconds));
        modCount++;
        return cacheMap.put(key, value);
    }

    public static Object get(String key) {
        Object obj = cacheMap.get(key);
        if(isTimeout(key)){
            remove(key);
            return null;
        }
        modCount++;
        if (modCount>=10000){
            clean(true);
        }
        return obj;
    }

    public static boolean isTimeout(String key) {
        long nowTime = System.nanoTime();
        long maxTime = timeMap.get(key)==null?Long.MAX_VALUE:timeMap.get(key);
        return nowTime > maxTime;
    }

    public static Object remove(String key){
        timeMap.remove(key);
        modCount++;
        return cacheMap.remove(key);
    }
    public static void clean(boolean keep) {
        if (keep) {
            for (String key : cacheMap.keySet()) {
                if (isTimeout(key)) {
                    cacheMap.remove(key);
                    timeMap.remove(key);
                }
            }
        } else {
            cacheMap.clear();
            timeMap.clear();
        }
    }

    public static void main(String[] args) throws InterruptedException {
        CacheUtil.put("aaa",123,10);
        System.out.println(CacheUtil.get("aaa"));
        for(int i=20;i>0;i--){
            System.out.println(isTimeout("aaa"));
            TimeUnit.SECONDS.sleep(1);
        }
        System.out.println(CacheUtil.get("aaa"));
    }
}

赞一个! (0)

文章评论(如需发表图片,请转至留言)