文章目录
- 一、linux服务器配置redis
- 1、虚拟机安装Docker
- 2、安装redis
- 1)下载镜像文件
- 2)创建实例并启动
- 3)进入redis命令行
- 4)配置redis的持久化(重启redis,数据依然存在)
- 5)配置开机自启
- 二、SpringBoot项目直接使用Redis
- 1、导入redis基本依赖
- 2、配置redis
- 3、直接使用redis(默认状态下高并发下危险!)
- 1)普通使用
- 2)实践使用,复杂集合转化
- 3)压力测试下会报错(高并发下),堆外内存溢出
- 三、使用jedis操作redis
- 1、导入redis依赖时,不引入lettuce
- 2、引入jedis依赖
- 四、lettuce压力测试错误量大的原因
- 五、正确的使用缓存
一、linux服务器配置redis
1、虚拟机安装Docker
2、安装redis
1)下载镜像文件
sudo docker pull redis
2)创建实例并启动
mkdir -p /mydata/redis/conf
touch /mydata/redis/conf/redis.conf
docker run -p 6379:6379 --name redis -v /mydata/redis/data:/data \
-v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf
3)进入redis命令行
sudo docker exec -it redis redis-cli #docker exec在运行的容器中执行命令
exit#退出
4)配置redis的持久化(重启redis,数据依然存在)
# 打开配置文件
vi /mydata/redis/conf/redis.conf
# 配置文件中添加:
appendonly yes
5)配置开机自启
sudo docker update redis --restart=always
二、SpringBoot项目直接使用Redis
1、导入redis基本依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2、配置redis
spring:
redis:
database: 0
host: 127.0.0.1
lettuce:
pool:
max-active: 8 #最大连接数据库连接数,设 0 为没有限制
max-idle: 8 #最大等待连接中的数量,设 0 为没有限制
max-wait: -1ms #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
min-idle: 0 #最小等待连接中的数量,设 0 为没有限制
shutdown-timeout: 100ms
password: ''
port: 6379
3、直接使用redis(默认状态下高并发下危险!)
@Autowired
StringRedisTemplate stringRedisTemplate;
1)普通使用
2)实践使用,复杂集合转化
3)压力测试下会报错(高并发下),堆外内存溢出
- springboot2.0以后,默认使用
lettuce
作为操作redis的客户端,它使用netty进行网络通信。 -
lettuce
的bug导致netty堆外内存溢出-Xmx300m
; netty 如果没有指定堆外内存,默认使用-Xmx300m
。 - 可以通过
-Dio.netty.maxDirectMemory
进行设置(不能使用这个参数只去调大堆外内存)调大内存只会延迟异常。
无论怎么扩大内存,永远都会出现堆外内存溢出,原因是没有及时的进行内存释放,可以通过上述项延缓异常。
解决方案:
- 升级
lettuce
客户端;(可以修改参数,配置等) - 切换使用
jedis
。(很久没有更新,没有使用netty底层,用的老版本的底层)
三、使用jedis操作redis
1、导入redis依赖时,不引入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>
2、引入jedis依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
引入jedis之后使用方法不变,因为redisTemplate对lettuce和jedis都封装了的。
redisTemplate:lettuce、jedis是操作redis的底层客户端。Spring将lettuce和jedis再次封装为redisTemplate。
四、lettuce压力测试错误量大的原因
netty在底层计数,数字超出默认限制,就会抛出异常。
自己统计内存的使用量,操作完成之后会减内存的使用量。
原因可能是netty客户端在某一段操作的时候,没有及时调用减内存,导致堆外内存溢出。
五、正确的使用缓存