一种简单的小报表本地缓存方案

适应如下场景:关联表多,接口响应慢,报表数据不多,可能就十多行。参数也固定,实时性要求不高,隔那么半小时刷新一次,查询性能要求高,给领导看的,要求很快。
g
使用示例:

// 主打一个简单高效粗爆,ConcurrentHashMap也懒得用了。
   private final static Map<String, MemberEnterCompositeVo> CACHE = new HashMap<>();
 
   public void handleContext(FindMemberByStationSelectRequest context) {
   		// 缓存键
        String areaId = context.getParentEnterAreaId();
        MemberEnterCompositeVo result = CACHE.get(areaId);
        if (null == result) {
            result = findItemCount(areaId);
            CACHE.put(areaId, result);
        } else {
            // 比对下是否有效
            Long expire= result.getExpire();
            // 有效期小于当前时间,过期了
            if (expire< now) {
                result = findItemCount(areaId);
                CACHE.put(areaId, result);
            }
        }

        context.setResult(result);
    }

2024-5-29
补充的工具类:

public class LocalCache<T> {

    private Map<String, LocalCacheWrapper<T>> cache = new HashMap<>();

    private long during;

    private LocalCache(long during) {
        // 1分钟*秒*毫秒
        this.during = during * 60 * 1000;
    }

    public static <T> LocalCache<T> getInstance() {
        return getInstance(10);
    }

    public static <T> LocalCache<T> getInstance(long during) {
        return new LocalCache<>(during);
    }

    public T getWithCache(String key, Supplier<T> modelFun) {
        LocalCacheWrapper<T> cacheWrapper = cache.get(key);
        long now = System.currentTimeMillis();
        if (null != cacheWrapper ) {
            long expire = cacheWrapper .getExpire();
            if (expire < now) {
                // 过期
                return flushCacheModel(key, modelFun, now);
            } else {
                // 正常缓存
                return cacheWrapper.getModel();
            }
        } else {
            // 无缓存记录
            return flushCacheModel(key, modelFun, now);
        }
    }

    public void flushDuring(long during) {
        this.during = during * 60 * 1000;
    }

    private T flushCacheModel(String key, Supplier<T> modelFun, long now) {
        T model = modelFun.get();
        if (null != model) {
            long cacheExpire = now + during;
            cache.put(key, new LocalCacheWrapper<>(cacheExpire, model));
            return model;
        }
        return null;
    }
}

public class LocalCacheWrapper<T> {

    private long expire;

    private T model;

    public LocalCacheWrapper() {
    }

    public LocalCacheWrapper(long expire, T model) {
        this.expire = expire;
        this.model = model;
    }
}

使用效果:

    private final static LocalCache<XXXVo> CACHE = LocalCache.getInstance(1);

    public XXXVo loadHomePageData(HomePageContext context) {
        return  CACHE.getWithCache(
                context.getBusinessCode(),
                () -> loadByBusinessCode(context, businessCode)
        );
    }
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值