首先,我们根据项目需要设计数据结构,比如map、list,下面是我所用到的数据结构,创建一个缓存工具类。
public class cacheUtil {
private static ConcurrentMap<String, List<Map>> IEC_ITEM_DATA= Maps.newConcurrentMap();
public static synchronized void addData(String id, Map data) {
getIECItemData(id).add(data);
}
public static synchronized void removeIECItem(String id) {
IEC_ITEM_DATA.remove(id);
}
public static synchronized List<Map> getIECItemData(String id) {
if (!IEC_ITEM_DATA.containsKey(id)){
putIECItem(id, Lists.newArrayList());
}
return IEC_ITEM_DATA.get(id);
}
public static synchronized void putIECItem(String id, List<Map> data) {
IEC_ITEM_DATA.put(id, data);
}
}
接下来就是在项目中使用缓存工具将数据库数据缓存到本地,方便下次直接使用,而非再去查询数据库。
//从缓存中获取数据
List<Map> iecItemData = IECItemCacheUtil.getIECItemData(String.valueOf(childId));
List<Map<String,Object>> result = Lists.newArrayList();
//判断缓存中是否存在数据,若为空,则查询数据库,然后将数据放入缓存中
if(CollectionUtils.isEmpty(iecItemData)){
Map dataMap = iec104CollectTemplateDao.queryItem(wfCode, childId);
if(dataMap == null){
return R.data(null);
}
Object tags = dataMap.get("tags");
iecItemData = (List<Map>) ((Map)tags).get("iec104Items");
//存入缓存
IECItemCacheUtil.putIECItem(String.valueOf(childId),iecItemData);
}
//若缓存中有数据,则直接获取,进行处理
...
写在最后,利用map实现本地缓存就实现了,当然这种如果服务重启,缓存也清理了;
如果项目中有用到redis服务器,可以利用redis实现缓存,效率更高。
有关redis如何实现缓存,将在后面的博客中介绍!