Redis-“自动分片、一定程度的高可用性”(sharding水平拆分、failover故障转移)特性(Sentinel、Cluster)

文章目录

  • 零、写在前面
  • 一、水平拆分(sharding/分片)、故障转移(failover)机制介绍
      • 水平拆分(Sharding)
      • 故障转移机制
  • 二、Redis的水平拆分的机制有关的配置
      • 1. 环境准备
      • 2. 配置文件配置
      • 3. 启动所有Redis实例
      • 4. 创建集群
      • 5. 测试集群读/写
      • 6. 集群管理
  • 三、Redis的故障转移机制的Sentinel模式
    • 问题起源
    • sentinel节点间的相互感知
    • sentinel对master的故障发现的确认
    • sentinel的failover决策
      • 从多个sentinel节点中选举出一个failover发起者
      • failover发起后选取一个新的master,告知并控制其他slave自动连接新的master
    • 具体配置
  • 三、Redis Cluster模式??
    • 具体配置
      • 1. 环境准备
      • 2. 配置Redis实例
      • 3. 启动Redis实例
      • 4. 创建Redis Cluster
      • 5. 验证集群状态

零、写在前面

  • sharding:水平拆分的支持
  • replication:作为读写分离和故障转移的基础
  • fail-detect:和replication配合,支撑故障转移
  • cluster(all-in-one):独立完成上面三个的这样的完整的分布式解决方案

Redis集群是一种Redis安装方式,提供数据在多个Redis节点间的自动分片和一定程度的高可用性。实现Redis集群的方法包括:

  • 手动配置:通过配置文件和命令行工具手动设置集群。
  • 使用redis-trib.rb:一个Ruby脚本,用于创建和管理集群。
  • 使用create-cluster脚本:一个简化的脚本,用于快速创建集群

"自动分片和一定程度的高可用性"这句话的意思是:

自动分片:Redis集群能够自动将数据分散存储到多个Redis节点上,这个过程称为分片。这样可以提高数据存储的容量和访问性能。Redis集群会根据一定的规则(如哈希)将数据分配到不同的节点上,而不需要人工干预。

一定程度的高可用性:Redis集群通过数据复制和故障转移机制,在某个节点发生故障时,能够自动将请求重定向到其他健康的节点,从而保证服务的可用性。虽然Redis集群提供了一定程度的高可用性,但相比专业的分布式数据库系统,其容错能力还是有一定差距的。

总之,"自动分片和一定程度的高可用性"是Redis集群的两个主要特点,使其成为一种适合大规模分布式场景的数据存储方案。


Redis Sentinel和Redis Cluster是两种不同的高可用解决方案:

Sentinel:主要用于监控Redis实例,自动进行故障转移和通知。
Cluster:提供数据分片和高可用性,允许在多个节点上分布数据,并在节点故障时进行自动故障转移。


一、水平拆分(sharding/分片)、故障转移(failover)机制介绍

水平拆分(Sharding)

水平拆分,也称为横向拆分,是一种数据库架构技术,用于将数据分散存储到多个数据库或表中。这种方法通过某种规则(如哈希、范围或列表)将数据分配到不同的数据库或表中,每个分片只包含数据的一部分,从而突破单机数据量处理的瓶颈,并提高系统的扩展性和负载能力。

优点

  • 提高性能和稳定性:通过分散数据到多个数据库或表,可以减轻单个数据库的读写和存储压力,提升系统稳定性和负载能力。
  • 易于扩展:可以根据业务需求动态添加或删除数据库节点,实现系统的弹性伸缩。

缺点

  • 跨分片事务一致性难以保证:在分布式数据库环境中,跨多个分片的事务处理变得复杂,一致性难以保证。
  • 跨库的join关联查询性能较差:由于数据被分散到不同的数据库或表中,跨分片的关联查询性能会受到影响。

分片规则

  1. 根据数值范围:例如,根据用户ID的范围将数据分配到不同的数据库中。
  2. 根据数值取模:例如,根据用户ID取模的结果将数据分配到不同的数据库中。

故障转移机制

故障转移机制是指在数据库或服务出现故障时,自动将请求从故障节点转移到健康节点的过程,以确保服务的高可用性。

故障发现

  • 主观下线(PFAIL):指某个节点认为另一个节点不可用,这个状态并不是最终的故障判定,可能存在误判情况。
  • 客观下线(Fail):指标记一个节点真正的下线,集群内多个节点都认为该节点不可用,从而达成共识的结果。

故障转移过程

  1. 从节点检查:每个从节点检查最后与主节点断线时间,判断是否有资格替换故障的主节点。
  2. 故障选举:当从节点符合故障转移资格后,更新触发故障选举的时间,通过对多个从节点使用不同的延迟选举时间来支持优先级问题。
  3. 收集投票:当从节点收集到N/2+1个持有槽的主节点投票时,从节点可以执行替换主节点操作。
  4. 替换主节点:从节点收集到足够的选票之后,触发替换主节点操作,包括取消复制、变为主节点、接管故障主节点的槽信息等。

故障转移时间

  • 故障转移时间与cluster-node-timeout参数息息相关,可以根据业务容忍度做出适当调整。

故障转移机制的目的是确保在主节点发生故障时,能够快速、自动地将服务转移到备用节点,以最小化服务中断时间,提高系统的可用性和可靠性。

二、Redis的水平拆分的机制有关的配置

Redis的水平拆分(Sharding)配置主要涉及以下几个步骤:

1. 环境准备

在搭建Redis分片集群之前,需要准备多台服务器或虚拟机,每台服务器上可以运行多个Redis实例。例如,可以准备三台服务器,每台服务器上运行两个Redis实例,一个作为主节点(Master),另一个作为从节点(Slave)。

2. 配置文件配置

对于每个Redis实例,需要配置redis.conf文件。以下是配置文件的一些关键参数:

  • port:设置Redis实例的端口号。
  • daemonize yes:以守护进程方式运行。
  • pidfile:指定pid文件的位置。
  • loglevel:设置日志级别。
  • logfile:指定日志文件的位置。
  • dbfilename:设置RDB持久化文件的名称。
  • dir:设置数据文件的目录。
  • protected-mode no:关闭保护模式。
  • cluster-enabled yes:启用集群模式。
  • cluster-config-file:指定集群配置文件。
  • cluster-node-timeout:设置节点超时时间。
  • appendonly yes:启用AOF持久化。

3. 启动所有Redis实例

根据配置文件启动所有Redis实例。可以使用redis-server命令加上配置文件路径来启动每个实例。

4. 创建集群

使用redis-cli工具创建集群。例如,使用以下命令创建一个包含3个主节点和3个从节点的集群:

redis-cli --cluster create --cluster-replicas 1 <node1_ip>:<port1> <node2_ip>:<port2> <node3_ip>:<port3> <node4_ip>:<port4> <node5_ip>:<port5> <node6_ip>:<port6>

其中,--cluster-replicas 1表示每个主节点有一个从节点。

5. 测试集群读/写

创建集群后,可以测试集群的读写功能,确保数据能够正确地存储和检索。

6. 集群管理

Redis集群需要进行管理和监控,包括节点的健康状态监测、槽的分配和重新分配、数据的迁移、故障恢复等。Redis提供了一些工具和命令来进行集群管理,比如redis-cliredis-trib.rbCLUSTER命令等。

以上步骤概述了Redis水平拆分的具体配置过程。在实际操作中,可能还需要根据具体的业务需求和环境进行调整和优化。

三、Redis的故障转移机制的Sentinel模式

问题起源

当两台以上Redis实例形成了主备关系,它们组成的集群就具备了一定的高可用性:当master故障时,slave可以成为新的master,对外提供读写服务,这种运营机制称为failover,那么问题在于:谁去发现mater的故障做failover的决策?
方式是:保持一个daemon进程,监控着所有的master-slave节点;而Redis的sentinel提供了一套多daemon间(“多个daemon”的存在是因为不能是只有一个daemon这个的单点故障存在)的交互机制,解决故障发现、failover决策协商机制等问题;这些daemon节点相互间通信、选举、协商,在master节点的故障发现、failover决策上表现出一致性
在这里插入图片描述

sentinel节点间的相互感知

sentinel节点间因为共同监视了同一个master节点从而相互也关联了起来,一个新加入的sentinel节点需要和有相同监视的master的其他sentinel节点相互感知,方式如下:所有需要相互感知的sentinel都向他们共同的master节点上订阅相同的channel:_sentinel_:hello,新加入的sentinel节点向这个channel发布一条消息,包含了自己的信息,该channel的订阅者们就可以发现这个新的sentinel。随后新sentinel和已有的其他sentinel节点建立长连接。sentinel集群中所有节点两两连接如图所示;图中,新的sentinel节点加入后,它向master节点发布自己加入这个信息,此时现有的订阅sentinel节点将会发现这条信息从而感知到了新sentinel节点的存在。
sentinel集群的相互感知

在这里插入图片描述

sentinel对master的故障发现的确认

sentinel节点通过定期地向master发送心跳包判断其存活状态,称为PING;一旦发现master没有正确地响应,那么通过和其他sentinel节点对比确认是否将master判定为不可用,然后进入failover流程

sentinel的failover决策

从多个sentinel节点中选举出一个failover发起者

当多个sentinel节点之间进行通信已经判定了master为不可用时,多个节点想同时发起failover是有问题的,要确保最终只有一个sentinel节点作为failover的发起者,此时需要开始一个leader选举的过程,选择谁来发起failover;

failover发起后选取一个新的master,告知并控制其他slave自动连接新的master

leader sentinel确定之后,从master所有的slave中依据一定的规则选取一个新的master,告知其他slave连接这个新的master

在Redis Sentinel系统中,当需要从master的所有slave中选取一个新的master时,以及通知其他slave连接到新的master,这个过程是自动和有序的。以下是详细的步骤和机制:

  1. 选举新的master

    • 当Sentinel集群确认master客观下线(即多个Sentinel节点都认为master不可用)后,会开始故障转移流程。
    • Sentinel集群会从master的从节点中选择一个作为新的master。选择过程通常基于以下规则:
      • 从节点的优先级slave-priority配置项):优先级高的从节点更有可能被选为新的master。
      • 复制偏移量slave_repl_offset):选择与原master复制进度最接近的从节点,以确保数据的一致性。
      • runID:如果优先级和复制进度都相同,那么选择runID最小的从节点作为新的master。
  2. 通知机制

    • 一旦新的master被选中,Sentinel Leader会执行以下操作:
      • 向被选中的从节点发送SLAVEOF NO ONE命令,将其提升为新的master。
      • 更新剩余从节点的配置,让它们开始复制新的master。
    • Sentinel通过发布订阅功能(pub/sub)通知其他slave和客户端新的master信息。具体来说:
      • Sentinel会将新的master信息通过+switch-master频道发布,这样订阅了该频道的客户端和其他系统就能接收到通知。
      • 客户端可以通过订阅特定的频道来接收这些通知,从而能够及时地更新自己的连接信息。
  3. 客户端如何查看通知

    • 客户端可以连接到Sentinel节点,并订阅相关的发布订阅频道来接收通知。例如,客户端可以订阅+switch-master频道来获取master切换的通知。
    • 当客户端接收到新的master信息后,它们可以自动更新配置,将连接指向新的master。
  4. 自动完成连接到新的主节点

    • 客户端在接收到Sentinel发布的新master信息后,可以根据这些信息自动重新配置连接,连接到新的master。
    • 这个过程对客户端来说是透明的,客户端只需要正确地订阅Sentinel的发布订阅频道,并处理接收到的消息即可。

通过上述机制,Redis Sentinel确保了在master不可用时能够自动选举新的master,并通过通知机制让其他slave和客户端知晓新的master信息,从而实现高可用性。

具体配置

Redis的故障转移配置主要依赖于Redis Sentinel,以下是具体的配置步骤和关键参数:

  1. 监控主节点(sentinel monitor)

    • 使用sentinel monitor命令来监控主节点。该命令的格式为:sentinel monitor <master-name> <ip> <port> <quorum>
    • <master-name>是主节点的名称,用于在Sentinel之间标识这个主节点。
    • <ip><port>是主节点的IP地址和端口。
    • <quorum>是法定人数,即需要多少个Sentinel同意主节点下线,才能开始故障转移。建议设置为奇数,并且大于1。
  2. 故障检测时间(sentinel down-after-milliseconds)

    • 使用sentinel down-after-milliseconds <master-name> <milliseconds>来设置主节点被认为是下线的时间阈值。
    • <milliseconds>是毫秒数,超过这个时间没有响应,Sentinel会认为主节点宕机。
  3. 故障转移超时(sentinel failover-timeout)

    • 使用sentinel failover-timeout <master-name> <milliseconds>来设置故障转移操作的超时时间。
    • <milliseconds>是毫秒数,如果在该时间内故障转移没有完成,则认为故障转移失败。
  4. 并行同步(sentinel parallel-syncs)

    • 使用sentinel parallel-syncs <master-name> <num>来设置在故障转移时,可以有多少个从节点同时对新的主节点进行数据同步。
    • <num>是数字,表示并行同步的从节点数量。

上面说的“并行同步”为什么不说成“并发同步”?
“并行”和“并发”这两个术语在计算机科学和分布式系统中有着细微的区别,尽管在日常对话中它们经常被交替使用。

  1. 并行(Parallel)

    • 并行处理指的是多个计算任务在多个处理器上同时执行。在物理层面上,这些任务是真正同时发生的,每个处理器可以独立于其他处理器工作。
    • 在Redis Sentinel的上下文中,当提到“并行同步”,它意味着多个从节点可以同时开始对新的主节点进行数据同步。这里的“同时”强调的是多个同步操作在时间上的并行性,即它们不需要等待彼此完成就可以开始。
  2. 并发(Concurrent)

    • 并发处理指的是多个计算任务在逻辑上是同时进行的,但实际上可能是交替执行的。在单个处理器上,任务可能会因为时间片轮转而交替执行,给人一种同时进行的错觉。
    • 并发更强调的是任务之间的资源共享和时间上的重叠,而不是物理上的并行执行。

在Redis Sentinel的故障转移场景中,使用“并行同步”而不是“并发同步”的原因可能包括:

  • 强调物理并行性:在故障转移时,多个从节点可以同时开始同步操作,每个从节点都在自己的处理器上独立执行同步任务,这符合并行处理的定义。
  • 区分概念:尽管在技术上并发和并行有重叠,但在特定的技术领域,为了清晰表达,开发者和架构师可能会选择一个更精确的术语来描述特定的行为。
  • 避免混淆:在分布式系统中,“并发”可能涉及到更复杂的资源共享和同步问题,而“并行”则更直接地描述了多个任务同时进行的情况。

因此,Redis Sentinel中使用“并行同步”这个术语是为了更准确地描述在故障转移时多个从节点可以同时对新的主节点进行数据同步的行为。


  1. 配置文件示例

    sentinel monitor mymaster 127.0.0.1 6379 2
    sentinel down-after-milliseconds mymaster 60000
    sentinel failover-timeout mymaster 180000
    sentinel parallel-syncs mymaster 1
    

    这个配置文件监控名为mymaster的主节点,IP地址为127.0.0.1,端口为6379,quorum设置为2。

  2. Sentinel配置文件

    • Redis源码中包含一个名为sentinel.conf的文件,是一个自文档化的示例配置文件,可以根据这个文件来配置Sentinel。
  3. 启动Sentinel

    • 可以通过redis-sentinel命令启动Sentinel,或者使用redis-server命令并加上--sentinel参数来启动。
    redis-sentinel sentinel.conf
    

通过以上配置,Redis Sentinel可以监控Redis主节点的状态,并在主节点发生故障时自动进行故障转移,确保Redis服务的高可用性。



要使用redis-cli工具连接到Sentinel并检查其状态,以确保Sentinel正常运行并监控Redis主节点,你可以按照以下步骤操作:

首先,你需要连接到运行Sentinel的Redis实例。如果Sentinel在默认端口26379上运行,并且Sentinel服务器的IP地址是sentinel_host,你可以使用以下命令:

redis-cli -h sentinel_host -p 26379

如果Sentinel设置了密码(通过sentinel auth-pass配置),你需要使用-a选项提供密码:

redis-cli -h sentinel_host -p 26379 -a sentinel_password

连接到Sentinel后,你可以使用SENTINEL命令来检查Sentinel的状态和监控的Redis主节点信息。

SENTINEL masters

这个命令会列出所有被Sentinel监控的Redis主节点。

SENTINEL slaves mymaster

这个命令会列出所有监控到的从节点的信息,包括它们的IP地址、端口和与主节点的同步状态。

通过上述命令,你可以验证Sentinel是否正常运行,并检查它是否正确监控了Redis主节点。如果SENTINEL info命令返回了主节点的详细信息,并且SENTINEL slaves命令列出了从节点的信息,那么Sentinel应该正常运行并监控Redis主节点。

这些步骤提供了一个基本的框架,用于使用redis-cli工具来验证Sentinel的配置和状态。根据你的具体需求,你可能需要调整命令和参数。



Redis Sentinel 是一个分布式系统,用于监控 Redis 服务的高可用性。它通常不运行在主节点或从节点上,而是运行在独立的机器上。以下是关于 redis-sentinel 命令和 sentinel.conf 配置文件的具体说明:

  1. redis-sentinel 命令

    • 这个命令是用来启动 Redis Sentinel 实例的。它需要在运行 Sentinel 的机器上存在。这些机器可以是单独的服务器,也可以是虚拟机,但它们不应该与运行 Redis 主节点或从节点的服务器相同。这样做的目的是为了确保即使主节点或从节点所在的机器发生故障,Sentinel 仍然能够正常运行并执行故障转移操作。
  2. sentinel.conf 配置文件

    • 这个配置文件包含了 Sentinel 需要的所有配置信息,包括监控的主节点信息、故障转移的参数等。它应该存在于运行 Sentinel 的每台机器上。每台 Sentinel 机器都会有自己的配置文件,以便独立监控和处理故障转移。
  3. 部署建议

    • 为了确保高可用性,Sentinel 应该至少部署在三台不同的机器上。这是因为如果只有两台 Sentinel 机器,它们之间可能会出现网络分区的情况,导致无法达成法定人数(quorum)来决定主节点是否下线。
    • Sentinel 机器应该与 Redis 主节点和从节点网络隔离,以避免单点故障。
    • 在实际部署中,Sentinel 机器通常与 Redis 节点位于不同的物理位置或不同的数据中心,以减少单点故障的风险。

总结来说,redis-sentinel 命令和 sentinel.conf 配置文件需要在专门用于运行 Sentinel 的机器上存在,而不是在主节点或从节点上。这样做可以提高整个 Redis 集群的可用性和容错能力。


三、Redis Cluster模式??

具体配置

要配置Redis Cluster模式,你需要遵循以下步骤:

1. 环境准备

首先,你需要准备多个Redis实例,至少需要三个主节点,推荐六个节点(三个主节点和三个从节点)以确保高可用性。

2. 配置Redis实例

对于每个Redis实例,你需要修改redis.conf配置文件,设置以下参数:

  • port:设置Redis实例的端口号。
  • cluster-enabled yes:启用Redis的集群模式。
  • cluster-config-file nodes.conf:指定集群配置文件的名称,这个文件由Redis自动管理,不需要手动编辑。
  • cluster-node-timeout 5000:设置节点超时时间,单位为毫秒,这个参数决定了主节点在多长时间内无响应被视为失败。
  • appendonly yes:启用AOF持久化,确保数据的持久性。

3. 启动Redis实例

在每个配置好的目录中启动Redis实例。例如,如果你的配置文件位于70007005的目录中,你需要在每个目录下启动对应的Redis实例:

cd 7000
redis-server ./redis.conf

4. 创建Redis Cluster

使用redis-cli工具创建集群。你需要提供所有节点的IP地址和端口号。例如,如果你有六个节点,你可以使用以下命令创建集群:

redis-cli --cluster create [IP_ADDRESS_1]:6379 [IP_ADDRESS_2]:6379 [IP_ADDRESS_3]:6379 [IP_ADDRESS_4]:6379 [IP_ADDRESS_5]:6379 [IP_ADDRESS_6]:6379 --cluster-replicas 1

这个命令会将前三个IP地址作为主节点,其余的作为从节点。

5. 验证集群状态

创建集群后,你可以使用以下命令来验证集群的状态:

redis-cli -c -h 192.168.10.101 -p 7000 -a password

这个命令会连接到集群并显示集群的状态信息。

以上步骤概述了Redis Cluster模式的具体配置过程。在实际操作中,可能还需要根据具体的业务需求和环境进行调整和优化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/906362.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++STL详解(九)map和set的使用

一.关联式容器的介绍 CSTL包含了序列式容器和关联式容器&#xff1a; 序列式容器里面存储的是元素本身&#xff0c;其底层是线性的数据结构&#xff0c;就譬如我们之前学习的vector&#xff0c;list&#xff0c;deque等等。关联式容器里面存储的是<key,value>的键值对&…

goframe开发一个企业网站 模版界面4

###goframe已有了模板的功能 {{"string"}} // 一般 string {{raw string}} // 原始 string {{c}} // byte {{print nil}} // nil 也被支持 {{. | FuncA | FuncB | FuncC}}{{if .condition}}... {{else}}{{if .condition2}}...{{end}} {{end}}{{rang…

一、k8s快速入门之学习Kubernetes组件基础

一、三个容器管理器平台 Apache MESOS 开源的分布式资源管理框架&#xff0c;被推特选为基础平台&#xff0c;2019年推特换位k8s&#xff0c;MESOS最新版可以在MESOS上管理k8sDOCKER SWARM docker总部发行的&#xff0c;实现docker的集群方案&#xff0c;和docker捆版一起&…

初始JavaEE篇——多线程(7):定时器、CAS

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;JavaEE 目录 定时器的使用 定时器的原理 模拟实现定时器 CAS 介绍 CAS的应用场景 解析 AtomicInteger 类 实现自旋锁 CAS的缺陷…

【UGUI】为射击游戏添加动态显示的分数和血量到UI界面

项目背景 在这个项目中&#xff0c;我们希望实现一个简单的游戏系统&#xff0c;其中玩家可以通过击中目标来获得分数&#xff0c;同时通过与怪物碰撞来减少血量。分数和血量需要在游戏界面上实时显示&#xff0c;以便玩家能够随时了解自己的状态。 技术实现 1. 静态变量的使…

stm32引脚PB3、PB4、PA15作为普通IO口用时,需要先解除调试端口复用

当项目调试的时候&#xff0c;发现PA15引脚无论配置输出高还是低或者输入&#xff0c;均只能输出3.3V的高电平。 目前STM的硬件调试有两种方法&#xff0c;JTAG和SW的方式&#xff0c;目前个人认为最好的方式就是SW&#xff0c;因为它只占用PA13和PA14两个IO。而JTAG还要多占用…

MATLAB与STK互联:仿真并获取低轨卫星与指定区域地面站的可见性数据

MATLAB控制STK实现&#xff1a;仿真并获取低轨卫星与指定区域地面站的可见性数据 本次仿真主要参考了多篇文献和网站&#xff0c;包括但不限于&#xff1a;《Using MATLAB for STK Automation》、CSDN博文&#xff1a; 拜火先知的博客_CSDN博客-笔记、AGI官网有关MATLAB的内容…

用Python设置、更新和获取Excel单元格的值

Excel工作簿作为一款广泛使用的数据管理工具&#xff0c;与Python相结合&#xff0c;可以使得自动化处理大量数据成为可能。通过Python来设置、更新以及读取Excel单元格的值&#xff0c;不仅可以极大地提高工作效率&#xff0c;减少重复劳动&#xff0c;还能增强数据处理流程的…

Golang | Leetcode Golang题解之第525题连续数组

题目&#xff1a; 题解&#xff1a; func findMaxLength(nums []int) (maxLength int) {mp : map[int]int{0: -1}counter : 0for i, num : range nums {if num 1 {counter} else {counter--}if prevIndex, has : mp[counter]; has {maxLength max(maxLength, i-prevIndex)} …

提升网站安全性 HTTPS的重要性与应用指南

内容概要 在如今数字化快速发展的时代&#xff0c;网站安全显得尤为重要。许多用户在访问网站时&#xff0c;尤其是涉及个人信息或金融交易时&#xff0c;对数据传输的安全性有着高度的关注。HTTPS&#xff08;超文本传输安全协议&#xff09;正是为了满足这种需求而诞生的。通…

DICOM标准:解析DICOM属性中的病人模块

目录 病人模块概述 1. 病人关系模块&#xff08;Patient Relationship Module&#xff09; 2. 病人识别模块&#xff08;Patient Identification Module&#xff09; 3. 病人统计模块&#xff08;Patient Demographic Module&#xff09; 4. 病人医学模块&#xff08;Pati…

编写高性能爬虫抓取股票行情数据

最近给一个私募大佬帮忙做了一些股票交易有关的系统&#xff0c;其中涉及到行情数据抓取的问题&#xff0c;一番摸索之后&#xff0c;把成果在这里做个分享。 我把行情抓取的部分&#xff0c;和一个写手记的小功能&#xff0c;单独拿了出来放在一个小系统里面&#xff0c;可以…

人像摄影笔记(自用)

相机的原理&#xff1a;镜头--CMOS传感器---通过ISP的计算 然后通过手机的GPU处理后呈现出图片的形式 镜头&#xff1a;定焦和变焦&#xff0c;变焦分为光学变焦和数字变焦 光学变焦&#xff1a;焦距变了 画质不变 数字变焦&#xff1a;焦距不变 裁剪画质 数字变焦一…

前端埋点与监控最佳实践:从基础到全流程实现.

前端埋点与监控最佳实践&#xff1a;从基础到全流程实现 大纲 我们会从以下三个方向来讲解埋点与监控的知识&#xff1a; 什么是埋点&#xff1f;什么是监控&#xff1f; JS 中实现监控的核心方案 写一个“相对”完整的监控实例 一、什么是埋点&#xff1f;什么是监控&am…

电能质量治理产品在分布式光伏电站的应用

1.概述 随着全球对可再生能源需求的不断增长&#xff0c;分布式光伏电站的建设与扩张正迅速发展。然而&#xff0c;在其运行过程中&#xff0c;分布式光伏电站遭遇了一系列挑战&#xff0c;包括企业关口计量点功率因数降低和谐波污染等问题。这些问题不仅影响了光伏电站的运行…

遥感图像Trento原始数据集下载

遥感图像Trento原始数据集下载 偶然间在某个项目里发现了Trento的完整数据集&#xff0c;不过那个数据集有些奇怪的小改动 虽然我已经不做遥感方向了&#xff0c;不过当初我找这个数据集也是花了很长时间 于是重新整理了一下&#xff0c;就当是方便后来的研究者使用吧 githu…

GenAI 生态系统现状:不止大语言模型和向量数据库

自 20 个月前 ChatGPT 革命性的推出以来&#xff0c;生成式人工智能&#xff08;GenAI&#xff09;领域经历了显著的发展和创新。最初&#xff0c;大语言模型&#xff08;LLMs&#xff09;和向量数据库吸引了最多的关注。然而&#xff0c;GenAI 生态系统远不止这两个部分&#…

个人应用接入使用阿里云盘和百度网盘

一、阿里云盘 官方文档接入流程 语雀流程概述服务端 API 调用流程如下图所示1. 创建账...https://www.yuque.com/aliyundrive/zpfszx/btw0tw 1. 接入授权 1.1. App Key、App Secret和用户授权验证 在通过网盘开发者认证之后&#xff0c;创建个人应用会生成APP ID&#xff…

医院信息化与智能化系统(15)

医院信息化与智能化系统(15) 这里只描述对应过程&#xff0c;和可能遇到的问题及解决办法以及对应的参考链接&#xff0c;并不会直接每一步详细配置 如果你想通过文字描述或代码画流程图&#xff0c;可以试试PlantUML&#xff0c;告诉GPT你的文件结构&#xff0c;让他给你对应…

从比亚迪超越特斯拉,看颠覆全球市场的中国力量

这是比亚迪CEO王传福早年在日本调研电池供应链时发出的感慨。 那时的人们谁也没有想到&#xff0c;比亚迪会从深圳的一家普通的电池供应商开始做起&#xff0c;拼出一条属于自己的“血路”&#xff0c;摇身一变成为名副其实的“电车之王”&#xff0c;并让全球车企仰望。 比亚…