应用缓存预热方案设计
Posted 方丈的寺院
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了应用缓存预热方案设计相关的知识,希望对你有一定的参考价值。
背景
随着业务的发展,微服务越来越多,缓存相关的场景也比较多,通常的做法是基于缓存数据库(如redis),client来进行缓存操作。这样的问题有两个
- 如果更换缓存数据库改造成本比较高
- 对于批量查缓存、缓存穿透等场景没有统一实现,逻辑分散
所以需要一个统一的缓存框架。
另外针对一些活动、大促场景需要对缓存数据进行预热。所以需要设计一套通用的预热系统。所谓预热,其实就是提前请求数据,使缓存生效。缓存和预热有关联,但是可以设计成独立的两套系统。
缓存框架
目标是实现
- 去除样板代码
getDataWithCache(Long id)
val data = getFromCache(id);
// 缓存没有,从数据库中拿
if (data == null)
data = getFromDb(id);
putDataInfoCache();
- 屏蔽掉缓存的具体实现,缓存有本地缓存(guava cache),分布式缓存(redis,memcache),实现方式不同,但是对于业务无需感知
- 支持缓存穿透、缓存击穿、级联缓存、批量查询缓存场景
- 能够监控到缓存命中率
实现分析
API 层
提供一些annotation给开发者使用
解析层
解析annotation,生成对应的缓存操作API
缓存操作SPI
屏蔽掉具体的缓存数据库实现
缓存操作层
具体的缓存数据库实现,如redis,memcache
开源的实现
https://docs.spring.io/spring-framework/docs/3.1.x/spring-framework-reference/html/cache.html
目前有spring-cache的实现,大部分需要的功能都能提供,补过也存在一些劣势
- 不支持多级缓存,批量查询缓存
- 和公司内部的监控,全链路trace没有打通。
所以通常可以借鉴spring-cache思路,结合公司的基础组件,自研一套。
具体实现逻辑见github
预热系统
预热系统其实就是三步
-
构造数据
支持excel,离线表,等多种数据导出成特定格式的参数 -
提交任务
提交调用待预热接口的方法,有个任务中心即可 -
执行
任务中心的任务调度
所以主要是搭建一个数据构造模块,再基于公司已有的任务执行中心即可实现。
以上是关于应用缓存预热方案设计的主要内容,如果未能解决你的问题,请参考以下文章
69_缓存预热解决方案:基于storm实时热点统计的分布式并行缓存预热
Redis常见问题 | 缓存穿透击穿雪崩预热更新降级及对应的解决方案