1、前言
在我们开发项目的过程中经常会遇到一些读多写少的接口,在这些接口中会有很大批量的查询操作,如果我们这些查询操作都需要查询数据库的话,会造成数据库承受不了,以及数据库的响应比较慢导致该接口无法在规定时间进行相应,所以我们要减少数据库的查询操作,使用多级缓存机制。
2、架构
多级缓存的架构如图所示:
这里面的Redis为分布式缓存,作为整个系统共用的缓存,而JVM本地则用的Eheache缓存。
3、写法
@Cacheable(value = "app", key = "#appId")
public App getAppByAppId(Integer appId) {String redisKey &#61; "app:" &#43; appId;String jsonStr &#61; redisTemplate.opsForValue().get(redisKey);if (jsonStr &#61;&#61; null) {App app &#61; appDao.selectByPrimaryKey(appId);String value &#61; JSON.toJSONString(app);redisTemplate.opsForValue().set(redisKey, value,6 * 60 &#43; new Random().nextInt(30), TimeUnit.SECONDS);return app;}return JSON.parseObject(jsonStr, new TypeReference<App>() {});
}
- 在方法前面添加&#64;Cacheable注解&#xff0c;将Ehcache通过注解形式绑定到该方法上&#xff0c;该方法返回的内容会直接保存到Ehcache中。如果该缓存&#xff0c;则不进入方法直接返回。
- 进入方法中&#xff0c;查询Redis&#xff0c;如果Redis不存在&#xff0c;通过appDao的selectByPrimaryKey方法查询数据库&#xff0c;并通过redisTemplate.opsForValue().set()方法重新写到Redis中。通过JSON.parseObject()方法将json格式的内容转成App类&#xff0c;并返回。
- 其中为了避免有缓存击穿问题&#xff0c;在redis的过期时间设置的时候&#xff0c;要加上一个随机数。