百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

Redis不同部署方式下的连接处理

mhr18 2024-11-24 18:42 18 浏览 0 评论

Redis 可以支持多种部署方式,今天来看下不同的部署方式下,要如何使用jedis来进行连接。为什么使用Jedis 呢,因为它足够老(但易用性不一定是最高的)!

当然也有其他几种客户端:

  1. RedisTemplate 是基于SpringBoot的封装,SpringBoot 1.x 底层也是依赖于Jedis,而 SpringBoot 2.x 以上是基于 lettuce
  2. Jedis 是比较早的Redis 客户端,采用同步阻塞式IO,采用线程池时是线程安全的,对于高级的功能需要自己封装
  3. Lettuce 是基于Netty 采用异步非阻塞IO,是线程安全的,提供了比较多的Redis高级功能。
  4. Redission 是 Redis的分布式客户端,也是基于Netty 采用异步非阻塞式IO,线程安全

连接组件统一使用jedis

        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>3.1.0</version>
        </dependency>

单机

最简单的部署方式,但也是高可用性最差的一种,生产环境不建议这样部署

通过 JedisPool 获取对应连接

    public static void main(String[] args) {
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxTotal(2);
        JedisPool jedisPool = new JedisPool(jedisPoolConfig, "127.0.0.1", 6379, 3000, "123456");
        try (Jedis jedis = jedisPool.getResource()) {
            jedis.set("test:001", "002");
        }
    }

主从

原生的Jedis没有对于读写的处理方式,可以对于主从的部署方式和单机的类似,可以使用主从两个JedisPool对象来分别管理

    public static void main(String[] args) {
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxTotal(2);
        // 主redis
        JedisPool jedisPool = new JedisPool(jedisPoolConfig, "127.0.0.1", 6379, 3000, "123456");
        try (Jedis jedis = jedisPool.getResource()) {
            jedis.set("test:001", "002");
        }

        // 从redis
        JedisPool slavePool = new JedisPool(jedisPoolConfig, "127.0.0.1", 6379, 3000, "123456");
        try (Jedis slave = slavePool.getResource()) {
            slave.get("test:001");
        }
    }

哨兵

哨兵模式提供了一种高可用的方案,它主要负责监控Master与Slave的状态,如果检测出异常通知客户端,自动失效转移(如果master节点有异常,可以自动选择一个其他节点为master)

    public static void main(String[] args) {
        Set<String> sentinels = new HashSet<>();
        sentinels.add("127.0.0.1:9001");
        sentinels.add("127.0.0.1:9002");
        sentinels.add("127.0.0.1:9003");
        JedisSentinelPool sentinelPool = new JedisSentinelPool("master-sentinel", sentinels, "password");
        try (Jedis jedis = sentinelPool.getResource()) {
            jedis.set("test:001", "002");
        }
    }

集群

Redis Cluster 比较有意思,这里来讲解下大概的集群的原理。

Redis集群模式,提供了数据分片功能,不同节点存储的整个数据库的部分数据,为了保证每个主节点的高可用,每一个主节点需要有一个备节点。

Redis Cluster 将全部的内存空间分成 16384块,每一块空间称为Slot,同时将这些Slot与所对应的K-V划分给群中的每个主节点负责,而每个Key都会通过 Hash(key) mod slot的总数计算出一个Slot值,再通过 slot 找到对应的Redis实例,如果不是在当前节点,则会返回MOVE/ASK,使客户端Redirect后,与正确的服务器进行通信,所以需要客户端实现 MOVE/ASK的语义。

Redis Cluster 对于非分布式下的单一键值的命令都可以实现,但因为客户端是直连后端的服务器,对于多键值的操作,那则需要遍历所有的节点,这一点是不支持的。但是对于批量或是lua操作,可以通过 Redis Cluster的 hashTag 功能,如对于键 test:001, u:001,可以改成 test:{001} ,u:{001} ,那在计算hash值时,只会以{}号内的值作为有效值,那这些值对应的slot 可以是在同一个,达到在同一个节点上处理的能力(像Lua脚本中的涉及的Key是要在一个节点上,确实需要使用,可以使用hashtag的功能)。

客户端是可以将命令发送到Redis Cluster中任意节点,接收指令的节点会计算对应的key所在slot,如果不是当前节点,会将对应的slot对应的数据返回给客户端,那这些数据是从哪里来的呢?

Redis Cluster中的各节点使用 Gossip 协议维护节点的元数据信息,主要用于交换数据。主要包含以下四种消息:

  • meet 消息: 通知节点,当前发送的节点要加入集群
  • ping 消息: 集群中的节点会定期向集群中其他节点发送连接检测指令、同时也会进行信息交换, 这里的信息包含当前节点知道的其他节点信息
  • pong 消息:节点接收到meeting、ping消息后会回复给来源节点,通知请求正常,并响应当前节点的状态
  • fail 消息: 当一个节点判定集群中某个节点下线后,会广播通知集群其他所有节点
  1. 当集群启动时,节点之间会进行通信握手,会向集群内的其他所有节点发送meet 消息,该消息会包含当前节点的信息(节点id,所负责的slot,节点标识等),同时还会包含与该节点通信的其他节点信息,一并发出去,接收该消息的节点会获取到这些信息,并与本地节点列表进行比对,如果不存在,则接收节点会主动向新加入的节点发送一个meet消息。同时接收节点处理完成以后,会回复一个pong消息给来源节点(也会包含接收节点已经存储的节点信息)
  2. 集群启动后,集群里的各个节点会向集群内其他各节点发送ping消息,检测目标节点是否正常,同时同步更新自己最新的节点slot信息给目标节点,目标节点也会响应pong消息,由来源节点更新本地节点的信息。此过程中,如果与某一个节点通信失败,则会通知集群内的其他节点进行广播fail消息
  3. 当集群内的节点数比较大时,则对于集群内的节点的通信也是一个负担,主要是交换的信息量会越来越大,因此Redis Cluster 内部会以一个定时任务,每10s执行一次,按一定的规则(对于最近一次接收到pong消息时间大于cluster_node_time/2的节点)进行发送ping,这个消息会包含当前节点的信息,同时会带上1/10的其他节点信息来避免节点之前的通信成本过大。

代码配置如下:

    public static void main(String[] args) {
        Set<HostAndPort> hostAndPortSet = new HashSet<>();
        // Redis 集群的配置
        hostAndPortSet.add(new HostAndPort("127.0.0.1", 6379));
        hostAndPortSet.add(new HostAndPort("127.0.0.1", 6378));

        JedisCluster jedisCluster = new JedisCluster(hostAndPortSet);
        jedisCluster.set("test:001", "122");
    }

问题

单机版本的模式,可以如何处理做到集群的效果呢?

相关推荐

【推荐】一个开源免费、AI 驱动的智能数据管理系统,支持多数据库

如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!.前言在当今数据驱动的时代,高效、智能地管理数据已成为企业和个人不可或缺的能力。为了满足这一需求,我们推出了这款开...

Pure Storage推出统一数据管理云平台及新闪存阵列

PureStorage公司今日推出企业数据云(EnterpriseDataCloud),称其为组织在混合环境中存储、管理和使用数据方式的全面架构升级。该公司表示,EDC使组织能够在本地、云端和混...

对Java学习的10条建议(对java课程的建议)

不少Java的初学者一开始都是信心满满准备迎接挑战,但是经过一段时间的学习之后,多少都会碰到各种挫败,以下北风网就总结一些对于初学者非常有用的建议,希望能够给他们解决现实中的问题。Java编程的准备:...

SQLShift 重大更新:Oracle→PostgreSQL 存储过程转换功能上线!

官网:https://sqlshift.cn/6月,SQLShift迎来重大版本更新!作为国内首个支持Oracle->OceanBase存储过程智能转换的工具,SQLShift在过去一...

JDK21有没有什么稳定、简单又强势的特性?

佳未阿里云开发者2025年03月05日08:30浙江阿里妹导读这篇文章主要介绍了Java虚拟线程的发展及其在AJDK中的实现和优化。阅前声明:本文介绍的内容基于AJDK21.0.5[1]以及以上...

「松勤软件测试」网站总出现404 bug?总结8个原因,不信解决不了

在进行网站测试的时候,有没有碰到过网站崩溃,打不开,出现404错误等各种现象,如果你碰到了,那么恭喜你,你的网站出问题了,是什么原因导致网站出问题呢,根据松勤软件测试的总结如下:01数据库中的表空间不...

Java面试题及答案最全总结(2025版)

大家好,我是Java面试陪考员最近很多小伙伴在忙着找工作,给大家整理了一份非常全面的Java面试题及答案。涉及的内容非常全面,包含:Spring、MySQL、JVM、Redis、Linux、Sprin...

数据库日常运维工作内容(数据库日常运维 工作内容)

#数据库日常运维工作包括哪些内容?#数据库日常运维工作是一个涵盖多个层面的综合性任务,以下是详细的分类和内容说明:一、数据库运维核心工作监控与告警性能监控:实时监控CPU、内存、I/O、连接数、锁等待...

分布式之系统底层原理(上)(底层分布式技术)

作者:allanpan,腾讯IEG高级后台工程师导言分布式事务是分布式系统必不可少的组成部分,基本上只要实现一个分布式系统就逃不开对分布式事务的支持。本文从分布式事务这个概念切入,尝试对分布式事务...

oracle 死锁了怎么办?kill 进程 直接上干货

1、查看死锁是否存在selectusername,lockwait,status,machine,programfromv$sessionwheresidin(selectsession...

SpringBoot 各种分页查询方式详解(全网最全)

一、分页查询基础概念与原理1.1什么是分页查询分页查询是指将大量数据分割成多个小块(页)进行展示的技术,它是现代Web应用中必不可少的功能。想象一下你去图书馆找书,如果所有书都堆在一张桌子上,你很难...

《战场兄弟》全事件攻略 一般事件合同事件红装及隐藏职业攻略

《战场兄弟》全事件攻略,一般事件合同事件红装及隐藏职业攻略。《战场兄弟》事件奖励,事件条件。《战场兄弟》是OverhypeStudios制作发行的一款由xcom和桌游为灵感来源,以中世纪、低魔奇幻为...

LoadRunner(loadrunner录制不到脚本)

一、核心组件与工作流程LoadRunner性能测试工具-并发测试-正版软件下载-使用教程-价格-官方代理商的架构围绕三大核心组件构建,形成完整测试闭环:VirtualUserGenerator(...

Redis数据类型介绍(redis 数据类型)

介绍Redis支持五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及Zset(sortedset:有序集合)。1、字符串类型概述1.1、数据类型Redis支持...

RMAN备份监控及优化总结(rman备份原理)

今天主要介绍一下如何对RMAN备份监控及优化,这里就不讲rman备份的一些原理了,仅供参考。一、监控RMAN备份1、确定备份源与备份设备的最大速度从磁盘读的速度和磁带写的带度、备份的速度不可能超出这两...

取消回复欢迎 发表评论: