【黑马点评】实战篇-作业-店铺类型缓存-List实现

查询店铺类型信息

这里使用opsForList实现
最终redis上的数据如下:
在这里插入图片描述

1. ShopTypeController.java

Controller层

@RestController
@RequestMapping("/shop-type")
public class ShopTypeController {
    @Resource
    private IShopTypeService typeService;

    @GetMapping("list")
    public Result queryTypeList() {
        return typeService.queryTypeList();
    }
}

2. IShopTypeService.java

IService接口层,继承MP

public interface IShopTypeService extends IService<ShopType> {
    Result queryTypeList();
}

3. ShopTypeServiceImpl.java

使用opsForList实现

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

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Override
    public Result queryTypeList() {
        // opsForList写法
        // public static final String CACHE_SHOP_TYPE_KEY = "cache:shopType:";
        String key = CACHE_SHOP_TYPE_KEY;
        // 1. 从Redis查询 商铺类型缓存 , end:-1 表示取全部数据
        List<String> shopTypeJson = stringRedisTemplate.opsForList().range(key, 0, -1);
        // 2. 有就直接返回
        if (CollectionUtil.isNotEmpty(shopTypeJson)) {
            // JSON字符串转对象 排序后返回
            List<ShopType> shopTypes = JSONUtil.toList(shopTypeJson.toString(), ShopType.class);
            Collections.sort(shopTypes, ((o1, o2) -> o1.getSort() - o2.getSort()));
            return Result.ok(shopTypes);
        }
        // 3. 没有就向数据库查询 MP的query()拿来用
        List<ShopType> shopTypes = query().orderByAsc("sort").list();
        // 4. 不存在,返回错误
        if (CollectionUtil.isEmpty(shopTypes)){
            return Result.fail("商铺类型不存在...");
        }
        // 5. 存在, 写入Redis,这里使用Redis的List类型,String类型,就是直接所有都写在一起,对内存开销比较大。
            // 要将List中的每个元素(元素类型ShopType) ,每个元素都要单独转成JSON,使用stream流的map映射
            // Hutools里的 BeanUtil.copyToList 本来想模仿UserService中的写法,
            // 传入一个CopyOptions的,但是setFieldValueEditor貌似只对beanToMap有效
            // 改用流的形式转换每个list元素
        List<String> shopTypesJson = shopTypes.stream()
                .map(shopType -> JSONUtil.toJsonStr(shopType))
                .collect(Collectors.toList());
        // 因为从数据库读出来的时候已经是按照顺序读出来的,这里想要维持顺序必须从右边push,类似队列
        stringRedisTemplate.opsForList().rightPushAll(key, shopTypesJson);
        // 5. 返回
        return Result.ok(shopTypes);
    }
}
posted @ 2024-10-23 12:08  chendsome  阅读(291)  评论(0)    收藏  举报  来源