文章目录
1. 什么是缓存
缓存就是数据交换的缓冲区(Cache),是存储数据的临时地方,一般读写性能较高。
缓存的作用及其成本:
2. 添加redis缓存
我们先来看看添加缓存和不添加缓存的区别
可以看出,不添加缓存所有的查询操作直接从数据库中读取,一旦请求量很大,容易造成数据库崩溃。加入缓存后,如果缓存中有数据,就直接从缓存中读取数据,如果缓存中没有数据,再去数据库中读取,并将数据写入缓存。而且,缓存读写性能很高,意味着其可以很快响应用户请求,添加缓存也能缓解数据库的压力。
2.1 缓存商铺信息
接下来我们做个小练习,将商铺的信息添加至缓存。
编码之前,我们先梳理一下流程:
/**
* 使用redis缓存查找商铺信息
* @param id
* @return
*/
@Override
public Result queryById(Long id) {
//1. 根据id从redis查询数据
String key = CACHE_SHOP_KEY+id;
String shopJson = redisTemplate.opsForValue().get(key);
//2. 查到数据库真实数据,直接返回数据
//StrUtil.isNotBlank(shopJson)只有shopJson为例如“abc”时才返回true,其他情况都为false
if(StrUtil.isNotBlank(shopJson)){
Shop shop = JSONUtil.toBean(shopJson, Shop.class);
return Result.ok(shop);
}
//3. 查不到,根据id查询数据库
Shop shop = this.getById(id);
if(shop==null){
//4 数据库查不到,返回404
return Result.fail("商铺不存在");
}
//5. 数据库查到,将数据写入redis缓存,返回相关数据,设置超时时间
redisTemplate.opsForValue().set(key,JSONUtil.toJsonStr(shop),CACHE_SHOP_TTL, TimeUnit.MINUTES);
return Result.ok(shop);
}
ok,梳理好流程我们编码就很简单了。当用户第一次查询时候,缓存中没有数据,查询数据库,查询之后,将数据放到缓存,下一次查询就直接从缓存中读取。
3. 缓存更新策略
3.1 缓存更新策略方法
内存淘汰策略无需我们手动维护,而超时剔除需要我们在保存redis缓存时添加缓存的有效时间。
3.2 主动更新策略
那么我们是先删除缓存再操作数据库还是先操作数据库再删除缓存呢?
先删除缓存再操作数据库
假设缓存和数据库中的数据开始均为10,左右两种情况会出现数据不一致问题。
先操作数据库,再删除缓存。这种情况也会出现数据不一致问题,但这种情况下发生数据不一致的概率较低,因此大都采用此种操作。
3.3 缓存更新策略总结
4. 对商铺查询的缓存添加超时剔除和主动更新
4.1 超时剔除
对于超时剔除,操作很简单,即在我们将数据添加至redis时就设置redis有效期。
4.2 主动更新
主动更新的逻辑也不难,即接收页面提交的信息,从中获取shopId,如果id为空则返回操作失败,否则就根据id更新商铺信息,同时将缓存中该商铺的信息删除。
/**
* 更新操作,先更新数据库,再删除缓存
* @param shop
* @return
*/
@Override
@Transactional
public Result update(Shop shop) {
Long shopId = shop.getId();
if(shopId==null){
return Result.fail("商铺id不能为空");
}
//1. 更新数据库
this.updateById(shop);
//2. 删除缓存
redisTemplate.delete(CACHE_SHOP_KEY+shopId);
return Result.ok();
}