常见Redis使用问题

2023-11-09

一 lettuce使用问题

1 问题描述

Redis Cluster集群,当master宕机,主从切换,客户端报错 timed out

2 原因

SpringBoot2.X版本开始Redis默认的连接池都是采用的Lettuce。当节点发生改变后,Letture默认是不会刷新节点拓扑的。

3 解决方案

3.1 方案一:把lettuce换成jedis

推荐版本:jedis 2.9+
只需要在pom.xml里调整一下依赖的引用

      <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-data-redis</artifactId>
           <version>2.1.5.RELEASE</version>
               <!-- 不用lettuce ,用jedis -->
               <exclusions>
                   <exclusion>
                       <groupId>io.lettuce</groupId>
                       <artifactId>lettuce-core</artifactId>
                   </exclusion>
               </exclusions>
       </dependency>
       <dependency>
           <groupId>redis.clients</groupId>
           <artifactId>jedis</artifactId>
           <version>3.1.0-m4</version>
       </dependency>

3.2 方案二:刷新节点拓扑视图

Redis节点异常,服务端的Redis集群拓扑被刷新了,Java程序没有获取到新的拓扑。
Lettuce官方文档中关于Redis Cluster的相关说明:Lettuce处理Moved和Ask永久重定向,由于命令重定向,你必须刷新节点拓扑视图。而自适应拓扑刷新(Adaptive updates)与定时拓扑刷新(Periodic updates)是默认关闭的,可以通过如下代码打开。
https://github.com/lettuce-io/lettuce-core/wiki/Redis-Cluster#user-content-refreshing-the-cluster-topology-view
在这里插入图片描述

修改代码如下

package com.montnets.common.redis;

import io.lettuce.core.ClientOptions;
import io.lettuce.core.cluster.ClusterClientOptions;
import io.lettuce.core.cluster.ClusterTopologyRefreshOptions;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.connection.RedisClusterConfiguration;
import org.springframework.data.redis.connection.RedisNode;
import org.springframework.data.redis.connection.RedisPassword;
import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration;
import org.springframework.stereotype.Component;

import java.time.Duration;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

@Component
public class RedisPoolConfig {

    @Autowired
    private RedisProperties redisProperties;

    public GenericObjectPoolConfig<?> genericObjectPoolConfig(RedisProperties.Pool properties) {
        GenericObjectPoolConfig<?> config = new GenericObjectPoolConfig<>();
        config.setMaxTotal(properties.getMaxActive());
        config.setMaxIdle(properties.getMaxIdle());
        config.setMinIdle(properties.getMinIdle());
        if (properties.getTimeBetweenEvictionRuns() != null) {
            config.setTimeBetweenEvictionRunsMillis(properties.getTimeBetweenEvictionRuns().toMillis());
        }
        if (properties.getMaxWait() != null) {
            config.setMaxWaitMillis(properties.getMaxWait().toMillis());
        }
        return config;
    }

    @Bean(destroyMethod = "destroy")
    public LettuceConnectionFactory lettuceConnectionFactory() {

        //开启 自适应集群拓扑刷新和周期拓扑刷新
        ClusterTopologyRefreshOptions clusterTopologyRefreshOptions =  ClusterTopologyRefreshOptions.builder()
                // 开启全部自适应刷新
                .enableAllAdaptiveRefreshTriggers() // 开启自适应刷新,自适应刷新不开启,Redis集群变更时将会导致连接异常
                // 自适应刷新超时时间(默认30秒)
                .adaptiveRefreshTriggersTimeout(Duration.ofSeconds(30)) //默认关闭开启后时间为30秒
                // 开周期刷新
                .enablePeriodicRefresh(Duration.ofSeconds(20))  // 默认关闭开启后时间为60秒 ClusterTopologyRefreshOptions.DEFAULT_REFRESH_PERIOD 60  .enablePeriodicRefresh(Duration.ofSeconds(2)) = .enablePeriodicRefresh().refreshPeriod(Duration.ofSeconds(2))
                .build();

        // https://github.com/lettuce-io/lettuce-core/wiki/Client-Options
        ClientOptions clientOptions = ClusterClientOptions.builder()
                .topologyRefreshOptions(clusterTopologyRefreshOptions)
                .build();

        LettuceClientConfiguration clientConfig = LettucePoolingClientConfiguration.builder()
                .poolConfig(genericObjectPoolConfig(redisProperties.getJedis().getPool()))
                //.readFrom(ReadFrom.MASTER_PREFERRED)
                .clientOptions(clientOptions)
                .commandTimeout(redisProperties.getTimeout()) //默认RedisURI.DEFAULT_TIMEOUT 60
                .build();

        List<String> clusterNodes = redisProperties.getCluster().getNodes();
        Set<RedisNode> nodes = new HashSet<RedisNode>();
        clusterNodes.forEach(address -> nodes.add(new RedisNode(address.split(":")[0].trim(), Integer.valueOf(address.split(":")[1]))));

        RedisClusterConfiguration clusterConfiguration = new RedisClusterConfiguration();
        clusterConfiguration.setClusterNodes(nodes);
        clusterConfiguration.setPassword(RedisPassword.of(redisProperties.getPassword()));
        clusterConfiguration.setMaxRedirects(redisProperties.getCluster().getMaxRedirects());

        LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(clusterConfiguration, clientConfig);
        // lettuceConnectionFactory.setShareNativeConnection(false); //是否允许多个线程操作共用同一个缓存连接,默认true,false时每个操作都将开辟新的连接
        // lettuceConnectionFactory.resetConnection(); // 重置底层共享连接, 在接下来的访问时初始化
        return lettuceConnectionFactory;
    }
}

二 哨兵模式使用问题

1 问题描述

Redis Sentinel模式,应用代码里只配置master节点,当master宕机,主从切换,客户端报错

2 解决方案

通过哨兵连接节点,应用连接配置master name应该和实例名称保持一致

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

常见Redis使用问题 的相关文章

  • 找不到模块“socket.io/node_modules/redis”

    当尝试做的时候 var redis require socket io node modules redis 我收到错误 找不到模块 socket io node modules redis 我不明白为什么 我正在运行 Windows 并运
  • 如何清理redis中不活跃的玩家?

    我正在制作一个使用 redis 来存储游戏状态的游戏 它可以很好地跟踪位置和玩家 但我没有一个好的方法来清理不活跃的玩家 每当玩家移动时 这是一个半慢速移动游戏 想想每秒 1 5 帧 我就会用新位置更新哈希并删除旧位置键 跟踪活跃玩家的最佳
  • 使用brew在MacOSx上安装Redis JSON

    如何使用brew 在 macOSx 上安装 RedisJSON 如何在不编译redis的情况下启用redis上的模块 我不想使用 docker 客户端 Redis Stack 可能是最简单的方法 它不仅仅是 RedisJSON 还包括 Re
  • Redis 块推送直到列表有空位

    我正在寻找类似的东西BLPUSH该命令将阻塞 直到列表的长度低于指定值max size 目的是防止生产者运行速度快于消费者时列表无限增长 功能与 python 非常相似Queue put https docs python org 3 li
  • Redis键空间事件不触发

    我有两个 Redis 客户端 在一个文件中我有一个简单的脚本设置并删除了 Redis 键 var redis require redis var client redis createClient 6379 127 0 0 1 client
  • 如何设置 Celery 以通过 ssl 与 Azure Redis 实例对话

    使用 的伟大答案 如何在microsoft azure上的django项目中配置celery redis https stackoverflow com questions 39616701 how to configure celery
  • WSL Redis 遇到系统尚未使用 systemd 作为 init 系统(PID 1)启动。无法操作[已关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试遵循本文中讨论的 Redis 安装过程article https www digitalocean com community
  • 是否有可嵌入的 Java 替代 Redis?

    根据这个线程 https stackoverflow com questions 3047010 best redis library for java 如果我想从Java中使用Redis Jedis是最好的选择 然而 我想知道是否有任何库
  • Docker-compose Predis 不通过 PHP 连接

    我正在尝试使用 docker compose 将 PHP 与 redis 连接 docker compose yml version 2 services redis image redis 3 2 2 php image company
  • Spring Data Redis JedisConnectionException:流意外结束

    雷迪斯3 0 5Spring数据Redis 1 3 6绝地武士2 6 3 我们的 Web 应用程序通过 pub sub 从 Redis 接收数据 还以键 值对的形式在 Redis 上执行数据读 写 读 写发生在监听线程 独立监控线程和htt
  • 从redis中检索大数据集

    一台服务器上的应用程序查询另一台服务器上运行的 Redis 查询的结果数据集约为 250kzrangebyscore objects locations inf inf这在应用程序服务器上似乎需要 40 秒 当使用命令执行时redis cl
  • 如何测试我的 Redis 缓存是否正常工作?

    我已经安装了 django redis cache 和 redis py 我遵循了 Django 的缓存文档 据我所知 以下设置就是我所需要的 但我如何判断它是否正常工作 设置 py CACHES default BACKEND redis
  • 使用 Redis 命令 incr 和 expire 时的竞争条件

    根据redis文档 http redis io commands incr http redis io commands incr 在段落模式 速率限制器 2 较短的版本代码 value INCR ip IF value 1 THEN EX
  • socket.io 广播功能 & Redis pub/sub 架构

    如果有人能帮助我解决一个小疑问 我将不胜感激 使用socket io广播功能和在Redis上使用pub sub设计架构有什么区别 例如 在另一个示例中 node js 服务器正在侦听 socket io 针对 键 模型 todo 和值 数据
  • Node Js:Redis 作业在完成其任务后未完成

    希望你们做得很好 我在我的 Nodejs 项目中实现了 BullMQ Bull 的下一个主要版本 来安排发送电子邮件的作业 例如 发送忘记密码请求的电子邮件 所以 我编写了如下所示的代码 用户服务 await resetPasswordJo
  • Lua中按字符分割字符串

    我有像这样的字符串 ABC DEF 我需要将它们分开 字符并将两个部分分别分配给一个变量 在 Ruby 中 我会这样做 a b ABC DEF split 显然Lua没有这么简单的方法 经过一番挖掘后 我找不到一种简短的方法来实现我所追求的
  • 使用 Sentinels 升级 Redis 的最佳实践?

    我有 3 个 Redis 节点 由 3 个哨兵监视 我进行了搜索 文档似乎不清楚如何最好地升级此类配置 我目前使用的是 3 0 6 版本 我想升级到最新的 5 0 5 我对这方面的程序有几个疑问 升级两个大版本可以吗 我在我们的暂存环境中执
  • StackExchange.Redis的正确使用方法

    这个想法是使用更少的连接和更好的性能 连接会随时过期吗 对于另一个问题 redis GetDatabase 打开新连接 private static ConnectionMultiplexer redis private static ID
  • redis 2.8.7 Linux Sentinel环境配置问题,如何使其自启动,应该订阅什么?

    现在我们尝试使用 redis 2 8 7 作为缓存存储 来自使用 booksleeve 客户端的 NET Web 应用程序 目前看来这是一个非常有趣和令人兴奋的任务 redis 文档非常好 但由于缺乏真正的实践经验 我确实有几个关于如何正确
  • 想要在后台不间断地运行redis-server

    我已经下载了 redis 2 6 16 tar gz 文件并安装成功 安装后我运行 src redis server 它工作正常 但我不想每次都手动运行 src redis server 而是希望 redis server 作为后台进程持续

随机推荐

  • 集成服饰SCM系统领猫连通更多应用

    场景描述 基于领猫开放API能力 无代码集成领猫连接多个应用 实现客户管理 款式管理 物料管理 合同管理 财务管理等 通过Aboter搭建业务自动化流程 实现多个应用的数据集成 接口能力 基础资料 研发管理 款式管理 订单管理 成品采购 外
  • Java中常量、变量及基本数据类型

    1 常量 在程序包运行过程中 固定不变的量 常量的分类 字符串常量 凡是用双引号引起来的部分 叫做字符串常量 两个双引号中间的呢绒可以为空 字符常量 凡是用单个引号引起来的单个字符 叫做字符常量 两个单引号中间必须有且只有一个字符 必能为空
  • 浏览器web播放rtsp视频流解决方案(chrome/IE/firefox/360等)

    代码中的具体参数含义 大家可以移步这里 https wiki videolan org Documentation WebPlugin 找半天 HTML5的可以支持RTMP 但是无法播放RTSP flash也止步于RTMP 最后同事推荐了个
  • 常用数据库连接URL地址大全

    转自 https www cnblogs com activiti p 6703478 html 1 Oracle8 8i 9i数据库 thin模式 Class forName oracle jdbc driver OracleDriver
  • 虚拟文件系统

    VFS的层次 文件系统实现与用户进程 或C库 之间 文件系统分类 基于磁盘的文件系统 ext2 3 fat iso9660 虚拟文件系统 proc 网络文件系统 nfs 通用文件模型 VFS提供一种结构模型 包含了一个强大的文件系统所应具备
  • 3DMAX 4角色蒙皮

    1 角色建模 略 以后补充 2 骨骼绑定 一般不用骨骼直接拉 Biped足够 以后适当补充骨骼直接拉的操作 1 将Biped骨骼和模型对齐 1 创建biped之后 第一步一要先选择 然后再对位骨骼到模型 如果不选直接对位无效 只在对位时选中
  • 素数判断 python

    目录 题目描述 AC代码 题目描述 写一个判断素数的函数 在主函数输入一个整数 输出是否素数的信息 输入 判断次数和每次输入的任意整数 输出 每次的输入是否为素数 输入样例1 4 17 5 6 19 输出样例1 prime prime no
  • 【微信小程序开发零基础入门】——微信小程序入门

    微信小程序入门 一 小程序介绍 1 1 什么是小程序 1 2 微信 程序历史 1 3 小程序可以干什么 1 4 疯狂的微信 程序 1 5 还有其他的 程序 不容忽视 1 6 官 微信 程序体验 二 小程序开发资料 三 第 个微信 程序 四
  • Qt之窗口背景设置为透明

    this gt setAttribute Qt WA TranslucentBackground
  • Qt d指针与q指针详解

    在讲解d q指针之前 我们先了解一下什么是Pimpl 这样更有助于我们理解Qt这么做的目的 Pimpl Pointer to Implementation 简介 该技术是一种减少代码依赖和编译时间的C 编程技巧 Pimpl的基本思想是将类的
  • MFC工程对话框资源合并

    创建了一个工程Test 对其进行一次复制 复制后的工程依然为Test 为了区分方便 称之为修改Test 现在要将修改Test中修改的内容合并到原Test中 在原Test上的解决方案上点右键 选Add 添加一个解决方案文件夹 在文件夹上点右键
  • 分布式-解决请求重放问题

    请求重放 什么是请求重放 可能导致的问题 常见的业务场景 常见的解决方案 基于redis实现的一种解决方案 时间戳 nonce原理 源码分享 什么是请求重放 由于网路原因或未知异常导致的客户端不断向服务端重试同一个请求的行为可以叫做请求重放
  • 2023华为OD机试真题【跳房子游戏】

    题目内容 跳房子 也叫跳飞机 是一种世界性的儿童游戏游戏参与者需要分多个回合按顺序跳到第1格直到房子的最后一格 然后获得一次选房子的机会 直到所有房子被选完 房子最多的人获胜 跳房子的过程中 如果有踩线等违规行为会结束当前回合 甚至可能倒退
  • 985毕业,半路出家28岁进军Python,坚持奋斗了三年现如今年薪36W+

    简介 背景 26岁985研究生毕业 学的土木工程相关的专业 工作半年 存款3000 半年后调到深圳总部 公司央企 工作一年差不多也就几万存款 感觉生活无望 就直接决定转行 说实在的 转行就是奔着挣钱去的 最开始想到的是金融 入坑了后 发现原
  • crontab极简教程

    toc crontab简介 Linux crontab是用来定期执行程序的命令 当安装完成操作系统之后 默认便会启动此任务调度命令 crontab常用命令 crontab e 打开vi编辑器 编写一个定时任务 退出vi后 若vi内容不为空
  • 旋转编码器简介

    旋转编码器如图 编码器具有左旋 右旋 按下三个功能 4 5脚是中间按下去的开关接线 1 2 3脚一般中间2脚接地 1 3脚上拉电阻后 当左转 右转旋纽时 在1 3脚就有脉冲信号输出了 输出1为高电平时 输出2出现一个高电平 这时开关就是向顺
  • RocektMQ社区"每周直播分享第8期"如约而至

    各位同学 RocektMQ社区 每周直播分享第8期 如约而至 分享题目 RocketMQ消息的过滤和重试实现原理详解 直播方式 钉钉群直播方式 群号 21791227 分享时间 2019 01 24 20 00 21 30 本周四 分享讲师
  • Apache WEB 服务器企业实战

    万维网 WORLD WIDE WEB WWW 服务器 也称之为 WEB 服务器 主要功能 是提供网上信息浏览服务 WWW 是 Internet 的多媒体信息查询工具 是 Internet 上 飞快发展的服务 也是目前用的最广泛的服务 正是因
  • kafka查看topic中的数据_实战!Kafka Manager能统计出Topic中的记录条数吗?

    问题描述 今天现场实施同事说Kafka Manager上显示有3500w条记录 但使用我们的平台落地后 一统计发现只有2200w条记录 这是不是说明我们的平台存在丢数据的可能 经了解 对接方是通过如下界面来判断topic中的记录条数的 上图
  • 常见Redis使用问题

    一 lettuce使用问题 1 问题描述 Redis Cluster集群 当master宕机 主从切换 客户端报错 timed out 2 原因 SpringBoot2 X版本开始Redis默认的连接池都是采用的Lettuce 当节点发生改