定时map功能的实现

        在开发中咱们常常会遇到存储的数据须要设置过时时间的问题,原生的map并不能知足咱们的要求,这时咱们能够经过改造hashmap来实现咱们想要的功能。直接上代码:ide

public class TimingMap<K, V> extends HashMap<K, V> {
    // 存放过时日期的map
    private Map<String, Long> timingMap = new HashMap<String, Long>();
    // 过时时间
    private final long expireTime = 1800000;.net

    /**
     * 重写put方法
     */
    @Override
    public V put(K key, V value) {
        timingMap.put((String) key, System.currentTimeMillis() + expireTime);
        return super.put(key, value);
    }对象

    /**
     * 初始化的时候
     */
    public TimingMap() {
        super();
        Timer timer = new Timer();
        TimerTask task = new TimerTask() { // 建立一个新的计时器任务。
            @Override
            public void run() {
                List<String> removeList = new ArrayList<String>();
                for (String key : timingMap.keySet()) {
                    long currentTime = System.currentTimeMillis();
                    if (currentTime > timingMap.get(key)) {
                        removeList.add(key);
                    }
                }
                removeExpireData(removeList);
            }
        };
        timer.schedule(task, 1000, 60000); // 一分钟刷新一次
    }开发

    /**
     * 移除过时数据
     * 
     * @param keys
     */
    public void removeExpireData(List<String> keys) {
        for (String key : keys) {
            timingMap.remove(key);
            super.remove(key);
        }
    }rem

    /**
     * 重写get方法
     */
    @Override
    public V get(Object key) {
        long currentTime = System.currentTimeMillis();
        if (currentTime > timingMap.get(key)) {
            timingMap.remove(key);
            super.remove(key);
            return null;
        }
        return super.get(key);
    }get

    /**
     * 重写移除方法
     */
    @Override
    public V remove(Object key) {
        timingMap.remove(key);
        return super.remove(key);
    }hash

    /**
     * 重写清除方法
     */
    @Override
    public void clear() {
        timingMap.clear();
        super.clear();
    }class

    /**
     * 添加一个定时清除方法,方便后面和task集成用配置cron表达式的方法清除数据
     */
    public void scheduledClear() {
        List<String> removeList = new ArrayList<String>();
        for (String key : timingMap.keySet()) {
            long currentTime = System.currentTimeMillis();
            if (currentTime > timingMap.get(key)) {
                removeList.add(key);
            }
        }
        removeExpireData(removeList);
    }
}hashmap

这样咱们就能够设置一个静态TimingMap对象,用来实现定时清除map里面的数据了。还能够scheduledClear方法配合使用定时任务用cron表达式定时清除过时。配置

相关文章
相关标签/搜索