缓存工具设计

缓存工具设计

常见的缓存工具有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;
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值