@Override
public Map<String, List<Catelog2Vo>> getCatalogJson() {
//给缓存中放json字符串,拿出的字符串还能逆转成能用的对象类型【序列化和反序列化】
//加入缓存逻辑,缓存中存的是json字符串
//json跨语言跨平台
ValueOperations<String, String> ops = redisTemplate.opsForValue();
String catalogJson = ops.get("catalogJson");
if (catalogJson == null) {
//缓存中没有,查询数据库
Map<String, List<Catelog2Vo>> categoriesObjDb = getCatalogJsonFromDB();
//将数据库中查到的数据,转为json放入缓存
String toJSONString = JSON.toJSONString(categoriesObjDb);
ops.set("catalogJson",toJSONString);
return categoriesObjDb;
}
//转为指定的对象
Map<String, List<Catelog2Vo>> catalogJsonObj = JSON.parseObject(catalogJson, new TypeReference<Map<String, List<Catelog2Vo>>>() {});
return catalogJsonObj;
}
//从数据库查询并封装分类数据
public Map<String, List<Catelog2Vo>> getCatalogJsonFromDB() {
//将数据库的多次查询变为一次
List<CategoryEntity> selectList = baseMapper.selectList(null);
// 查询所有一级分类
List<CategoryEntity> level1 = getParent_cid(selectList,0L);
Map<String, List<Catelog2Vo>> catalogJson = level1.stream().collect(Collectors.toMap(k -> k.getCatId().toString(), v -> {
// 拿到每一个一级分类 然后查询他们的二级分类
List<CategoryEntity> level2 = getParent_cid(selectList,v.getCatId());
List<Catelog2Vo> catelog2Vos = null;
if (level2 != null) {
catelog2Vos = level2.stream().map(l2 -> {
Catelog2Vo catelog2Vo = new Catelog2Vo(v.getCatId().toString(),null , l2.getCatId().toString(), l2.getName());
// 找当前二级分类的三级分类
List<CategoryEntity> level3 = getParent_cid(selectList,l2.getCatId());
// 三级分类有数据的情况下
if (level3 != null) {
List<Catelog2Vo.Catelog3Vo> catelog3Vos = level3.stream().map((l3) -> {
Catelog2Vo.Catelog3Vo catelog3Vo = new Catelog2Vo.Catelog3Vo(l2.getCatId().toString(),l3.getCatId().toString(),l3.getName());
return catelog3Vo;
}).collect(Collectors.toList());
catelog2Vo.setCatalog3List(catelog3Vos);
}
return catelog2Vo;
}).collect(Collectors.toList());
}
return catelog2Vos;
}));
return catalogJson;
}
private List<CategoryEntity> getParent_cid( List<CategoryEntity> selectList,Long parent_cid) {
List<CategoryEntity> collect = selectList.stream().filter(item -> item.getParentCid() == parent_cid).collect(Collectors.toList());
return collect;
}
大并发量压力测试会出现堆外内存溢出异常
RedisTemplate是对lettuce和jedis的再次封装。
lettuce底层使用netty与redis进行通信,吞吐量大,jedis比较老 很久没更新了。
线上的时候再切换回lettuce
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<exclusions>
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>