黑马Redis课程小作业List缓存的实现

/**
     * 用List实现
     *
     * @return
     */
    @Override
    public Result queryList() {
        List<ShopType> typeList = new ArrayList<ShopType>();
        //先查redis
        Long size = stringRedisTemplate.opsForList().size(CACHE_SHOP_TYPE_KEY);
        if (size != 0) {
            //redis存在,直接返回
            for (int i = 0; i < size; i++) {
                String typeStr = stringRedisTemplate.opsForList().rightPopAndLeftPush(CACHE_SHOP_TYPE_KEY, CACHE_SHOP_TYPE_KEY);
                ShopType type = JSONUtil.toBean(typeStr, ShopType.class);
                typeList.add(type);
            }
            return Result.ok(typeList);
        }
        //redis没有,查db
        typeList = query().orderByAsc("sort").list();
        //如果db也没有,报错
        if (CollectionUtils.isEmpty(typeList)) {
            //缓存null ,防止穿透
            stringRedisTemplate.opsForList().leftPush(CACHE_SHOP_TYPE_KEY, null);
            stringRedisTemplate.expire(CACHE_SHOP_TYPE_KEY, CACHE_SHOP_TYPE_TTL, TimeUnit.MINUTES);
            return Result.fail("商铺类型不存在!!");
        }

        //重新缓存
        stringRedisTemplate.opsForList().leftPushAll(CACHE_SHOP_TYPE_KEY, typeList.stream().map(shopType -> JSONUtil.toJsonStr(shopType)).collect(Collectors.toList()));
        stringRedisTemplate.expire(CACHE_SHOP_TYPE_KEY, CACHE_SHOP_TYPE_TTL, TimeUnit.MINUTES);
        return Result.ok(typeList);
    }
经验分享 程序员 微信小程序 职场和发展