• redisson使用过程常见问题汇总



    在这里插入图片描述

    常见报错

    1. 配置方式使用错误

    Redisson 提供两种配置方式
    1. 第一种使用配置json文件 在application.properties 中使用 spring.redis.redisson.file=classpath:redisson.json
    2. 第二种spring.redis.redisson.config=里使用yaml格式如下

    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"
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

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

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

    5. Redisson的序列化问题

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

    示例代码:

    Config config = new Config();
    config.setCodec(new JsonJacksonCodec()); // 使用Jackson序列化
    RedissonClient redisson = Redisson.create(config);
    
    • 1
    • 2
    • 3

    6. 连接池问题:

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

    示例配置:

    Config config = new Config();
    config.useSingleServer()
            .setAddress("redis://127.0.0.1:6379")
            .setConnectionPoolSize(100) // 设置连接池大小
            .setConnectionMinimumIdleSize(10) // 设置最小空闲连接数
            .setConnectTimeout(3000); // 设置连接超时时间
    RedissonClient redisson = Redisson.create(config);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    7. Redisson的高可用性问题:

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

    示例配置(哨兵模式):

    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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    8. Redisson的并发问题

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

    示例代码(分布式锁):

    RLock lock = redisson.getLock("myLock");
    lock.lock();
    try {
        // 执行需要互斥的操作
    } finally {
        lock.unlock();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    9. Redisson的性能问题

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

    示例配置(异步操作):

    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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    10 . Redisson的版本兼容问题:

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

    示例代码(Maven依赖):

    <dependency>
        <groupId>org.redissongroupId>
        <artifactId>redissonartifactId>
        <version>3.15.2version> 
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2. 参考文档

    参考文档

  • 相关阅读:
    网络安全-IP地址信息收集
    忘忧大陆-功能完备的社交项目整体介绍
    JVM中常见的垃圾回收器
    Hive 和 HDFS、MySQL 之间的关系
    【人工智能与深度学习】解码语言模型
    c++day7
    Xcode打包ipa文件,查看app包内文件
    【机器学习项目实战10例】(三):基于K近邻的葡萄酒质量检测项目
    Apache DolphinScheduler & 亚马逊云科技联合Meetup: 基于云上的最佳实践
    【勇敢饭饭,不怕刷题之链表】链表反转的几种情况
  • 原文地址:https://blog.csdn.net/wangshuai6707/article/details/132802295