在你写的查询的代码中
思路:
在执行查询之前,我们应该先去缓存中查找看能不能查到,如果查不到,那就正常执行查询数据库操作,查询完成之后,将数据添加到缓存中即可;
缓存一致性问题:
在我们执行完缓存添加之后,如果我们对数据库中的内容作出修改,这时,显然数据库中的数据和缓存已经不一致,而我们执行后续查询操作的时候,查找到的就是存在缓存中的旧数据,这样肯定是有问题的,那么如何来解决这个问题呢?
最简单的解决办法就是我们在执行对数据库的修改操作时,将对应的数据缓存删除即可,下文代码中有详细介绍:
第一步:
//注入jedisClient
@Autowired
JedisClient jedisClient;
第二步:
//在这里加缓存,如下就是一个执行查询的示例 我们来添加缓存
分析:我们添加缓存,有可能失败,但这不能影响到正常的业务逻辑执行,因此引入try--catch
@Override
public List<TbContent> getContentByCid(long cid) {
//先查询缓存,添加缓存不能影响正常业务逻辑
try {
//查询缓存
String json=jedisClient.hget(INDEX_CONTENT, cid+"");
//如果查询到结果,把json转换成list返回
if(StringUtils.isNotEmpty(INDEX_CONTENT)){
List<TbContent> list = JsonUtils.jsonToList(json, TbContent.class);
return list;
}
} catch (Exception e) {
e.printStackTrace();
}
//缓存中有没有命中,需要查询数据库
TbContentExample example = new TbContentExample();
Criteria criteria = example.createCriteria();
//设置查询条件
criteria.andCategoryIdEqualTo(cid);
//执行查询
List<TbContent> list = contentMapper.selectByExample(example);
//把结果添加到缓存中
try {
jedisClient.hset(INDEX_CONTENT, cid + "", JsonUtils.objectToJson(list));
} catch (Exception e) {
e.printStackTrace();
}
//返回结果
return list;
}
//配置redis中缓存首页内容的key
1.将其写到属性文件中
resource.properties
INDEX_CONTENT=INDEX_CONTENT
2.在spring配置文件applicationContext-dao.xml中配置属性文件扫描
<!-- 加载配置文件 -->
<context:property-placeholder location="classpath:properties/*.properties" />
3.在代码中操作如下:
@Value("${INDEX_CONTENT}")
private String INDEX_CONTENT;
4.处理缓存同步问题,在对数据库做出改变之后删除对应的缓存即可
这里是我对数据库进行添加操作的时候作出的修改,来解决缓存同步问题
@Override
public TaotaoResult addContent(TbContent content) {
//补全pojo的属性
content.setCreated(new Date());
content.setUpdated(new Date());
//插入到内容表
contentMapper.insert(content);
//同步缓存
//删除对应的缓存信息
jedisClient.hdel(INDEX_CONTENT,content.getCategoryId().toString());
return TaotaoResult.ok();
}