1. 程式人生 > >springboot快取 之 從Cache中取出所有條目

springboot快取 之 從Cache中取出所有條目

背景

前兩天遇到一個問題,就是將一個 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 的方法