结果预览:

List实现结果

Str实现结果

1、ShopTypeController改写

ShopTypeController中改写一下controller的方法逻辑,这里直接返回一个查询方法即可,后面在Service里再实现具体业务操作逻辑。

2、IShopTypeService接口改写

参考老师店铺Id查询,我在这里也写了一个方法,

3、ShopTypeServiceImpl具体写-List

实现类里写具体的操作逻辑,如下(CACHE_SHOP_TYPE_KEY = "cache:shopType:")。

后面写入数据是将JAVA对象转成一个一个的jsonstring,所以JSONUtil.toBean将json类型数据转成了 一个一个的对象(详细可见结果预览图)。
 

@Service
public class ShopTypeServiceImpl extends ServiceImpl<ShopTypeMapper, ShopType> implements IShopTypeService {

    @Resource
    private StringRedisTemplate stringRedisTemplate;

    @Override
    public Result queryTypeList() {

        String key = CACHE_SHOP_TYPE_KEY;
        //1、从redis中查询商铺类型
        List<String> shopListJson = stringRedisTemplate.opsForList().range(key, 0, -1);
        //2、判断,若存在,返回
        if (CollectionUtil.isNotEmpty(shopListJson)) {

            List<ShopType> shoplistJava = shopListJson.stream()
                    .map(JSON -> JSONUtil.toBean(JSON, ShopType.class))
                    .collect(Collectors.toList());

            return Result.ok(shoplistJava);
        }
        //3、不存在,查询数据库
        List<ShopType> shopTypesDB = query().orderByAsc("sort").list();

        //4、若数据库中不存在,报错
        if (CollectionUtil.isEmpty(shopTypesDB)) {
            return Result.fail("店铺类型不存在");
        }
        //5、若存在,写入redis
        List<String> shoptype2DB = shopTypesDB.stream()
                .map(JSONUtil::toJsonStr)
                .collect(Collectors.toList());
        stringRedisTemplate.opsForList().rightPushAll(key, shoptype2DB);

        //6、返回
        return Result.ok(shoptype2DB);
    }
}

4、ShopTypeServiceImpl具体写-Str

使用String类型的方法,则是将美食、KTV等商铺一整个作为list写入redis,,如下

@Service
public class ShopTypeServiceImpl extends ServiceImpl<ShopTypeMapper, ShopType> implements IShopTypeService {
    @Resource
    private StringRedisTemplate stringRedisTemplate;

    @Override
    public Result queryTypeList() {
        //1、从redis中查询商铺类型
        String shopListJson = stringRedisTemplate.opsForValue().get(CACHE_SHOP_TYPE_KEY);

        //2、判断,若存在,返回
        if (StrUtil.isNotBlank(shopListJson)) {
            List<ShopType> shoplistJava = JSONUtil.toList(shopListJson, ShopType.class);
            return Result.ok(shoplistJava);
        }
        //3、不存在,查询数据库
        List<ShopType> shopTypesDB = query().orderByAsc("sort").list();

        //4、若数据库中不存在,报错
        if (CollectionUtil.isEmpty(shopTypesDB)) {
            return Result.fail("店铺类型不存在");
        }

        //5、若存在,写入redis
        String shoptype2DB = JSONUtil.toJsonStr(shopTypesDB);
        stringRedisTemplate.opsForValue().set(CACHE_SHOP_TYPE_KEY, shoptype2DB);

        //6、返回
        return Result.ok(shoptype2DB);
    }

参考:

黑马点评系列问题之P37商户点评缓存作业,用了string和list两种方法,可以直接复制粘贴_黑马点评作业-CSDN博客

更多推荐