✅P153_缓存-缓存使用-改造三级分类业务
大约 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对象,即为反序列化