1. 为什么要使用redis缓存?
一句话:因为速度快,好用
缓存数据存储于代码中,而代码运行在内存中,内存的读写性能远高于磁盘,缓存可以大大降低用户访问并发量带来的服务器读写压力
2. 实现店铺缓存和数据库双写一致
2.1 单个商铺
使用**import cn.hutool.json.JSONUtil;**来将json与对象互换
@Resource
private ShopMapper shopMapper;
@Resource
private StringRedisTemplate stringRedisTemplate;
@Override
public Result queryById(Long id) {
// 1. 从redis查询商铺缓存
String shopJson = stringRedisTemplate.opsForValue().get(CACHE_SHOP_KEY + id);
// 2. 判断是否存在
if (StrUtil.isNotBlank(shopJson)) {
// 3. 存在,直接返回 -> 这里拿到的json需要转化为对象
Shop shop = JSONUtil.toBean(shopJson, Shop.class);
return Result.ok(shop);
}
// 4. 不存在,根据id来查询数据库
Shop selectById = shopMapper.selectById(id);
// 5. 不存在,返回错误
if (selectById == null){
return Result.fail("店铺不存在");
}
// 6. 存在,写入redis
stringRedisTemplate.opsForValue().set(CACHE_SHOP_KEY + id,JSONUtil.toJsonStr(selectById));
// 7. 返回
return Result.ok(selectById);
}
2.2 多个商铺形成的list
使用**import cn.hutool.json.JSONUtil;**来将jsonList与对象List互换
@Resource
StringRedisTemplate stringRedisTemplate;
@Override
public Result queryShopType() {
// 1. 从redis查询商铺缓存
//String shopTypeUUID = UUID.randomUUID().toString(true);
String shopTypeFlad = "shopTypeList";
String shopTypeJson = stringRedisTemplate.opsForValue().get(CACHE_SHOPTYPE_KEY + shopTypeFlad);
// 2. 判断是否存在
if (StrUtil.isNotBlank(shopTypeJson)) {
// 3. 存在,直接返回 -> 这里拿到的json需要转化为对象
List<ShopType> shopTypes = JSONUtil.toList(shopTypeJson,ShopType.class);
return Result.ok(shopTypes);
}
// 4. 不存在,根据id来查询数据库
List<ShopType> typeList = query().orderByAsc("sort").list();
// 5. 不存在,返回错误
if (CollUtil.isEmpty(typeList)) {
return Result.fail("系统繁忙,请稍后再试");
}
// 6. 存在,写入redis
stringRedisTemplate.opsForValue().set(CACHE_SHOPTYPE_KEY + shopTypeFlad, JSONUtil.toJsonStr(typeList));
// 7. 返回
return Result.ok(typeList);
}