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());
}
}
缓存实践
统一缓存层 + 缓存控制 + 自定义缓存
试点选择
通过监控数据选择平均执行时间长,且方法重复率高的方法进行缓存试点
后续推进
持续监控缓存命中率和方法重复率,并总结缓存场景,迭代缓存接口