文章目录

  • 一、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

centos下的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)普通使用

incr处理并发 redis redis处理高并发实例_spring

2)实践使用,复杂集合转化

incr处理并发 redis redis处理高并发实例_spring_02


incr处理并发 redis redis处理高并发实例_incr处理并发 redis_03

3)压力测试下会报错(高并发下),堆外内存溢出

incr处理并发 redis redis处理高并发实例_docker_04

  • 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。

incr处理并发 redis redis处理高并发实例_docker_05

四、lettuce压力测试错误量大的原因

netty在底层计数,数字超出默认限制,就会抛出异常。

自己统计内存的使用量,操作完成之后会减内存的使用量。

原因可能是netty客户端在某一段操作的时候,没有及时调用减内存,导致堆外内存溢出。

五、正确的使用缓存