项目的缓存设计主要是这样的,监听数据库中表的改变,如果会发生变动,则对缓存做一些处理,具体实现如下:
(1)缓存支持类(实体、辅助类等)的设计
实体缓存注释类 NeedCache
/**
* 缓存的注释类,如果需要缓存某个类,请在类上添加此注释类,并给出cache的处理类
*
* @author liuyang
*
*/
@Documented
@Target(value = ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface NeedCache {
Class<?> cacheDealClass();
}
缓存类 Cache
/**
* 对象缓存类
*
* @author liuyang
*
*/
public class Cache {
private String key;
private Map<String,String> fieldHashMap;
private int expiredSeconds;
private long expiredTime;
/**
* 键
*
* @return
*/
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
/**
* 缓存的对象map
* @return
*/
public Map<String, String> getFieldHashMap() {
return fieldHashMap;
}
public void setFieldHashMap(Map<String, String> fieldHashMap) {
this.fieldHashMap = fieldHashMap;
}
/**
* 过期秒数
*
* @return
*/
public int getExpiredSeconds() {
return expiredSeconds;
}
public void setExpiredSeconds(int expiredSeconds) {
this.expiredSeconds = expiredSeconds;
}
/**
* 过期时间
*
* @return
*/
public long getExpiredTime() {
return expiredTime;
}
public void setExpiredTime(long expiredTime) {
this.expiredTime = expiredTime;
}
}
缓存处理接口类 CacheDeal
/**
* 缓存处理接口
*
* @author liuyang
*
*/
public interface CacheDeal {
/**
* 添加缓存
*
* @param cachedEntity
*/
void addCache(Object cachedEntity);
/**
* 移除缓存
*
* @param cachedEntity
*/
void removeCache(Object cachedEntity);
/**
* 更新缓存
*
* @param cachedEntity
*/
void updateCache(Object cachedEntity);
/**
* 获取缓存
*
* @param key
* @return
*/
Cache getCache(String key);
}
(2)缓存监听、管理类设计
这里用了hibernate的监听类,创建3个监听类,插入、修改、删除分别继承Ejb3PostInsertEventListener,Ejb3PostUpdateEventListener,Ejb3DeleteInsertEventListener,srping配置文件如下配置: