redisson使用过程常见问题汇总

2023-09-11 23:13:36


在这里插入图片描述

常见报错

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"

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

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

5. Redisson的序列化问题

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

示例代码:

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

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);

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);

8. Redisson的并发问题

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

示例代码(分布式锁):

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

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);

10 . Redisson的版本兼容问题:

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

示例代码(Maven依赖):

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

2. 参考文档

参考文档

更多推荐

的修大数据管理平台有哪些功能模块?它可以为企业带来什么好处?

的修大数据管理平台的功能比较强大,它提供了报修、维修、巡检、能耗、智识库、管线智慧云等应用场景服务,同时还可以为企业提供维保进度追踪、员工考核、服务流程管控、设备资产管理等一站式解决方案。平台通过多渠道报修、“一站式”投诉建议服务、企业云课堂、智能巡检、配件管理、多维度数据分析等功能,打造了移动、便捷、高效、安全、智能

国外发达国家码农是真混得好么?

来看看花旗工作十多年的码农怎么说吧!美国最大的论坛Reddit,之前有一个热帖:一个程序员说自己喝醉了,软件工程师已经当了10年,心里有好多话想说,“我可能会后悔今天说了这些话。”他洋洋洒洒写了一大堆,获得9700多个赞。内容很有意思,和题主“国外发达国家码农真的混的好么”这个问题很贴切,而且是10年老程的员的肺腑之言

外包干了2个月,技术退步明显.......

先说一下自己的情况,大专生,18年通过校招进入武汉某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试,已经让我变得不思进取,谈了2年的女朋友也因为我的心态和工资和我分手了。于是,我决定要改变现状,冲击下大厂。刚开始准备时

Spring Cloud超越微服务:服务网格的崭露头角

文章目录1.微服务的挑战2.什么是服务网格?3.SpringCloud和服务网格服务发现负载均衡安全性服务网格扩展4.服务网格的优势4.1.解耦通信逻辑4.2.提高可观察性4.3.灰度发布和流量控制4.4.安全性5.未来展望6.结论🎉欢迎来到架构设计专栏~SpringCloud超越微服务:服务网格的崭露头角☆*o(≧

大数据-Spark-Spark开发高频面试题

一、spark的内存分布堆内内存:在这使用堆内内存的时候,如果我们设置了堆内内存2个g的话,读取的数据也是两个g,此时又来两个g的数据,这样就会产生OOM溢出,因为处理完两个g的数据,并不会马上进行GC。堆外内存:这样我们就可以使用堆外内存,也就是物理内存,堆外内存可以精准的申请和释放空间,不需要Gc,性能比较高,提升

基于Hadoop的MapReduce网站日志大数据分析(含预处理MapReduce程序、hdfs、flume、sqoop、hive、mysql、hbase组件、echarts)

需要本项目的可以私信博主!!!本项目包含:PPT,可视化代码,项目源码,配套Hadoop环境(解压可视化),shell脚本,MapReduce代码,文档以及相关说明教程,大数据集!本文介绍了一种基于Hadoop的网站日志大数据分析方法。本项目首先将网站日志上传到HDFS分布式文件系统,然后使用MapReduce进行数据

Microsoft Excel 101 简介

什么是MicrosoftExcel?MicrosoftExcel是一个电子表格程序,用于记录和分析数值数据。将电子表格想像成构成表格的列和行的集合。字母通常分配给列,数字通常分配给行。列和行相交的点称为像元。单元格的地址由代表列的字母和代表行的数字给出。让我们使用下图说明这一点。为什么要学习MicrosoftExcel

IF,AND,OR 或嵌套 IF &在 Excel 中不是逻辑函数

事情并非总是我们希望的那样。意外的事情可能发生。例如,假设您必须将数字相除。尝试将任何数字除以零(0)都会产生错误。在这种情况下,逻辑功能很方便。在本教程中,我们将涵盖以下主题。在本教程中,我们将涵盖以下主题。什么是逻辑功能此功能使我们能够在执行公式和函数时引入决策制定。功能习惯于;检查条件是对还是错结合多个条件Wha

【Linux】线程池 | 自旋锁 | 读写锁

文章目录一、线程池1.线程池模型和应用场景2.单例模式实现线程池(懒汉模式)二、其他常见的锁1.STL、智能指针和线程安全2.其他常见的锁三、读者写者问题1.读者写者模型2.读写锁一、线程池1.线程池模型和应用场景线程池是一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等

深度学习之模型压缩、加速模型推理

简介当将一个机器学习模型部署到生产环境中时,通常需要满足一些在模型原型阶段没有考虑到的要求。例如,在生产中使用的模型将不得不处理来自不同用户的大量请求。因此,您将希望进行优化,以获得较低的延迟和/或吞吐量。延迟:是任务完成所需的时间,就像单击链接后加载网页所需的时间。它是开始某项任务和看到结果之间的等待时间。吞吐量:是

Linux内核源码分析 (B.9)深度解读 Linux 内核级通用内存池 —— kmalloc 体系

Linux内核源码分析(B.9)深度解读Linux内核级通用内存池——kmalloc体系文章目录Linux内核源码分析(B.9)深度解读Linux内核级通用内存池——kmalloc体系1\.kmalloc内存池中都有哪些尺寸的内存块2\.kmalloc内存池如何选取合适尺寸的内存块3\.kmalloc内存池的整体架构4

热文推荐