目录
一.什么是缓存?
缓存就是数据交换的缓存区,是存储数据的临时地方,一般读写性能较高。
1.缓存的不同应用
1.1.浏览器缓存静态资源
2.tomcat缓存----应用层缓存,例如: map
3.数据库缓存 ------ 索引,数据等,最后也是要落实到CPU缓存和磁盘缓存
2.缓存的作用(优点)
2.1降低后端负载。
2.2.提高读写效率,降低响应时间
3.成本(缺点)
3.1.数据的一致性的成本(如果数据库的数据发生变化,缓存没变,可能会产生数据不一致问题)
3.2..代码维护成本 解决缓存雪崩,缓存穿透,缓存击穿等
3.3.运维成本 搭建集群部署,硬件消耗
二.添加缓存(业务分析)
1.业务分析:
1.1 客户端请求redis缓存,缓存命中返回给客户端,如果Redis未命中,则查询数据库,再把查询到的值更新到Redis缓存。如果数据也没有数据,那么创建一个空的对象缓存到Redis,为了避免缓存穿透。在向客户端返回错误提醒信息。
1.2案例示范:
逻辑图:
1.3 代码逻辑实现:
1.3.1注入缓存操作对象
@Resource
StringRedisTemplate stringRedisTemplate;
此处使用这个对象是为了方便讲解,不用去序列化对象,当然也可以用RedisTemplate
1.3.2:业务逻辑具体实现
public Result queryShopById(Long id) {
String shopKey = RedisConstants.CACHE_SHOP_KEY + id;
//1.先查询Redis缓中有没有数据
String s = stringRedisTemplate.opsForValue().get(shopKey);
Shop shop = new Shop();
//Redis不为空返回
if (null != s) {
shop = JSONUtil.toBean(s, Shop.class);
return Result.ok(shop);
}
//2.Redis中没有数据查询数据库中的数据
shop = shopMapper.selectById(id);
if (null != shop) {
//存在写入Redis
stringRedisTemplate.opsForValue().set(shopKey, JSONUtil.toJsonStr(shop));
return Result.ok(shop);
}
//缓存空对象
stringRedisTemplate.opsForValue().set(shopKey, new Shop().toString());
return Result.fail("数据不存在");
}
到这里缓存介绍完毕!