缓存工具设计
常见的缓存工具有redis、encache、mongodb等,redis这样第三方工具存在一个问题,就是一旦redis服务挂了或者服务器上压根就没有安装redis,就会导致缓存功能彻底失效。为了避免这样的情况,设计如下的缓存工具使其支持多种缓存,当redis失效时有替代方案依然能正常工作。
- 抽象缓存的方法
一个项目中可以有多个实现类,使其支持多种类型的缓存。实际项目中仅仅key-value的get、set已经无法满足需求了,下面是最近项目中使用到的,封装了List、Set、Map等常用数据结构的缓存操作方法。
public interface ICacheHandler {
/**
* 设置key的前缀
* @param var1
*/
void setKeyPrefix(String var1);
/**
* 最简单的key-value结构
*/
<T> T get(String key, Class c);
boolean set(String key, Object value);
boolean set(String key, Object value, long time);
String getStr(String key);
/**
* List相关方法
* @param key
* @return
*/
List<String> getListStr(String key);
<T> List<T> getList(String key, Class c);
<T> boolean setList(String key, List<T> value);
<T> boolean setList(String key, List<T> value, long time);
boolean setListItem(String key, Object... value);
/**
* Set相关方法
* @param key
* @return
*/
Set<String> getSetStr(String key);
<T> Set<T> getSet(String key, Class c);
<T> boolean setSet(String key, Set<T> value);
<T> boolean setSet(String key, Set<T> value, long time);
boolean setSetItem(String key, Object...value);
/**
* Map相关方法
* @param key
* @return
*/
Map<String, String> getMapStr(String key);
<T> Map<String, T> getMap(String key, Class c);
<T> boolean setMap(String key, Map<String, T> value);
<T> boolean setMap(String key, Map<String, T> value, long time);
<T> T getMapItem(String key, String mapKey, Class c);
<T> boolean setMapItem(String key, String mapKey, T value);
boolean mapRemove(String key, String mapKey);
boolean mapExists(String key, String mapKey);
boolean exists(String key);
/**
* 删除多个key
* @param key
* @return
*/
boolean remove(String... key);
/**
* 根据前缀批量删除
* @param key
* @return
*/
boolean batchDelete(String key);
/**
* 清空缓存
*/
void clear();
/**
* 为键设置过期时间
* @param key
* @param time
* @return
*/
boolean expire(String key, long time);
/**
* 根据key获取过期时间
* @param key
* @return
*/
Long getExpire(String key);
}
- redis版本的CacheHandler
使用Jedis工具封装的,redisTemplate也可以。
public class RedisCacheHandler implements ICacheHandler {
@Override
public void setKeyPrefix(String var1) {
JedisPoolUtil.setPrefix(var1);
}
@Override
public <T> T get(String key, Class c) {
String str = JedisPoolUtil.get(key);
if(StringUtils.isNotEmpty(str)){
return JSONObject.parseObject(str, (Class<T>) c);
}
return null;
}
@Override
public boolean set(String key, Object value) {
return JedisPoolUtil.set(key, value);
}
......
}
- 缓存工具类
与redis这样的工具解耦
public class CacheDataManager {
private ICacheHandler cacheHandler;
public ICacheHandler getCacheHandler() {
return cacheHandler;
}
public void setCacheHandler(ICacheHandler cacheHandler) {
this.cacheHandler = cacheHandler;
}
public void setKeyPrefix(String keyPrefix) {
cacheHandler.setKeyPrefix(keyPrefix);
}
public void set(String key, Object value) {
cacheHandler.set(key, value);
}
......
}
- 缓存配置
初始化时选择使用的缓存类型
@Bean
public CacheDataManager buildManager() {
CacheDataManager dataManager = new CacheDataManager();
//根据条件选择具体的实现类
ICacheHandler cache = new RedisCacheHandler();
dataManager.setCacheHandler(cache);
//设置key的前缀
dataManager.setKeyPrefix(“keyPrefix”);
return dataManager;
}