1、引用redis jar包
<!-- 基础包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
-->
<!-- 排除lettuce 引用jedis -->
<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>
2、配置redis的host
application.yml
redis:
host: 127.0.0.1
port:6379
//password:
3、使用springboot自动配置好的StringRedisTemplate来操作redis
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Override
public Map<String, List<Catelog2Vo>> getCatelogJson() {
//给缓存中放json字符串,拿出的json字符串,还用逆转为能用的对象类型:【序列化与反序列化】
//1、加入缓存逻辑,缓存中存的数据是json字符串
//JSON跨语言跨平台兼容
String catelogJSON = stringRedisTemplate.opsForValue().get("catelogJSON");
if (StringUtils.isEmpty(catelogJSON)){
//2、缓存中没有,查询数据库
Map<String, List<Catelog2Vo>> catelogJsonFromDb = getCatelogJsonFromDb();
//3、查到的数据再放入缓存,将对象转为json放在缓存中
String s=JSON.toJSONString(catelogJsonFromDb);
stringRedisTemplate.opsForValue().set("catelogJSON",s);
return catelogJsonFromDb;
}
//转换为指定对象
Map<String,List<Catelog2Vo>> result=JSON.parseObject(catelogJSON,new TypeReference<Map<String,List<Catelog2Vo>>>(){});
return result;
}
4、缓存使用用内存泄露及解决 —— jedis
? ? 1)springboot2.0以后默认使用lettuce作为redis的客户端,它使用netty进行网络通信
? ? 2)lettuce的bug导致netty堆外内存溢出 ;netty如果没有指定堆外内存,默认使用-Xmx300m;可以通过用-Dio.netty.maxDirectMemory进行设置
解决方案:不能使用-Dio.netty.maxDirectMemory只去调大堆外内存
? ? 1)升级lettuce客户端
? ? 2)切换使用jedis
pom:
排除lettuce引用jedis
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<!--exclusions直接排除lettuce-->
<exclusions>
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>:lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--引用jedis-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
|