Java基于内存实现简单的缓存

 流程序有段代码是调用一个接口获取元数据信息,由于调用频繁,元数据有更新接口会重新上线,流就会收到影响,简单实现个缓存工具类,设置超时时间就欧了,既较少调用频率,也保证接口重新上线这段时间流受到影响的概率降低。

直接上代码,考虑多线程的情况,使用 ConcurrentHashMap 

import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * Created by dingyufei on 2019/11/18.
 */
public class CacheUtil {

    // 缓存map
    private static ConcurrentHashMap<String,Object> cacheMap=new ConcurrentHashMap<>();
    // 缓存key有效期map
    private static ConcurrentHashMap<String, Long> expireTimeMap = new ConcurrentHashMap<>();


    /**
     * 获取指定的value,如果key不存在或者已过期,则返回null
     *
     * @param key
     * @return
     */
    public static Object get(String key) {
        if (!cacheMap.containsKey(key)) {
            return null;
        }
        if (expireTimeMap.containsKey(key)) {
            if (expireTimeMap.get(key) < System.currentTimeMillis()) { // 缓存失效,已过期
                return null;
            }
        }

        return cacheMap.get(key);
    }


    /**
     * 设置value(不过期)
     *
     * @param key
     * @param value
     */
    public static void set(String key, Object value) {
        cacheMap.put(key, value);
    }

    /**
     * 设置value
     *
     * @param key
     * @param value
     * @param millSeconds 过期时间(毫秒)
     */
    public static void set(final String key, Object value, int millSeconds) {
        final long expireTime = System.currentTimeMillis() + millSeconds;
        cacheMap.put(key, value);
        expireTimeMap.put(key, expireTime);
        if (cacheMap.size() > 3) { // 清除过期数据
       Iterator<Map.Entry<String, Object>> iterator = cacheMap.entrySet().iterator();
            while (iterator.hasNext()) {
                Map.Entry<String, Object> entry = iterator.next();
                if (expireTimeMap.containsKey(entry.getKey())) {
                    long expireTime1 = expireTimeMap.get(key);
                    if (System.currentTimeMillis() > expireTime1) {
                        iterator.remove();
                        expireTimeMap.remove(entry.getKey());
                    }
                }
            }
        }
    }

    /**
     * key是否存在
     *
     * @param key
     * @return
     */
    public static boolean isExist(String key) {
        return cacheMap.containsKey(key);
    }


}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值