针对黑马点评系统。
以往的简单开发采用的方式往往是前端发起查询请求之后后台直接访问数据库,不管多大的流量都会交给数据库,那么在极大的流量冲击下就会造成数据库不可逆的损伤,因此出现了缓存的一种中间件模式。
利用缓存的程序设计方式如下:
最终在代码的业务层的实现方法步骤如下:
//1.从redis查询商铺缓存
//2.判断是否存在
//3.存在,直接返回
//4.不存在,根据id查询数据库
//5.不存在,返回错误
//6.存在,写入redis
//7.返回
@Resource
private StringRedisTemplate stringRedisTemplate;
@Override
public Result queryById(Long id) {
String key = CACHE_SHOP_KEY + id;
//1.从redis查询商铺缓存
String shopJson = stringRedisTemplate.opsForValue().get(key);
//2.判断是否存在
if (StrUtil.isNotBlank(shopJson)) {
//3.存在,直接返回
Shop shop = JSONUtil.toBean(shopJson, 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);
}
缓存穿透
当缓存中查不到对应信息的时候查询的请求就会交给数据库。(就是说只要缓存中和数据库中没有的信息不管多大的流量冲击依然会交给数据库,就不会在经过缓存)缓存穿透的出现违背了缓存本身的意义
当缓存和数据库都查询不到的时候就在缓存中缓存一个空对象(""),做到限流
缓存雪崩
在同一时间大量的key失效或者redis宕机,导致大量请求到达数据库