redisson使用过程常见问题汇总

文章目录

  • 常见报错
    • [1. 配置方式使用错误](#1. 配置方式使用错误)
    • [2. 版本差异报错](#2. 版本差异报错)
    • [3. 配置文件中配置了密码或者配置错误](#3. 配置文件中配置了密码或者配置错误)
    • [4. 字符集和序列化方式配置问题](#4. 字符集和序列化方式配置问题)
    • [5. Redisson的序列化问题](#5. Redisson的序列化问题)
    • [6. 连接池问题:](#6. 连接池问题:)
    • [7. Redisson的高可用性问题:](#7. Redisson的高可用性问题:)
    • [8. Redisson的并发问题](#8. Redisson的并发问题)
    • [9. Redisson的性能问题](#9. Redisson的性能问题)
  • [2. 参考文档](#2. 参考文档)

常见报错

1. 配置方式使用错误

Redisson 提供两种配置方式

  1. 第一种使用配置json文件 在application.properties 中使用 spring.redis.redisson.file=classpath:redisson.json

  2. 第二种spring.redis.redisson.config=里使用yaml格式如下

bash 复制代码
spring:
  redis:
   redisson: 
      config: |
        clusterServersConfig:
          idleConnectionTimeout: 10000
          connectTimeout: 10000
          timeout: 3000
          retryAttempts: 3
          retryInterval: 1500
          failedSlaveReconnectionInterval: 3000
          failedSlaveCheckInterval: 60000
          password: null
          subscriptionsPerConnection: 5
          clientName: null
          loadBalancer: !<org.redisson.connection.balancer.RoundRobinLoadBalancer> {}
          subscriptionConnectionMinimumIdleSize: 1
          subscriptionConnectionPoolSize: 50
          slaveConnectionMinimumIdleSize: 24
          slaveConnectionPoolSize: 64
          masterConnectionMinimumIdleSize: 24
          masterConnectionPoolSize: 64
          readMode: "SLAVE"
          subscriptionMode: "SLAVE"
          nodeAddresses:
          - "redis://127.0.0.1:7004"
          - "redis://127.0.0.1:7001"
          - "redis://127.0.0.1:7000"
          scanInterval: 1000
          pingConnectionInterval: 0
          keepAlive: false
          tcpNoDelay: false
        threads: 16
        nettyThreads: 32
        codec: !<org.redisson.codec.Kryo5Codec> {}
        transportMode: "NIO"

Caused by: com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'singleServerConfig': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false')

2. 版本差异报错

导致有的配置的变量名已经变更,使用老的配置项名称已经无法映射的配置对象上,如pingTimeoutuseLinuxNativeEpoll
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "pingTimeout"

Caused by: org.redisson.client.RedisException: ERR Client sent AUTH, but no password is set. channel: [id: 0xadf834eb, L:/20.0.2.11:65046 - R:epaas.e6gpshk.com/172.20.6.37:6379] command: (AUTH), params: (password masked)

3. 配置文件中配置了密码或者配置错误

如果redis服务器没有配置密码,则配置文件里面不能出现密码配置

如果服务端配置了密码,则配置文件中需要配置密码,不然错误信息如下
Caused by: org.redisson.client.RedisException: ERR Client sent AUTH, but no password is set. channel: [id: 0xadf834eb, L:/20.0.2.11:65046 - R:epaas.e6gpshk.com/172.20.6.37:6379] command: (AUTH), params: (password masked)

4. 字符集和序列化方式配置问题

如果使用jackson导致序列化字符串后,字符串带两个双引号,导致获取的时候查出来为空。

解决方法配置字符串序列化

可以通过以下步骤进行配置:

  1. 创建Redisson客户端的配置对象:
java 复制代码
Config config = new Config();
  1. 创建StringCodec对象,并设置其序列化方式:
java 复制代码
StringCodec stringCodec = new StringCodec(Charset.forName("UTF-8"));
// 或者使用其他支持的编码方式,如ISO-8859-1
  1. 将StringCodec对象设置为Redisson的默认编码器:
java 复制代码
config.setCodec(stringCodec);
  1. 创建Redisson客户端:
java 复制代码
RedissonClient redissonClient = Redisson.create(config);

可以将Redisson的string类型数据的序列化方式配置为指定的编码方式。一般使用UTF-8编码方式,你也可以根据实际需求选择其他编码方式。

5. Redisson的序列化问题

  • 问题:使用默认的JDK序列化方式,在对象序列化和反序列化时可能会遇到兼容性问题。
  • 解决方案:可以使用其他序列化方案如FastJson或Jackson,通过设置自定义编码器来解决兼容性问题。

示例代码:

java 复制代码
Config config = new Config();
config.setCodec(new JsonJacksonCodec()); // 使用Jackson序列化
RedissonClient redisson = Redisson.create(config);

6. 连接池问题:

  • 问题:连接池中的连接数不足,导致请求被阻塞。
  • 解决方案:增加连接池的最大连接数,或者调整连接池的配置参数,如最小空闲连接数和连接超时时间,以适应系统的并发需求。

示例配置:

java 复制代码
Config config = new Config();
config.useSingleServer()
        .setAddress("redis://127.0.0.1:6379")
        .setConnectionPoolSize(100) // 设置连接池大小
        .setConnectionMinimumIdleSize(10) // 设置最小空闲连接数
        .setConnectTimeout(3000); // 设置连接超时时间
RedissonClient redisson = Redisson.create(config);

7. Redisson的高可用性问题:

  • 问题:当Redis主节点宕机时,应用程序无法连接到Redis数据库。
  • 解决方案:使用Redisson的哨兵模式或集群模式,配置多个Redis节点,当主节点宕机时自动切换到备用节点。

示例配置(哨兵模式):

java 复制代码
Config config = new Config();
config.useSentinelServers()
        .addSentinelAddress("redis://127.0.0.1:26379")
        .addSentinelAddress("redis://127.0.0.1:26380")
        .setMasterName("mymaster");
RedissonClient redisson = Redisson.create(config);

8. Redisson的并发问题

  • 问题:多个线程同时访问共享资源可能导致数据不一致或竞争条件。
  • 解决方案:使用Redisson的分布式锁来保证同一时间只有一个线程可以访问共享资源,或者使用原子操作来保证数据的原子性操作。

示例代码(分布式锁):

java 复制代码
RLock lock = redisson.getLock("myLock");
lock.lock();
try {
    // 执行需要互斥的操作
} finally {
    lock.unlock();
}

9. Redisson的性能问题

  • 问题:系统并发量大时,Redisson的性能下降。
  • 解决方案:增加连接池的大小,使用异步操作来提高吞吐量,使用集群化部署和数据分片来提高并发性能。

示例配置(异步操作):

java 复制代码
Config config = new Config();
config.useSingleServer()
        .setAddress("redis://127.0.0.1:6379")
        .setConnectionPoolSize(100)
        .setNettyThreads(0)
        .setThreads(0)
        .setTransportMode(TransportMode.EPOLL)
        .setUseLinuxNativeEpoll(true); // 使用异步操作提高性能
RedissonClient redisson = Redisson.create(config);

10 . Redisson的版本兼容问题:

  • 问题:使用不兼容的Redisson版本可能导致运行时错误。
  • 解决方案:在使用Redisson之前,确认Redisson的版本与Redis服务器的版本兼容,可以查阅Redisson的官方文档或咨询社区来获取相关信息。

示例代码(Maven依赖):

xml 复制代码
<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson</artifactId>
    <version>3.15.2</version> <!-- 根据实际需求选择合适的版本 -->
</dependency>

2. 参考文档

参考文档

相关推荐
星星点点洲2 小时前
【Redis】谈谈Redis的设计
数据库·redis·缓存
Lion Long7 小时前
CodeBuddy 中国版 Cursor 实战:Redis+MySQL双引擎驱动〈王者荣耀〉战区排行榜
数据库·redis·mysql·缓存·腾讯云·codebuddy首席试玩官·codebuddy
柯南二号15 小时前
MacOS 用brew 安装、配置、启动Redis
redis
星星点点洲17 小时前
【Redis】RedLock实现原理
redis·缓存
我来整一篇17 小时前
用Redis的List实现消息队列
数据库·redis·list
加什么瓦18 小时前
Redis——数据结构
数据库·redis·缓存
lybugproducer19 小时前
浅谈 Redis 数据类型
java·数据库·redis·后端·链表·缓存
青山是哪个青山19 小时前
Redis 常见数据类型
数据库·redis·bootstrap
杨不易呀19 小时前
Java面试全记录:Spring Cloud+Kafka+Redis实战解析
redis·spring cloud·微服务·kafka·高并发·java面试·面试技巧