✅P153_缓存-缓存使用-改造三级分类业务

gong_yz大约 1 分钟谷粒商城

将三级分类数据放入缓存

    //TODO 产生堆外内存溢出OutOfDirectMemoryError:
    //1)、springboot2.0以后默认使用lettuce操作redis的客户端,它使用通信
    //2)、lettuce的bug导致netty堆外内存溢出   可设置:-Dio.netty.maxDirectMemory
    //解决方案:不能直接使用-Dio.netty.maxDirectMemory去调大堆外内存
    //1)、升级lettuce客户端。      2)、切换使用jedis
    // @Override
    public Map<String, List<Catelog2Vo>> getCatalogJson2() {
        //给缓存中放json字符串,拿出的json字符串,反序列为能用的对象

        /**
         * 1、空结果缓存:解决缓存穿透问题
         * 2、设置过期时间(加随机值):解决缓存雪崩
         * 3、加锁:解决缓存击穿问题
         */

        //1、加入缓存逻辑,缓存中存的数据是json字符串
        //JSON跨语言。跨平台兼容。
        ValueOperations<String, String> ops = stringRedisTemplate.opsForValue();
        String catalogJson = ops.get("catalogJson");
        
        if (StringUtils.isEmpty(catalogJson)) {
            System.out.println("缓存不命中...查询数据库...");
            //2、缓存中没有数据,查询数据库
            Map<String, List<Catelog2Vo>> catalogJsonFromDb = getCatalogJsonFromDbWithRedissonLock();

            return catalogJsonFromDb;
        }

        System.out.println("缓存命中...直接返回...");
        //转为指定的对象
        Map<String, List<Catelog2Vo>> result = JSON.parseObject(catalogJson,new TypeReference<Map<String, List<Catelog2Vo>>>(){});

        return result;
    }

序列化与反序列化

序列化:我们将java对象转化为跨语言、跨平台兼容的json存入到缓存中即为序列化

反序列化:我们将json数据转化为可用的java对象,即为反序列化