springboot快取 之 從Cache中取出所有條目
阿新 • • 發佈:2019-01-08
背景
前兩天遇到一個問題,就是將一個 key ,value1、value2 、value3、value4…… 也就是一個 key 多個 value 的資料結構放到 快取中。這個簡單,我就把他們都放到了GuavaCacheManager 快取中,(GuavaCacheManager可以參考這裡 點我 )
但是在取出資料的時候遇到了一個問題。
問題
我門知道 GuavaCacheManager 的資料結構類似 Map<String,Map<Object,Object>> map =new HashMap<>();
我將 資料的key 當作外層map 的 key ,內層map 的key 就隨筆用了唯一值,但是在取出快取值的時候遇到一個問題,取快取只支援通過 “key“ 從cache 中取出快取,不支援從cache 中取出所有的條目
我看了cache 的api通過cache 的getNativeCache方法可以得到cache中的所有條目
Object o = cache.getNativeCache();
解決
從上圖可以看出這個物件是 類似一個list<map<String,Object>>
的資料結構,於是我就進行轉換髮現不行,那麼就直接當作 map 進行轉換
Cache cache = cacheManager.getCache(map.get("keyCode").toString());
Object o = cache.getNativeCache();
try {
Map<String, Object> map2 = (Map<String, Object>) CommonUtil.ObjToMap(o).get("localCache" );
for (Map.Entry<String, Object> entry : map2.entrySet()) {
System.out.println(entry.getValue());
}
return list;
} catch (Exception e) {
logger.warn("DictionaryItem cache is error !!!");
}
/**
* Obj 轉換為 map
* @param obj
* @return
* @throws Exception
*/
public static Map<String, Object> ObjToMap(Object obj) throws Exception {
Map<String, Object> map = new HashMap<>();
Field[] fields = obj.getClass().getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
map.put(field.getName(), field.get(obj));
}
return map;
}
由上圖發現我是轉換了兩次map 才取到了所有的值。。。
最後推薦大家用 註解方式進行快取管理, :大家可以參考
好了最後獻上 java Object 轉換map 的方法