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