定時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表達式定時清除過時。配置

相關文章
相關標籤/搜索