目录
什么是缓存?
缓存的作用?
缓存的成本?
实际项目中的应用
代码展示
什么是缓存?
缓存就是数据交换的缓冲区(称作Cache [ kæʃ ] ),是存贮数据的临时地方,一般读写性能较高。
缓存的作用?
降低后端负载
提高读写效率,降低响应时间
缓存的成本?
数据一致性成本(多了一份缓存中的数据)
代码维护成本(代码复杂度上升)
运维成本(会有缓存雪崩等一系列问题)
实际项目中的应用
举个栗子:下面的代码就是直接查询数据库的方法
/**
* 根据id查询商铺信息
* @param id 商铺id
* @return 商铺详情数据
*/
@GetMapping("/{id}")
public Result queryShopById(@PathVariable("id") Long id) {
return Result.ok(shopService.getById(id));
}
它的理论模型就应该是这样的
如果接入了缓存之后的模型应该是这样的:
此时的业务逻辑如下图所示:
代码展示
现在根据上面的逻辑自己定义一个方法引入缓存
@GetMapping("/{id}")
public Result queryShopById(@PathVariable("id") Long id) {
return shopService.queryById(id);
}
public interface IShopService extends IService<Shop> {
Result queryById(Long id);
}
@Service
public class ShopServiceImpl extends ServiceImpl<ShopMapper, Shop> implements IShopService {
@Resource
private StringRedisTemplate stringRedisTemplate;
@Override
public Result queryById(Long id) {
String key = CACHE_SHOP_KEY + id;
//1.从redis中查询店铺缓存
String jsonShop = stringRedisTemplate.opsForValue().get(key);
//2.判断是否存在
if (StrUtil.isNotBlank(jsonShop)) {
//3.存在,直接返回
Shop shop = JSONUtil.toBean(jsonShop, Shop.class);
return Result.ok(shop);
}
//4.不存在,根据id查询数据库
Shop shop = getById(id);
//5. 不存在 返回错误
if(shop == null){
return Result.fail("店铺不存在!");
}
// 6. 存在 写入 redis
stringRedisTemplate.opsForValue().set(key,JSONUtil.toJsonStr(shop));
//7.返回
return Result.ok(shop);
}
}
重新运行,进行测试,可以提前知道第一次查询是没有缓存中的数据的,走的是数据库,这次的响应时间为:
此时redis中已经有了缓存数据
再次请求: