package com.m.support.cache; import java.util.Hashtable; import com.alibaba.fastjson.JSON; import com.m.common.params.Params; import com.m.common.settings.Setting; import com.m.common.settings.SettingUtility; import com.m.common.utils.Consts; import com.m.common.utils.DateUtils; import com.m.common.utils.KeyGenerator; import com.m.common.utils.Logger; public class MemoryCacheUtility implements ICacheUtility { private static final String TAG = ICacheUtility.class.getSimpleName(); private static Hashtable<String, String> data; private static Hashtable<String, Long> dataTime; static { if (data == null) data = new Hashtable<String, String>(); if (dataTime == null) dataTime = new Hashtable<String, Long>(); } @Override public <T> Cache<T> findCacheData(Setting actionSetting, Params params, Class<T> responseCls) { String action = actionSetting.getValue(); String key = KeyGenerator.generateMD5(action, params); if (data.containsKey(key)) { long currentTime = System.currentTimeMillis(); long savedTime = dataTime.get(key); // 取缓存有效时间 String validTime = null; if (actionSetting.getExtras().containsKey(Consts.Setting.CACHE_VALIDTIME)) validTime = actionSetting.getExtras().get(Consts.Setting.CACHE_VALIDTIME).toString(); else validTime = SettingUtility.getSetting(Consts.Setting.MEMORY_CACHE_VALIDITY).getValue(); if (Consts.Value.DATA_NEVER_CRASH.equals(validTime)) savedTime = Integer.MAX_VALUE; else savedTime += (Integer.parseInt(validTime) * 1000); Logger.i( TAG, String.format("--->缓存保存时间为%s,当前时间为%s, 缓存有效时间为%s秒", DateUtils.formatDate(dataTime.get(key), DateUtils.TYPE_03), DateUtils.formatDate(currentTime, DateUtils.TYPE_03), SettingUtility.getIntSetting(Consts.Setting.MEMORY_CACHE_VALIDITY))); T result = JSON.parseObject(data.get(key), responseCls); if (currentTime <= savedTime) { Logger.i(TAG, "--->内存缓存有效"); return new Cache<T>(result, false); } else { data.remove(key); Logger.i(TAG, "--->内存缓存无效"); return new Cache<T>(result, true); } } return null; } @Override public void addCacheData(Setting actionSetting, Params params, Object responseObj) { String action = actionSetting.getValue(); String key = KeyGenerator.generateMD5(action, params); dataTime.put(key, System.currentTimeMillis()); data.put(key, JSON.toJSONString(responseObj)); } }