1.是什么?
- Redis:Remote Dictionary Server,即远程字典服务
支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 - Redis 是当前互联网世界最流行的 NoSQL(Not Only SQL)数据库。
- Redis支持存储的value数据类型:
String(字符串)、Hash(哈希类型)、list(链表)、set(集合)、zset(sorted set --有序集合)
2.作用
Redis以消息队列的形式存在,作为内嵌的List存在,满足实时的高并发需求。而通常在一个电商类型的数据处理过程之中,有关商品,热销,推荐排序的队列,通常存放在Redis之中
3.操作-缓存不一致的问题
问题所在:在数据库中添加了新的数据,但是页面加载缓存数据之后并没有显示出来新添加的数据
原因:添加新的数据,但是没有及时清空缓存,打开页面加载的还是上次的数据
步骤:
(1)查看缓存中的数据,还是上一次的数据(根据hash类型的key获取value,缓存是hash数据类型)
(2)往数据库里新添加一条数据
(3)再次查询缓存数据
看到缓存数据已经为空,往数据库添加数据的同时,清空缓存数据
(4)再次刷新页面的时候,执行方法
public List<TbContent> getContentListByCid(long cid) {
//查询缓存
try {
//如果缓存中有直接响应结果
String json = jedisClient.hget(CONTENT_LIST, cid + "");
if (StringUtils.isNotBlank(json)) {
//json转列表,TbContent.class是list中每个元素的类型
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.selectByExampleWithBLOBs(example);
//把结果添加到缓存
try {
jedisClient.hset(CONTENT_LIST, cid + "", JsonUtils.objectToJson(list));
jedisClient.expire(CONTENT_LIST, 400);
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
因为操作(3)成功在数据库添加了一条数据,同时成功清空了缓存。所以方法判断缓存是否为空,不为空则从数据库中拿到最新数据存到缓存之中,然后渲染到页面上。
(5)再次查看缓存数据,多了新添加的那一条,这就对应上了
所以说,如何添加数据的时候如果没有及时清空缓存,那么方法判断缓存有数据,于是直接加载了现有的数据,数据库里最新的数据则没有显示出来。
4.总结
当开发一个需求,像上面这样,既涉及到了普通的关系型数据库,也用到了redis这种不同的数据库形式,要结合起来,练习起来看,明确其发挥作用,使用的界限,避免发生这样不对应的情况。