1.遇到的问题 产生堆外内存溢出异常,OutOfDirectMemory
2.分析
- 1).springBoot2.0以后使用lettuce作为操作redis的客户端,它使用netty进行网络通信
- 2).lettuce的bug导致netty堆外内存溢出,netty如果没有指定堆外内存,默认使用-Xmx
- 3).可以通过-Dio.netty.maxDirectMemory进行设置,不能使用-Dio.netty.maxDirectMemory只去调大堆外内存
3. 解决方案:
* 1.升级lettuce客户端,
* 2.切换使用jedis
*
* lettuce,jedis来操作redis的底层客户端,spring在底层对lettuce和jedis进行了再封装redisTemplate
*
* 查看 RedisAutoConfiguration 自动配置类我们可以看到
* @Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })
* public class RedisAutoConfiguration
这里使用切换jedis的方式:
<!--引入redis-->
<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>