首页 > 数据库 >Java-Redis是如何保证高可用的?

Java-Redis是如何保证高可用的?

时间:2023-12-15 12:00:31浏览次数:26  
标签:Java 可用 Redis 集群 分片 数据 节点 客户端

Java-Redis是如何保证高可用的?

image

高性能

基于内存的存储

Redis是基于内存的存储系统,所有数据都保存在内存中,这使得Redis可以快速读取和写入数据。与传统的基于磁盘存储的系统相比,Redis的读写性能更高。

单线程的设计

是单线程的设计,所有的读写请求都由同一个线程处理,避免了多线程的锁竞争和上下文切换的开销,使得Redis的读写性能更高。

非阻塞的IO多路复用机制

采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络 IO 的时间消耗),且 Redis 在内存中操作数据的速度非常快,也就是说内存内的操作不会成为影响Redis性能的瓶颈。

在多路复用IO模型中,会有一个内核线程不断地去轮询多个 socket 的状态,只有当真正读写事件发送时,才真正调用实际的IO读写操作。因为在多路复用IO模型中,只需要使用一个线程就可以管理多个socket,系统不需要建立新的进程或者线程,也不必维护这些线程和进程,并且只有真正有读写事件进行时,才会使用IO资源,所以它大大减少来资源占用。

数据结构的优化

内置了多种数据结构,如字符串、列表、集合、有序集合等,这些数据结构都经过了优化,使得Redis可以快速进行读写操作。

持久化的设计

AOF 持久化:将写命令追加到文件中,定期将AOF文件重写,服务关闭时将AOF文件重写。AOF持久化的好处是可以保证数据不丢失,但是可能会导致写性能降低。

RDB 持久化:将数据快照存储到磁盘上,定期生成RDB文件,服务关闭时生成。RDB持久化的好处是可以快速恢复Redis的数据,但是可能会丢失一部分数据。

高可靠与高扩展

image

集群之间采用短连接的方式,客户端通过集群的负载均衡机制将请求分发到不同的节点。每个节点独立处理请求,然后返回结果给客户端。

在Redis集群中,客户端读取数据的过程涉及以下步骤:

  1. 连接到集群: 客户端首先需要连接到Redis集群。通常,客户端会连接到一个或多个集群节点,并从中选择一个作为起始节点。这个起始节点会告诉客户端关于整个集群拓扑的信息。
  2. 获取集群拓扑信息: 一旦连接到一个节点,客户端会向该节点发送CLUSTER NODES​命令,以获取整个集群的拓扑信息。这个信息包括集群中所有节点的IP地址、端口号、节点ID等。
  3. 定位数据分片: 客户端通过哈希算法计算键的哈希值,然后根据哈希值定位数据所在的分片。Redis集群使用哈希槽(hash slot)来分片数据,每个分片包含一个或多个连续的哈希槽。
  4. 寻找负责的节点: 一旦确定了数据所在的分片,客户端需要找到负责该分片的节点。客户端会根据分片的哈希槽范围,找到负责该范围的节点。
  5. 发起数据读取请求: 客户端向负责的节点发送读取请求。如果该节点不是主节点(可能是从节点),它可能会将客户端重定向到主节点。
  6. 从主节点读取数据: 如果需要,客户端会重新定向到主节点,并向主节点发送数据读取请求。主节点负责响应读请求,从自身存储的数据中获取并返回相应的值。

这是一个简化的描述,实际过程中还涉及了一些集群管理和故障处理的细节。需要注意的是,Redis集群的读操作通常是直接在主节点上执行的,而写操作则会被主节点同步到相应的从节点。这种方式既提高了读取性能,又保证了数据的一致性。

哨兵模式

image

哨兵模式是在主从复制基础上加入了哨兵节点,实现了自动故障转移。哨兵节点是一种特殊的Redis节点,它会监控主节点和从节点的运行状态。当主节点发生故障时,哨兵节点会自动从从节点中选举出一个新的主节点,并通知其他从节点和客户端,实现故障转移。

Cluster模式

image

Cluster模式是Redis的一种高级集群模式,它通过数据分片和分布式存储实现了负载均衡和高可用性。在Cluster模式下,Redis将所有的键值对数据分散在多个节点上。每个节点负责一部分数据,称为槽位。通过对数据的分片,Cluster模式可以突破单节点的内存限制,实现更大规模的数据存储。


参考

Redis架构设计如何实现高速读写、高可用与持久化

详解Redis三大集群模式,轻松实现高可用

Redis 多路复用

标签:Java,可用,Redis,集群,分片,数据,节点,客户端
From: https://www.cnblogs.com/anhaoyang/p/how-does-javaredis-guarantee-high-available-shn87.html

相关文章

  • JavaWeb - Day08 - MySQL - 多表查询、事务、索引 - Mybatis - 入门
    01.MySQL-多表查询-概述数据准备#建议:创建新的数据库createdatabasedb04;usedb04;--部门表createtabletb_dept(idintunsignedprimarykeyauto_incrementcomment'主键ID',namevarchar(10)notnulluniquecomment'部门名称',......
  • Java-常见的排序算法有哪些
    Java-常见的排序算法有哪些比较排序算法:冒泡排序(BubbleSort):过程:从左到右依次比较相邻的元素,如果顺序不对就交换它们,一轮比较会将最大的元素冒泡到末尾。优势:简单易懂,对于小型数据集表现较好。劣势:时间复杂度为O(n^2),性能相对较差。插入排序(InsertionSort):过......
  • Java云架构、云服务、云运维的医院信息管理系统源码(云HIS)
    医院信息系统(HIS)经历了从手工到单机再到局域网的两个阶段,随着云计算、大数据新技术迅猛发展,基于云计算的医院信息系统将逐步取代传统局域网HIS,以适应人们对医疗卫生服务越来越高的要求。利用云计算、大数据等现代信息技术研发的医疗卫生信息平台(HIP)实现了医院信息化从局域网向互......
  • Java-特殊运算符与方法
    Java-特殊运算符与方法一、运算符移位:<<​>>​运算结果说明1<<12代表1的二进制001​左移1位,为010​=24>>21代表4的二进制100​右移2位,为001​=1或:|​二进制运算:(或=有1为1,没则为0)​1​|1​得1​​1​|0​得0​​0​|1​得1​......
  • Java-特殊运算符与方法
    Java-特殊运算符与方法一、运算符移位:<<​>>​运算结果说明1<<12代表1的二进制001​左移1位,为010​=24>>21代表4的二进制100​右移2位,为001​=1或:|​二进制运算:(或=有1为1,没则为0)​1​|1​得1​​1​|0​得0​​0​|1​得1​......
  • Java-基础类
    Java-基础类int在Java中,int​类型是32位的。它表示一个32位的带符号整数,范围从-2^31​到2^31-1​,即从-2147483648​到2147483647​(±21亿)。为什么不是64位?Java中的int​类型是32位的,而不是64位,是由于历史原因和平台兼容性考虑。当Java语言设计之初,主要关注了内存......
  • 创建一个Redis集群的启动命令并启动
    第一步:进入到存放集群的目录里cd/opt/cluster如下图[红线圈中的目录]:第二步:在此目录创建sh文件[示例为start.sh],并打开编辑vimstart.sh第三步:在文件中,写入要执行的所有Redis端口命令`redis-server/opt/cluster/6001/redis.confredis-server/opt/cluster/6002/redis.c......
  • 无涯教程-Java - acos()函数
    该方法返回指定双精度值的反余弦值。acos()-语法doubleacos(doubled)这是参数的详细信息-d - 双精度数据类型。acos()-返回值此方法返回指定双精度值的反余弦。acos()-示例publicclassTest{publicstaticvoidmain(Stringargs[]){double......
  • RedisTemplate 使用 increasement() 和 get() 时报 SerializationException
    https://cloud.tencent.com/developer/article/1706934 org.springframework.data.redis.serializer.SerializationException:Cannotdeserialize;nestedexceptionisorg.springframework.core.serializer.support.SerializationFailedException:Failedtodeseriali......
  • 关于再次出现 Could not open client transport with JDBC Uri: jdbc:hive2://node1:1
    写在最前边——我报错是因为空间不足 当我时隔两个月再次看到这个报错的时候我是感到绝望的————然而当我查了一遍百度发现唯一一个拥有相同报错解决方法的博客出自我之手的时候我的崩溃的————在我发现曾经的方法无法解决现在的我的报错的时候,我觉得我的心都碎了QAQ......