缓存推进策略

1、增加监控

目的
  • 筛选出方法重复率高的典型案例(例如字典表的findOne方法)
  • 验证缓存上线后对系统的提升
方法平均执行时间监控

初步方案:DAO层,注解AOP统计到内存,定时持久化到数据库

方法重复率监控

初步方案:与防重复调用注解类似,按方法 + 参数在一定时间段内重复做统计;DAO层,注解AOP统计到内存,定时持久化到数据库

2、选型并用典型案例试点

初步选型 Spring Cache

Spring Cache特点:

Spring Cache是基于注解的缓存技术,具备相当的灵活性,不仅能够使用 SpEL(Spring Expression Language)来定义缓存的 key 和各种 condition,还提供开箱即用的缓存临时存储方案,也支持和主流的缓存方式:例如 EHCache、Redis等集成。

关于多级缓存和命中率统计

Spring Cache实现的集成方案都是一级缓存,也不支持命中率统计,可通过Cache扩展接口实现(命中率统计有必要做)

主要注解
  • @Cacheable 缓存查询注解,触发缓存
  • @CacheEvict 缓存删除注解,触发缓存删除
  • @CachePut 缓存更新注解,触发缓存更新
  • @Caching 缓存操作组合注解,可把上面三个操作组合
  • @CacheConfig 类级别缓存注解
应用实例

当方法执行成功时,把操作结果加入缓存

    @Override
    @Cacheable(cacheNames = "default", unless = "#result.status.equals(T(com.ejlerp.common.vo.InvokeResult).FAILED)")
    public InvokeResult<String> pushInfoToERP(Long tenantId, Long vendorTenantId) {
        try {
            List<Map<String, Object>> vendors = tenantDao.findVendorOL(vendorTenantId, -1);
            if (vendors != null && vendors.size() > 0) {
                Map<String, Object> vendor = vendors.get(0);
                vendor.put("tenant_id", tenantId);
                vendor.put("industry_type", vendor.get("business_type"));
                vendor.remove("business_type");
                Map<String, Object> requstMap = new HashMap<>();
                requstMap.put("vendors", Lists.newArrayList(vendor));
                String requestBody = JSON.toJSONString(requstMap);
                HttpResult result = HttpUtil.getResponseByJson(HttpConf.EJLERP_WEB_HOST + "/sku/saveVendor", requestBody);
                if (result.getResponseCode() != 200) {
                    LOGGER.warn("向ERP推送tenant信息时发生错误:{}", result.getResponseMessage());
                    return new InvokeResult(InvokeResult.FAILED, result.getResponseMessage());
                } else {
                    JsonResult jsonResult = JSON.parseObject(result.getResult(), JsonResult.class);
                    if (jsonResult.getStatus().equals(JsonResult.SUCCESSFUL)) {
                        return new InvokeResult(InvokeResult.SUCCESSFUL, "向ERP推送tenant信息成功!");
                    } else {
                        return new InvokeResult(InvokeResult.FAILED, "向ERP推送tenant信息失败!");
                    }
                }
            } else {
                return new InvokeResult(InvokeResult.FAILED, "查询租户为空");
            }
        } catch (Exception e) {
            LOGGER.error("向ERP推送tenant信息时发生错误:{}", e.getMessage());
            return new InvokeResult(InvokeResult.FAILED, e.getMessage());
        }
    }
缓存实践
  1. 统一缓存层 + 缓存控制 + 自定义缓存

试点选择

通过监控数据选择平均执行时间长,且方法重复率高的方法进行缓存试点

后续推进

持续监控缓存命中率和方法重复率,并总结缓存场景,迭代缓存接口

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值