文章目录
什么是缓存?

缓存也要考虑成本的问题,不是随便用的

添加Redis缓存


@Override
public Result queryById(Long id) {
String redisKey = RedisConstants.CACHE_SHOP_KEY + id;
// 1. 从redis查询商铺缓存
String shopJson = stringRedisTemplate.opsForValue().get(redisKey);
// 2. 判读是否存在
if(StrUtil.isNotBlank(shopJson)){
// 3. 存在,直接返回
Shop shop = JSONUtil.toBean(shopJson, Shop.class);
return Result.ok(shop);
}
// 4. 不存在,根据id查询数据库
Shop shop = getById(id);
// 5. 不存在,写入redis
if(shop == null){
return Result.fail("店铺不存在!");
}
// 6. 存在,写入redis
stringRedisTemplate.opsForValue().set(redisKey,JSONUtil.toJsonStr(shop));
// 7. 返回
return Result.ok(shop);
}
店铺类型查询业务添加缓存练习题
@Override
public Result queryTypeList() {
// 1. 从redis查询店铺类别缓存
List<String> shopTypeRedisKey = stringRedisTemplate.opsForList().range(RedisConstants.CACHE_SHOP_TYPE_KEY,0,-1);
// 2. 判断是否命中缓存
if(!CollectionUtils.isEmpty(shopTypeRedisKey)){
// 3. 存在,直接返回,即是命中缓存
// 使用stream流将json集合转为
List<ShopType> shopTypeList = shopTypeRedisKey.stream()
.map(item -> JSONUtil.toBean(item, ShopType.class))
.sorted(Comparator.comparingInt(ShopType::getSort))
.collect(Collectors.toList());
// 返回缓存数据
return Result.ok(shopTypeList);
}
// 4. 不存在,查询数据库
List<ShopType> shopTypes = query().orderByAsc("sort").list();
// 判断数据库中是否有数据
if(CollectionUtils.isEmpty(shopTypes)){
// 不存在则缓存一个空集合,解决缓存穿透
stringRedisTemplate.opsForValue().set(RedisConstants.CACHE_SHOP_TYPE_KEY, Collections.emptyList().toString(),RedisConstants.CACHE_NULL_TTL, TimeUnit.MINUTES);
return Result.fail("商品分类信息为空");
}
// 5. 数据存在,先写入redis,再返回
// 使用stream流将bean集合转为json集合
List<String> shopTypeCache = shopTypes.stream()
.sorted(Comparator.comparingInt(ShopType::getSort))
.map(item -> JSONUtil.toJsonStr(item))
.collect(Collectors.toList());
stringRedisTemplate.opsForList().rightPushAll(RedisConstants.CACHE_SHOP_TYPE_KEY,shopTypeCache);
stringRedisTemplate.expire(RedisConstants.CACHE_SHOP_TYPE_KEY,RedisConstants.CACHE_SHOP_TYPE_TTL, TimeUnit.MINUTES);
// 6. 返回(按类别升序排序)
return Result.ok(shopTypes);

最低0.47元/天 解锁文章
997

被折叠的 条评论
为什么被折叠?



