目录
什么是缓存?
缓存的作用?
缓存的成本?
实际项目中的应用
代码展示
什么是缓存?
缓存就是数据交换的缓冲区(称作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 {@Resourceprivate StringRedisTemplate stringRedisTemplate;@Overridepublic 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. 存在 写入 redisstringRedisTemplate.opsForValue().set(key,JSONUtil.toJsonStr(shop));//7.返回return Result.ok(shop);}
}
重新运行,进行测试,可以提前知道第一次查询是没有缓存中的数据的,走的是数据库,这次的响应时间为:
此时redis中已经有了缓存数据
再次请求: