上篇文章已经知道了redis与spring的集成,下面就是redis在项目中的具体运用了
未添加缓存之前,我们的后台系统代码都是写好的。根据前台需要调用后台系统到数据库中查询数据返回给前台进行展示。那么现在我们把缓存加在哪里呢?
1)我们已经查询在后台的service中查询出了结果
2)我们可把这个结果放到缓存:设置缓存的名称,结果,缓存时间
3)再次执行该查询时,我们会先到缓存命中我们想要的结果,如果命中说明缓存中有我们想要的数据就从缓存中直接取数据,如果没有命中就去数据库中查询返回给controller。
具体实现如下:
import com.fasterxml.jackson.databind.ObjectMapper;
@Service
public class 类名extends BaseService<pojo>{
@Autowired
private RedisService redisService;
private static final ObjectMapper MAPPER=new ObjectMapper();
// 从缓存中命中,key命名规则:项目名_模块名_业务名
private static final String REDIS_KEY="TAOTAO_MANAGER_ITEMCAT_WEB_ALL";
private static final Integer REDIS_TIME=60*60*24*30;
public Result 方法名(){
try {
String cacheDate=this.redisService.get(REDIS_KEY);
if (StringUtils.isNotEmpty(cacheDate)) {
// 命中,因为缓存中存放的是string类型数据,需要反序列化为对象后返回
Result result = MAPPER.readValue(cacheDate, Result.class);
return result;
}
} catch (Exception e) {
e.printStackTrace();
}
// 执行查询的具体结果,查询出结果后放到result对象中
try {
// 将结果写入到缓存,缓存一个月时间,
// 因为查询出来的结果是一个对象,而缓存中存储格式为string,所以需要序列化为对象
this.redisService.set(REDIS_KEY, MAPPER.writeValueAsString(result),REDIS_TIME);
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
一定要把缓存逻辑放到try--catch逻辑中进行捕获。因为如果不进行捕获的话,假如缓存在执行get方法时出现了异常,程序就直接抛出异常直接返回而不会继续往下执行。
查看上述代码执行后的缓存结果