当前位置: 首页 > news >正文

redis集群理论详解

一. Redis集群发展历程

本片文章只介绍集群理论知识,不包含Redis集群搭建教程
教程文章请点击docker搭建redis集群(三主三从)

阶段一:单机版Redis

  • 优点
    • 简单:易于部署和使用,适合小型项目或初期阶段的应用。
  • 缺点
    • 单点故障:整个系统的稳定性依赖于单一实例的运行状况,一旦该实例出现问题,可能导致服务中断。
    • 容量限制:受限于单台服务器的内存容量,难以处理大规模数据。
    • 并发处理能力不足:面对高并发访问时,性能可能迅速下降。

阶段二:主从复制

  • 背景
    • 为了解决单机版Redis的单点故障问题,并提升读操作的负载能力。
  • 优点
    • 提高了数据冗余度:通过将数据同步到一个或多个从节点上,增加了数据的安全性。
    • 增强了读取性能:可以配置多个从节点来分担读请求,减轻主节点的压力,提高整体读性能。
  • 缺点
    • 写操作仍然是瓶颈:所有写入操作都需要在主节点完成,因此无法通过增加从节点来扩展写入性能。
    • 故障转移复杂:当主节点出现故障时,需要手动进行故障切换,这期间服务可能会暂时中断。

阶段三:哨兵(Sentinel)模式

  • 背景
    • 为了自动化主从复制中的故障检测与恢复过程,提供更高的可用性。
  • 优点
    • 自动故障转移:能够在检测到主节点不可用时自动选择一个从节点升级为主节点,减少人工干预,提高系统的可靠性和可用性。
  • 缺点
    • 不支持水平扩展:虽然提高了可用性,但每个节点都存储了全量数据,对于数据存储容量和并发处理能力方面没有实质性的改进。
    • 复杂性增加:相对于简单的主从结构,配置和维护变得更加复杂。

阶段四:Redis Cluster

  • 背景
    • 面对更大规模的数据存储需求和更高的并发访问量,需要一种既能保证数据安全又能实现线性扩展的解决方案。
  • 优点
    • 数据分布与扩展性:通过哈希槽机制实现了数据的分布式存储,支持动态添加或移除节点以适应业务增长的需求。
    • 高可用性:结合了主从复制与自动故障转移的优点,提供了更高层次的服务连续性。
  • 缺点
    • 部署和运维成本上升:复杂的架构设计使得部署、管理和监控都更加困难。
    • 某些命令限制:由于数据分布在不同节点上,部分涉及多键的操作受到限制。

二. Redis Cluster详解

在这里插入图片描述

(一)数据分片

1. 基本概念

在Redis Cluster中,数据分片是通过将整个键空间分割成多个部分(称为哈希槽或hash slots),每个部分可以独立地存储在一个节点上。这样做的主要目的是为了支持分布式数据存储和处理大规模数据集。

  • 哈希槽(Hash Slots):Redis Cluster使用16384个哈希槽来分割数据。这意味着任何给定的键都属于这16384个哈希槽中的一个。
  • 分配方式:集群中的每个节点负责一部分哈希槽。例如,如果有三个节点,可能节点A负责0到5460号哈希槽,节点B负责5461到10922号哈希槽,而节点C负责剩余的哈希槽。

2. 键到哈希槽的映射

Redis Cluster通过以下步骤确定一个键应该被存储在哪一个哈希槽中:

  • 计算CRC16校验和:首先对键进行CRC16校验和计算。
  • 取模运算:然后将得到的校验和结果对16384取模,得到的结果就是该键所属的哈希槽编号。
    hash_slot = CRC16(key) % 16384
    这个过程确保了所有键能够均匀分布在16384个哈希槽之间。

什么是校验和?

校验和是一种用于检测数据传输或存储过程中是否发生错误的技术。它通过对数据进行某种数学运算生成一个固定长度的数值,这个数值被称为校验和。接收方可以使用相同的算法重新计算接收到的数据的校验和,并将其与发送方提供的校验和进行比较。如果两者一致,则认为数据在传输或存储过程中没有发生错误;如果不一致,则表明数据可能已被损坏或篡改。
常见的校验和算法包括CRC(循环冗余校验)、MD5(消息摘要算法5)、SHA-1(安全哈希算法1)等。每种算法都有其特定的应用场景和优缺点。
CRC16是一种具体的循环冗余校验算法,它生成一个16位的二进制数作为校验和。CRC16广泛应用于各种通信协议中,如以太网、串行通信等,用于确保数据的完整性和准确性。

3. 节点与哈希槽的关系

每个节点管理着一部分哈希槽。这意味着如果要查找或修改某个键,首先需要知道它对应的哈希槽,然后根据哈希槽找到相应的节点。这种设计使得:

  • 负载均衡:通过合理分配哈希槽到不同的节点上,可以实现数据的均匀分布,避免某些节点过载。
  • 水平扩展:当需要增加系统容量时,可以通过重新分配哈希槽的方式添加新的节点,并将部分哈希槽迁移到新节点上。

4. 实际操作示例

假设我们有一个包含三个节点的Redis Cluster,每个节点分别负责一组哈希槽。如果我们想要插入一个键user:1000,那么:

  • 计算user:1000的CRC16校验和。
  • 对校验和结果进行取模运算得到哈希槽编号。
  • 根据哈希槽编号找到对应的节点,并在该节点上执行实际的数据插入操作。

5. 数据迁移与再平衡

随着数据的增长或者节点故障恢复后的调整,可能需要对哈希槽进行重新分配以达到更好的负载均衡。Redis Cluster支持在线迁移哈希槽,即可以在不影响服务的情况下将某些哈希槽从一个节点移动到另一个节点。

  • ASK重定向:在哈希槽迁移过程中,客户端可能会收到ASK重定向响应,指示临时访问特定键所在的临时位置。
  • MOVED重定向:一旦哈希槽完全迁移完毕,后续请求会直接收到MOVED重定向,告知客户端正确的节点地址。

(二)集群通信机制

在Redis Cluster中,集群中的每个节点通过Gossip协议和心跳机制保持彼此的连接和状态同步。节点之间通过TCP连接互相交换信息,确保集群的整体健康和数据一致性。

1. Gossip协议

Gossip 协议是一种去中心化的消息传播机制,它通过节点之间的周期性随机对等通信来传播信息。在 Redis Cluster 中,每个节点都会定期与其他节点交换关于整个集群状态的信息,包括哪些节点在线、哪些节点离线、数据槽(slot)的分配情况等。

优势

  • 去中心化:不需要一个中央控制点来管理集群状态,减少了单点故障的风险。
  • 容错性:即使部分节点发生故障,剩余的节点仍然可以通过互相通信来维持集群的正常运作。
  • 扩展性:随着集群规模的扩大,gossip 协议可以有效地适应并维持高效的通信效率。
  • 最终一致性:尽管在某一时刻不同节点可能持有不同的集群视图,但随着时间推移,所有节点将趋向于拥有相同的信息。

感染规则

Gossip 的感染过程类似于病毒传播的方式。每个节点会随机选择集群中的其他一些节点,并向它们发送自己的当前状态信息(如节点列表、健康状况等)。接收这些信息的节点会根据接收到的数据更新自己的状态,并在下一轮通信中继续传播更新后的信息。通过这种方式,新的或变化的信息能够逐渐扩散到整个集群。

2. 心跳机制

心跳机制用于检查集群中各个节点是否在线,并确保节点之间的连接持续有效。每个节点定期向其他节点发送心跳信号,若心跳信号丢失或超时,节点会被认为是失效状态。

  • 节点监控:节点通过心跳机制定期监控集群内的其他节点,检测节点是否存在故障。心跳丢失通常表示网络故障或节点崩溃,需要触发故障检测和恢复机制。
  • 故障恢复:当心跳信号失败时,集群会认为该节点已不可用,并采取措施将该节点从集群中排除或转为备用状态。

3. 数据同步

在Redis
Cluster中,当某个节点(主节点或从节点)失效或重新加入集群时,系统会自动进行必要的数据迁移和复制操作,以确保整个集群的数据一致性和高可用性。

  • 主从同步
    • 当主节点失效时,集群会选择一个从节点升级为新的主节点。

    • 原故障主节点的其他从节点需要与新的主节点同步数据。这可以通过两种方式进行:

      • 部分重同步:如果条件允许(例如,复制积压缓冲区包含所需数据且服务器运行ID未变),则仅传输断开期间丢失的数据,这种方式更高效。
      • 全量重同步:如果无法进行部分重同步,则需传输全部数据,包括生成RDB文件及传输后续写命令,虽然耗时较长但确保数据一致性。
    • 新加入的从节点

      • 首次连接时,新从节点会通过全量重同步来获取完整的数据集,包括从主节点接收RDB文件及自开始复制以来的所有写命令。
      • 完成初始同步后,该从节点将保持与主节点的持续连接,实时接收所有更新,确保数据一致性。
      • 在之后的重新连接中,如果满足特定条件(如复制积压缓冲区足够大且包含必要的数据),则可以从部分重同步开始,从而提高效率。

(三)跳转重定向

在这里插入图片描述

在Redis Cluster中,由于数据分布在不同的节点上,客户端请求某个键的数据时,可能需要重定向到不同的节点。Redis Cluster通过跳转重定向机制来确保客户端能够访问正确的节点。

1. MOVED重定向

MOVED重定向是在哈希槽完全迁移后,Redis Cluster告知客户端该请求的键已经完全迁移到另一个节点的机制。该重定向是永久性的,不需要再次跳转。

  • 哈希槽迁移完毕:当哈希槽迁移完成后,所有请求该哈希槽的数据都会被重定向到新的目标节点。客户端会收到MOVED响应,并知晓正确的目标节点地址。
  • 客户端操作:在收到MOVED重定向时,客户端可以直接访问目标节点,不需要进行任何额外的跳转操作。

2.ASK重定向(用于迁移状态):

在这里插入图片描述

在Redis Cluster中,数据分布于多个节点上,通过16384个槽来管理数据的分配。当需要对集群进行扩展或维护时,可能会涉及到槽的重新分配,即从一个节点向另一个节点迁移部分槽的数据。在这个过程中,部分数据可能已经在目标节点上可用,而另一部分仍留在源节点。

  • 当客户端尝试访问正处于迁移状态的槽时,当前负责该槽的节点不会立即返回MOVED错误,而是返回一个ASK响应。这个响应包含两个信息:
    1.目标槽号。
    2.负责接收这次请求的临时节点地址(IP和端口)。
  • ASKING命令:为了执行ASK重定向,客户端首先需要向目标节点发送ASKING命令,然后客户端再次发送操作命令(如GET或SET)

3. 客户端的处理

在Redis Cluster环境中,客户端必须能够智能地响应ASKMOVED重定向,以确保请求被发送到正确的节点。这要求客户端支持集群模式,并具备处理这些重定向的能力。

  • 重定向的自动处理
    现代的Redis客户端通常内置了对ASKMOVED重定向的支持。当收到这样的响应时,客户端会自动解析出目标节点的信息(包括IP地址和端口),然后重新发送原始请求到指定的目标节点。

    • 对于MOVED响应,客户端除了重新发送请求外,还会更新其内部的槽到节点映射表,这样后续针对相同槽的请求将直接发送到正确的节点,无需再次经历重定向过程。
    • 对于ASK响应,客户端仅对该特定请求执行一次临时重定向,通过首先发送ASKING命令告知目标节点接受此次请求,然后再执行实际的操作命令。此操作不会影响客户端内部的槽到节点映射。
  • 集群模式
    在集群模式下,客户端需要维护一个当前集群状态的视图,包括所有节点的信息及其负责的槽。这使得客户端可以有效地路由请求至正确的节点,减少不必要的网络跳转。此外,客户端还需要监听集群拓扑的变化(如通过CLUSTER NODES命令或订阅相关的通知频道),以便及时更新本地缓存的集群状态,确保高效率的数据访问。

(四)选举策略

Redis Cluster通过选举机制来确保集群中的高可用性,尤其是在主节点发生故障时,能够快速选举新的主节点并进行故障转移。

1. 主节点故障检测

Redis Cluster使用节点间的心跳机制以及Gossip协议来检测主节点是否失效。如果某个节点未能及时响应心跳或出现长时间失联的情况,集群会认为该节点失效,并触发故障转移。

  • 故障检测:集群中的其他节点会定期通过心跳检查是否能与主节点通信。如果发现主节点长时间没有响应,则会认为主节点故障。
  • Gossip协议:Gossip协议能够迅速传播故障信息,使集群中其他节点及时知晓主节点的失效状态。

2. 选举新的主节点

一旦Redis Cluster检测到主节点故障,集群中的从节点会参与选举,选择一个最合适的从节点升级为主节点。

  • 选举过程:通常,Redis Cluster会选择一个拥有最新数据的从节点作为新的主节点。选举会考虑节点的延迟、复制状态、网络健康等因素。
  • 数据同步:选举完成后,新的主节点会接管所有原主节点的哈希槽,并开始接受新的写请求。此时,其他从节点会同步新的主节点数据,确保数据一致性。

3. 保证数据一致性

在主节点故障恢复过程中,Redis Cluster会确保新主节点接管之后,数据的一致性得到保证。选举过程中,不会有写操作被执行,直到新主节点准备好。

  • 数据同步与一致性:故障转移完成后,Redis Cluster会将新主节点的所有数据同步到其他从节点,确保数据一致性,并避免分布式系统中的数据丢失。
  • 恢复过程:故障恢复的过程中,Redis Cluster会将所有相关的哈希槽和数据同步到新的主节点,并继续为客户端提供服务,最大程度地减少服务中断。

4. Redis Cluster选举机制与哨兵模式的不同点

虽然Redis Cluster和Redis Sentinel都提供了高可用性解决方案,但在选举新的主节点时,两者采用了不同的机制。

Redis Sentinel (哨兵模式)
  • 外部监控系统

    • Redis Sentinel 是一个独立运行的系统,用于监控Redis实例的状态,并在检测到故障时进行处理。
  • 投票机制

    • 当Sentinel检测到主节点失效时,它会发起一次选举过程来选择一个新的主节点。
    • 这个过程依赖于Sentinel集群中的多数实例达成一致意见。具体来说,Sentinel通过相互之间的通信和投票来决定哪个从节点应该被提升为主节点。
  • 决策过程

    • Sentinel不仅考虑从节点的数据复制偏移量(即数据的新鲜度),还会评估网络状况、从节点的健康状态等因素。
    • 最终的选择是由大多数Sentinel实例同意的结果,确保了决策的一致性和可靠性。
Redis Cluster
  • 内置机制

    • Redis Cluster的故障检测和选举过程是集群内部自我管理的一部分,不需要外部系统参与。
  • 竞争选举

    • 在Redis Cluster中,一旦某个主节点被认为失效,其从节点将根据一系列标准(如复制偏移量、优先级设置等)自主决定是否提升自己为新的主节点。
    • 各个符合条件的从节点会尝试晋升为主节点。第一个成功完成配置更新并开始接受客户端请求的从节点将成为新的主节点。
  • 无需多数同意

    • 与Sentinel不同,Redis Cluster中的选举并不需要其他节点的明确投票批准。而是基于各个从节点自身的条件和动作来进行。
    • 这种设计使得选举过程更加迅速,减少了由于等待多数同意而可能造成的延迟。

相关文章:

redis集群理论详解

一. Redis集群发展历程 本片文章只介绍集群理论知识,不包含Redis集群搭建教程 教程文章请点击docker搭建redis集群(三主三从) 阶段一:单机版Redis 优点: 简单:易于部署和使用,适合小型项目或初期…...

本地缓存~

前言 Caffeine是使用Java8对Guava缓存的重写版本,在Spring Boot 2.0中取而代之,基于LRU算法实现,支持多种缓存过期策略。 以下摘抄于https://github.com/ben-manes/caffeine/wiki/Benchmarks-zh-CN 基准测试通过使用Java microbenchmark ha…...

SpringBoot 整合 SpringMVC:SpringMVC的注解管理

分类&#xff1a; 中央转发器(DispatcherServlet)控制器视图解析器静态资源访问消息转化器格式化静态资源管理 中央转发器&#xff1a; 中央转发器被 SpringBoot 自动接管&#xff0c;不需要我们在 web.xml 中配置&#xff1a; <servlet><servlet-name>chapter2&l…...

YOLO11/ultralytics:环境搭建

前言 人工智能物体识别行业应该已经饱和了吧&#xff1f;或许现在并不是一个好的入行时候。 最近看到了各种各样相关的扩展应用&#xff0c;为了理解它&#xff0c;我不得不去尝试了解一下。 我选择了git里非常受欢迎的yolo系列&#xff0c;并尝试了最新版本YOLO11或者叫它ultr…...

扩散模型(三)

相关阅读&#xff1a; 扩散模型&#xff08;一&#xff09; 扩散模型&#xff08;二&#xff09; Latent Variable Space 潜在扩散模型&#xff08;LDM&#xff1b;龙巴赫、布拉特曼等人&#xff0c;2022 年&#xff09;在潜在空间而非像素空间中运行扩散过程&#xff0c;这…...

探索数学:从起源到未来的无尽旅程

数学的定义与本质 数学&#xff0c;这门古老而又充满魅力的学科&#xff0c;自人类文明诞生之初便如影随形。然而&#xff0c;要精准地定义数学并非易事&#xff0c;不同的学者从各自的视角出发&#xff0c;给出了多样的阐释。 亚里士多德将数学定义为 “数量科学”&#xff…...

OpenAI发布o3-mini:免费推理模型,DeepSeek引发的反思

引言 在人工智能领域&#xff0c;OpenAI再次引领潮流&#xff0c;推出了全新的推理模型系列——o3-mini。这一系列包括low、medium和high三个版本&#xff0c;旨在进一步推动低成本推理的发展。与此同时&#xff0c;OpenAI的CEO奥特曼也在Reddit的“有问必答”活动中罕见地公开…...

React中使用箭头函数定义事件处理程序

React中使用箭头函数定义事件处理程序 为什么使用箭头函数&#xff1f;1. 传递动态参数2. 避免闭包问题3. 确保每个方块的事件处理程序是独立的4. 代码可读性和维护性 示例代码总结 在React开发中&#xff0c;处理事件是一个常见的任务。特别是当我们需要传递动态参数时&#x…...

自制虚拟机(C/C++)(三、做成标准GUI Windows软件,扩展指令集,直接支持img软盘)

开源地址:VMwork 要使终端不弹出&#xff0c; #pragma comment(linker, "/subsystem:windows /ENTRY:mainCRTStartup") 还要实现jmp near 0x01类似的 本次的main.cpp #include <graphics.h> #include <conio.h> #include <windows.h> #includ…...

C# 语言基础全面解析

.NET学习资料 .NET学习资料 .NET学习资料 一、引言 C# 是一种功能强大、面向对象且类型安全的编程语言&#xff0c;由微软开发&#xff0c;广泛应用于各种类型的软件开发&#xff0c;从桌面应用、Web 应用到游戏开发等领域。本文将全面介绍 C# 语言的基础知识&#xff0c;帮…...

MySQL的覆盖索引

MySQL的覆盖索引 前言 当一个索引包含了查询所需的全部字段时&#xff0c;就可以提高查询效率&#xff0c;这样的索引又被称之为覆盖索引。 以MySQL常见的三种存储引擎为例&#xff1a;InnoDB、MyISAM、Memory&#xff0c;对于覆盖索引提高查询效率的方式均不同&#xff0c;…...

Hutool工具类

Hutool 是一个非常流行的 Java 工具类库&#xff0c;它提供了丰富的功能来简化开发中的常见任务&#xff0c;比如文件操作、加密、日期处理、字符串操作、数据库工具等。它是一个轻量级的工具库&#xff0c;可以减少开发者编写常用代码的工作量&#xff0c;提高开发效率。 主要…...

C++模板编程——可变参函数模板之折叠表达式

目录 1. 什么是折叠表达式 2. 一元左折 3. 一元右折 4. 二元左折 5. 二元右折 6. 后记 上一节主要讲解了可变参函数模板和参数包展开&#xff0c;这一节主要讲一下折叠表达式。 1. 什么是折叠表达式 折叠表达式是C17中引入的概念&#xff0c;引入折叠表达式的目的是为了…...

使用MATLAB进行雷达数据采集可视化

本文使用轮趣科技N10雷达&#xff0c;需要源码可在后台私信或者资源自取 1. 项目概述 本项目旨在通过 MATLAB 读取 N10 激光雷达 的数据&#xff0c;并进行 实时 3D 点云可视化。数据通过 串口 传输&#xff0c;并经过解析后转换为 三维坐标点&#xff0c;最终使用 pcplayer 进…...

【Linux系统】信号:信号保存 / 信号处理、内核态 / 用户态、操作系统运行原理(中断)

理解Linux系统内进程信号的整个流程可分为&#xff1a; 信号产生 信号保存 信号处理 上篇文章重点讲解了 信号的产生&#xff0c;本文会讲解信号的保存和信号处理相关的概念和操作&#xff1a; 两种信号默认处理 1、信号处理之忽略 ::signal(2, SIG_IGN); // ignore: 忽略#…...

在C语言多线程环境中使用互斥量

如果有十个银行账号通过不同的十条线程同时向同一个账号转账时&#xff0c;如果没有很好的机制保证十个账号依次存入&#xff0c;那么这些转账可能出问题。我们可以通过互斥量来解决。 C标准库提供了这个互斥量&#xff0c;只需要引入threads.头文件。 互斥量就像是一把锁&am…...

PHP代码审计学习02

目录 代码审计一般思路 Beescms代码审计&#xff08;upload&#xff09; Finecms基于前台MVC任意文件上传挖掘思路 CLTPHP基于thinkphp5框架的文件上传挖掘思路 今天来看PHP有框架MVC类&#xff0c;文件上传&#xff0c;断点调试挖掘。 同样还是有关键字搜索和功能点抓包两…...

基于微信小程序的医院预约挂号系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

大厂面试题备份20250201

20250201 面试策略 如果三面往后遇到传说中让人忍受不了的业余面试官&#xff0c;就舔着苟过去&#xff0c;入职大概率见不着他&#xff0c;但一二面遇到&#xff0c;反问环节就主动说不够match&#xff0c;让释放流程。 机器/深度学习 百面机器学习 5.4 通用CS 计算机网…...

Spring Boot 实例解析:HelloWorld 探究

POM 文件剖析&#xff1a; 父项目&#xff1a; <parent><groupId>org.springframework.boot</groupId><artifactId>spring‐boot‐starter‐parent</artifactId><version>1.5.9.RELEASE</version> </parent> 他的父项目是 <…...

【课题推荐】基于t分布的非高斯滤波框架在水下自主导航中的应用研究

水下自主导航系统在海洋探测、环境监测及水下作业等领域具有广泛的应用。然而&#xff0c;复杂的水下环境常常导致传感器输出出现野值噪声&#xff0c;这些噪声会严重影响导航信息融合算法的精度&#xff0c;甚至导致系统发散。传统的卡尔曼滤波算法基于高斯噪声假设&#xff0…...

【C++语言】卡码网语言基础课系列----12. 位置互换

文章目录 练习题目位置互换具体代码实现 小白寄语诗词共勉 练习题目 位置互换 题目描述&#xff1a; 给定一个长度为偶数位的字符串&#xff0c;请编程实现字符串的奇偶位互换。 输入描述&#xff1a; 输入包含多组测试数据。 输入的第一行是一个整数n&#xff0c;表示有测试…...

洛谷的更多功能(不会像其他文章那样复杂且仅支持Edge浏览器)

第一步&#xff1a;下载《洛谷美化 (1).zip》文件夹。 会出现这样的文件夹&#xff1a; 注意&#xff1a;Edge.txt和洛谷前提1.txt是一样的哟&#xff01; 第二步&#xff1a;篡改猴 先打开Edge.txt或者是洛谷前提1.txt文件&#xff0c;打开后复制粘贴到你的Edge浏览器并打开…...

C++编程语言:抽象机制:模板(Bjarne Stroustrup)

目录 23.1 引言和概观(Introduction and Overview) 23.2 一个简单的字符串模板(A Simple String Template) 23.2.1 模板的定义(Defining a Template) 23.2.2 模板实例化(Template Instantiation) 23.3 类型检查(Type Checking) 23.3.1 类型等价(Type Equivalence) …...

女生年薪12万,算不算属于高收入人群

在繁华喧嚣的都市中&#xff0c;我们时常会听到关于收入、高薪与生活质量等话题的讨论。尤其是对于年轻女性而言&#xff0c;薪资水平不仅关乎个人价值的体现&#xff0c;更直接影响到生活质量与未来的规划。那么&#xff0c;女生年薪12万&#xff0c;是否可以被划入高收入人群…...

2181、合并零之间的节点

2181、[中等] 合并零之间的节点 1、问题描述&#xff1a; 给你一个链表的头节点 head &#xff0c;该链表包含由 0 分隔开的一连串整数。链表的 开端 和 末尾 的节点都满足 Node.val 0 。 对于每两个相邻的 0 &#xff0c;请你将它们之间的所有节点合并成一个节点&#xff…...

Immutable设计 SimpleDateFormat DateTimeFormatter

专栏系列文章地址&#xff1a;https://blog.csdn.net/qq_26437925/article/details/145290162 本文目标&#xff1a; 理解不可变设计模式&#xff0c;时间format有线程安全要求的注意使用DateTimeFormatter 目录 ImmutableSimpleDateFormat 非线程安全可以synchronized解决&a…...

【网络】传输层协议TCP(重点)

文章目录 1. TCP协议段格式2. 详解TCP2.1 4位首部长度2.2 32位序号与32位确认序号&#xff08;确认应答机制&#xff09;2.3 超时重传机制2.4 连接管理机制(3次握手、4次挥手 3个标志位)2.5 16位窗口大小&#xff08;流量控制&#xff09;2.6 滑动窗口2.7 3个标志位 16位紧急…...

17.[前端开发]Day17-形变-动画-vertical-align

1 transform CSS属性 - transform transform的用法 表示一个或者多个 不用记住全部的函数&#xff0c;只用掌握这四个常用的函数即可 位移 - translate <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta ht…...

LeetCode435周赛T2贪心

题目描述 给你一个由字符 N、S、E 和 W 组成的字符串 s&#xff0c;其中 s[i] 表示在无限网格中的移动操作&#xff1a; N&#xff1a;向北移动 1 个单位。S&#xff1a;向南移动 1 个单位。E&#xff1a;向东移动 1 个单位。W&#xff1a;向西移动 1 个单位。 初始时&#…...

陆游的《诗人苦学说》:从藻绘到“功夫在诗外”(中英双语)mastery lies beyond poetry

陆游的《诗人苦学说》&#xff1a;从藻绘到“功夫在诗外” 今天看万维钢的《万万没想到》一书&#xff0c;看到陆游的功夫在诗外的句子&#xff0c;特意去查找这首诗的原文。故而有此文。 我国学人还往往过分强调“功夫在诗外”这句陆游的名言&#xff0c;认为提升综合素质是一…...

AI模型平台之——ModelScope(魔搭)

ModelScope 是什么&#xff1f; ModelScope 是一个由阿里巴巴达摩院推出的开源模型库和工具集&#xff0c;旨在为开发者提供高效、便捷的机器学习模型和工具。ModelScope 提供了丰富的预训练模型、数据集和工具&#xff0c;支持多种任务和应用场景&#xff0c;如自然语言处理、…...

GIt使用笔记大全

Git 使用笔记大全 1. 安装 Git 在终端或命令提示符中&#xff0c;输入以下命令检查是否已安装 Git&#xff1a; git --version如果未安装&#xff0c;可以从 Git 官方网站 下载并安装适合你操作系统的版本。 2. 配置 Git 首次使用 Git 时&#xff0c;需要配置用户名和邮箱…...

42【文件名的编码规则】

我们在学习的过程中&#xff0c;写出数据或读取数据时需要考虑编码类型 火山采用&#xff1a;UTF-16 易语言采用&#xff1a;GBK php采用&#xff1a;UTF-8 那么我们写出的文件名应该是何种编码的&#xff1f;比如火山程序向本地写出一个“测试.txt”&#xff0c;理论上这个“测…...

Linux网络 HTTPS 协议原理

概念 HTTPS 也是一个应用层协议&#xff0c;不过 是在 HTTP 协议的基础上引入了一个加密层。因为 HTTP的内容是明文传输的&#xff0c;明文数据会经过路由器、wifi 热点、通信服务运营商、代理服务器等多个物理节点&#xff0c;如果信息在传输过程中被劫持&#xff0c;传输的…...

Vue.js组件开发-实现全屏手风琴幻灯片切换特效

使用 Vue 实现全屏手风琴幻灯片切换特效 步骤概述 创建 Vue 项目&#xff1a;使用 Vue CLI 创建一个新的 Vue 项目。设计组件结构&#xff1a;创建一个手风琴幻灯片组件&#xff0c;包含幻灯片项和切换逻辑。实现样式&#xff1a;使用 CSS 实现全屏和手风琴效果。添加交互逻辑…...

数据库、数据仓库、数据湖有什么不同

数据库、数据仓库和数据湖是三种不同的数据存储和管理技术&#xff0c;它们在用途、设计目标、数据处理方式以及适用场景上存在显著差异。以下将从多个角度详细说明它们之间的区别&#xff1a; 1. 数据结构与存储方式 数据库&#xff1a; 数据库主要用于存储结构化的数据&…...

MLM之MiniCPM-o:MiniCPM-o的简介(涉及MiniCPM-o 2.6和MiniCPM-V 2.6)、安装和使用方法、案例应用之详细攻略

MLM之MiniCPM-o&#xff1a;MiniCPM-o的简介(涉及MiniCPM-o 2.6和MiniCPM-V 2.6)、安装和使用方法、案例应用之详细攻略 目录 MiniCPM-o的简介 0、更新日志 1、MiniCPM-o系列模型特点 MiniCPM-o 2.6 的主要特点 MiniCPM-V 2.6的主要特点 2、MiniCPM-o系列模型架构 MiniC…...

【Conda 和 虚拟环境详细指南】

Conda 和 虚拟环境的详细指南 什么是 Conda&#xff1f; Conda 是一个开源的包管理和环境管理系统&#xff0c;支持多种编程语言&#xff08;如Python、R等&#xff09;&#xff0c;最初由Continuum Analytics开发。 主要功能&#xff1a; 包管理&#xff1a;安装、更新、删…...

Rust 控制流语法详解

Rust 控制流语法详解 控制流是编程语言中用于控制代码执行顺序的重要机制。Rust 提供了多种控制流语法&#xff0c;包括条件判断&#xff08;if、else if&#xff09;、循环&#xff08;loop、while、for&#xff09;等。本文将详细介绍这些语法&#xff0c;并通过示例展示它们…...

VLC-Qt: Qt + libVLC 的开源库

参考链接 https://blog.csdn.net/u012532263/article/details/102737874...

洛谷 P5146 最大差值 C语言

P5146 最大差值 - 洛谷 | 计算机科学教育新生态 题目描述 HKE 最近热衷于研究序列&#xff0c;有一次他发现了一个有趣的问题&#xff1a; 对于一个序列 A1​,A2​,…,An​&#xff0c;找出两个数 i,j&#xff08;1≤i<j≤n&#xff09;&#xff0c;使得 Aj​−Ai​ 最大。…...

Zabbix 推送告警 消息模板 美化(钉钉Webhook机器人、邮件)

目前网络上已经有很多关于Zabbix如何推送告警信息到钉钉机器人、到邮件等文章。 但是在搜索下来&#xff0c;发现缺少了对告警信息的美化的文章。 本文不赘述如何对Zabbix对接钉钉、对接邮件&#xff0c;仅介绍我采用的美化消息模板的内容。 活用AI工具可以减轻很多学习、脑力负…...

MySQL数据库环境搭建

下载MySQL 官网&#xff1a;https://downloads.mysql.com/archives/installer/ 下载社区版就行了。 安装流程 看b站大佬的视频吧&#xff1a;https://www.bilibili.com/video/BV12q4y1477i/?spm_id_from333.337.search-card.all.click&vd_source37dfd298d2133f3e1f3e3c…...

书生大模型实战营7

文章目录 L1——基础岛提示词工程实践什么是Prompt(提示词)什么是提示工程提示设计框架CRISPECO-STAR LangGPT结构化提示词LangGPT结构编写技巧构建全局思维链保持上下文语义一致性有机结合其他 Prompt 技巧 常用的提示词模块 浦语提示词工程实践(LangGPT版)自动化生成LangGPT提…...

Spark的基本概念

个人博客地址&#xff1a;Spark的基本概念 | 一张假钞的真实世界 编程接口 RDD&#xff1a;弹性分布式数据集&#xff08;Resilient Distributed Dataset &#xff09;。Spark2.0之前的编程接口。Spark2.0之后以不再推荐使用&#xff0c;而是被Dataset替代。Dataset&#xff…...

langchain基础(二)

一、输出解析器&#xff08;Output Parser&#xff09; 作用&#xff1a;&#xff08;1&#xff09;让模型按照指定的格式输出&#xff1b; &#xff08;2&#xff09;解析模型输出&#xff0c;提取所需的信息 1、逗号分隔列表 CommaSeparatedListOutputParser&#xff1a;…...

读取要素类中的几何信息

在arcpy中,每个要素都有相关的集合对象,都可以在游标中访问.本节将使用SearchCursor和Polyon对象来读取面要素类几何信息. 操作方法 1.打开IDLE,新建一个脚本 2.导入arcpy模块 3.设置输入要素类为目标面要素类 infc "<>" 4.传入输入要素类创建SearchCurs…...

洛谷 P1130 红牌 C语言

题目描述 某地临时居民想获得长期居住权就必须申请拿到红牌。获得红牌的过程是相当复杂&#xff0c;一共包括 N 个步骤。每一步骤都由政府的某个工作人员负责检查你所提交的材料是否符合条件。为了加快进程&#xff0c;每一步政府都派了 M 个工作人员来检查材料。不幸的是&…...

五. Redis 配置内容(详细配置说明)

五. Redis 配置内容(详细配置说明) 文章目录 五. Redis 配置内容(详细配置说明)1. Units 单位配置2. INCLUDES (包含)配置3. NETWORK (网络)配置3.1 bind(配置访问内容)3.2 protected-mode (保护模式)3.3 port(端口)配置3.4 timeout(客户端超时时间)配置3.5 tcp-keepalive()配置…...