Redis 集群原理、主从复制和哨兵模式的详细讲解
引言:本文记录了博主在学习Redis的过程中的原理,了解为什么使用与怎么样使用 Redis 集群,在使用 Redis 集群时出现的主从复制和哨兵模式的相关知识。本文并不涉及Redis安装。
文章目录
- 一、简单介绍什么是 Redis
- 二、为什么要使用 Redis 集群
- 三、常说的Redis节点是什么,在集群中扮演什么角色
- 四、Redis 集群实现主从复制
- 五、Redis 集群实现故障转移(哨兵模式)
一、简单介绍什么是 Redis
首先,Redis是一个很重要的工具,它的英文全称是 Remote Dictionary Server 意思是远程字典服务,是一个开源的、基于内存的高性能键值存储数据库,读取和写入速度远超于常见的数据库。
另外,它支持多种数据结构,支持类型十分广泛,如字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)以及范围查询、位图(bitmaps)、超日志(hyperloglogs)和地理空间索引等。
- 被用于高性能缓存(最常用)
- 作为缓存层,存储频繁访问的数据,减少对后端数据库的访问压力,从而提高系统的响应速度和吞吐量。
- 在Web应用中,将用户会话信息、热点数据(如商品详情、用户信息等)存储在Redis中,避免每次都查询数据库。
- 在后端的数据存储中,热点数据都可以存储在Redis中,提高访问速度,同时降低IO。
- 只要有关热点数据,那就和缓存有关,基本就和Redis有关。
- 消息队列
- 支持发布/订阅模式,可以作为消息队列使用,实现应用之间的异步通信。
- 并不常用,虽然说增加消息中间件会增加额外的开销,但是在大型项目中,常常有访问峰值的出现,Redis的抗并发能力到达阈值时,就会影响队列问题。所以常常做到分工明确对后面的开发和维护效果更好。
- 分布式锁
- 用于实现分布式环境下的锁机制,确保多个进程或线程在访问共享资源时的互斥性。
- 在分布式系统中,多个实例需要对某个资源进行写操作时,通过Redis锁确保同一时间只有一个实例可以操作。
- 排行榜和计数器
- 利用有序集合(Sorted Set)实现排行榜功能,对数据进行实时排序和计数。
- 在游戏或社交应用中,实时更新用户的积分排名或统计页面访问次数。
- 会话管理
- 存储用户会话信息,支持无状态的分布式应用。
- 在Web应用中,将用户登录状态、会话数据存储在Redis中,实现会话的快速读取和共享。
- 数据持久化
- 虽然Redis是基于内存的存储,但它支持多种持久化机制(如RDB和AOF),可以将数据持久化到磁盘,防止数据丢失。
- 在需要数据持久化的场景中,定期将内存中的数据保存到磁盘,确保系统故障时数据不丢失。
二、为什么要使用 Redis 集群
首先,项目随着业务的扩展,单个Redis实例可能无法满足高并发和大数据量的需求,需要更强大的缓存组件。其次,项目常会出现网络问题和宕机问题等,会导致服务重启,存储在Redis中的热点数据就会丢失,这就是常见的单点故障问题。
使用Redis集群会有以下优势:
- 水平扩展:通过将数据分散到多个Redis节点上,增加系统的存储容量和处理能力。因为Redis集群使用哈希槽(hash slot)机制,将数据分布到多个节点上。每个节点负责一部分哈希槽,从而实现数据的水平扩展。
- 高可用性:通过主从复制和故障转移机制,确保系统的高可用性。Redis集群支持主从复制,当主节点故障时,从节点可以自动晋升为主节点,继续提供服务。此外,集群还支持故障检测和自动故障转移。
- 负载均衡:通过将请求分散到多个节点上,减轻单个节点的负载压力,提高系统的整体性能。客户端根据哈希槽将请求发送到不同的节点,从而实现负载均衡。
- 容错能力:通过冗余机制,确保部分节点故障时系统仍然可以正常运行。每个节点都有多个副本(主从复制),当某个节点故障时,其他副本可以接管其职责,确保数据的可用性。
上面提到了一个关键词:节点,下面解释下什么是节点,在集群中节点如何分配。
三、常说的Redis节点是什么,在集群中扮演什么角色
在Redis集群中,节点(Node)是指运行Redis服务的实例,它是一个独立的Redis服务器进程。每个节点负责存储一部分数据实现数据的分布,并且可以与其他节点通信以实现数据的分布和高可用性。
知道了什么是节点,关于节点的作用有以下描述:
- 数据存储:每个节点负责存储一部分键值对数据。通过哈希槽机制,整个键空间被划分为16384个哈希槽,每个节点会被分配一定数量的哈希槽。例如,如果有3个节点的集群,每个节点可能会被分配大约5461个哈希槽(16384 / 3 ≈ 5461)。这个是关于Redis集群的设计,后面会继续介绍。
- 数据分片:节点通过哈希槽机制实现数据的分片。当一个键被写入或读取时,Redis会根据键的哈希值计算出对应的哈希槽,然后将请求路由到负责该哈希槽的节点上。例如,键
user:1可能被哈希到哈希槽1234,而哈希槽1234被分配给了节点A,那么对user:1的操作就会被发送到节点A。 - 主从复制:每个节点可以有多个从节点(Replica)。主节点(Master)负责处理写操作,从节点通过复制主节点的数据来保持数据一致性。从节点不仅可以提供读操作,还可以在主节点故障时接管主节点的角色,实现高可用性。
- 故障转移:当主节点故障时,从节点会自动晋升为主节点,继续提供服务。集群中的其他节点会通过 内部通信机制检测到故障并触发故障转移。例如,如果主节点A故障,其从节点B会根据哨兵模式的选举等发哪个时晋升为主节点,客户端的请求会被自动路由到新的主节点B。
- 通信与协调:节点之间通过内部通信机制(如Gossip协议)交换状态信息,包括节点的健康状态、哈希槽的分配情况等。这种通信机制确保了集群的高可用性和数据一致性。
在Redis集群中,节点可以分为两种类型:也就是主节点和从节点。主节点负责写操作和数据分片,从节点负责数据复制和故障转移。
- 主节点(Master Node):主节点负责处理写操作,并将数据同步到从节点。每个主节点负责一部分哈希槽,存储与这些哈希槽对应的键值对。
- 从节点(Replica Node):从节点是主节点的副本,通过复制主节点的数据来保持数据一致性。从节点可以提供读操作,减轻主节点的负载。从节点在主节点故障时可以晋升为主节点,实现故障转移。
假设你有一个Redis集群,包含3个主节点和3个从节点,每个主节点有1个从节点。以下是节点的分配和作用:
- 主节点A:
- 负责哈希槽范围:0-5460
- 从节点:从节点A1
- 主节点B:
- 负责哈希槽范围:5461-10922
- 从节点:从节点B1
- 主节点C:
- 负责哈希槽范围:10923-16383
- 从节点:从节点C1
当客户端请求键 user:1 时:Redis计算键 user:1 的哈希值,确定其对应的哈希槽为 1234 。根据哈希槽分配,哈希槽 1234 属于 主节点B 。客户端将请求发送到主节点B。如果主节点B故障,从节点B1 会自动晋升为主节点,继续提供服务。现在知道了节点在Redis集群中的作用,再进一步了解Redis集群的工作原理。
四、Redis 集群实现主从复制
上面讲到了Redis集群的主从复制的概念和原理,主从复制就是将主节点和从节点中的数据同步,实现主节点负责处理写操作,从节点负责处理读操作,从节点通过复制主节点的数据来保持数据一致性。
我们要知道为什么要做主从复制,也就是要知道主从复制的优势是什么。
- 数据容灾。从机作为主机的一个数据备份,当主机宕机后,从机能够快速的切换成主机,达到一个高可用的目的。
- 读写分离。主机负责写数据,从机负责读数据,提高
Redis的吞吐量,但是会发生数据一致性的问题,毕竟主从同步数据需要时间。
需要注意的是:
- 当
Redis搭建主从后,从机就只能读数据,不能去写数据了,写的话会报错。 - 单纯的搭建
Redis主从,不能实现主从的切换,也就是主机宕机后,从机还是从机,要想实现主从切换,必须引用Redis的哨兵机制。
下面通过图片解释,图片是百度搜索,找了两张,懒得自己画,看着不错就用了,如有侵权请联系。


如上图所示:我们跟着步骤来了解主从复制的原理:这张图展示了Redis主从实例之间的数据同步过程,具体如下:
首先两个实例:主实例和从实例IP地址信息,这个不多说。
第一阶段:建立连接,协商同步,为了全量复制做准备
- 从实例在配置完启动后,会根据配置的主机的
ip:port去ping主机,看能不能ping通,建立一个socket通道。期间也会不断的进行心跳检测,保证二者实时感应到的。 - 从实例执行
replicaof 192.168.1.100 6379或slaveof 172.16.19.3 6379命令(),向主实例发起连接请求。 Redis在5.0.0版本之前使用slaveof命令进行主从复制相关操作,从5.0.0版本开始使用replicaof命令替代slaveof命令,二者功能基本相同,主要用于设置一个 Redis 实例成为另一个实例的从节点,实现主从复制。避免存在歧视的问题。- 连接请求就是从实例发送
psync ? -1命令,请求进行数据同步。 psync:包含两个参数,分别是主服务器的runID和复制进度offset。runID:每个 Redis 服务器在启动时会自动生成随机 ID 来唯一标识,第一次同步时,主从信息未知,所以设置为?。offset:表示复制的进度,第一次同步时,其值为 -1。- 主实例收到连接诶请求后会回复
+FULLRESYNC {runID} {offset},告知从实例将进行全量同步,并提供主实例的runID和复制进度offset,从服务器收到响应后,会记录这两个值。 FULLRESYNC:响应命令是采用全量复制的方式,主服务器会把所有的数据都同步给从服务器。
第二阶段:主库同步数据给从库
- 主实例执行
bgsave命令,在后台生成RDB文件,这是对当前数据库状态的快照,然后把文件发送给从服务器。 - 主服务器生成
RDB这个过程是不会阻塞主线程,Redis 依然可以正常处理命令,不会出现性能影响。 - 从实例接收到
RDB文件后,先清空现有数据,然后加载RDB文件,将主实例的数据库状态同步过来。 - 在从实例加载文件的期间,主实例写操作命令记录的数据就不会同步,主从服务器间的数据就不一致了。
- 为了保证主从服务器的数据一致性,主服务器会将在
RDB文件生成后收到的写操作命令,写入到replication buffer缓冲区。
第三阶段:主库发送新写命令给从库
- 主实例在生成
RDB文件期间,新的写命令会被存储在replication buffer复制缓冲区中。 - 主实例将
replication buffer中的写命令发送给从实例,从实例加载replication buffer中的写命令,以确保与主实例的数据最终一致。
至此,主从服务器的第一次同步的工作就完成了。
五、Redis 集群实现故障转移(哨兵模式)
Redis集群实现故障转移一般通过哨兵(Sentinel)机制,哨兵机制是来监控我们的 Redis 主从服务,当发现主从服务出现问题,比如主机下线了或宕机,它就会将其他的从机扶持成主机,达到系统正常运行的效果。一般而言,常用多个实例来组成 sentinel 哨兵集群来监视一组的一主多从或者是多组的一主多从。
哨兵模式遵循自己的选举机制和过半原则,只有当一半以上的 sentinel 认为某台机器出问题了,这个决议才会被通过,然后进行之后的操作。如果集群任意主节点挂掉,且当前主节点没有从节点,集群进入 fail 状态,如果集群超过半数以上主节点挂掉,无论是否有从节点,集群直接进入 fail 状态。
步骤如下图所示:图片是百度所查,如有侵权,请联系。

1、前期准备工作
- 配置主从复制:在每个Redis节点的配置文件
redis.conf中设置节点角色和复制关系。例如有节点1(IP为192.168.1.10),节点2、3、4(从节点)。 - 配置主节点配置文件中
replicaof no one并设置密码等,从节点配置replicaof 192.168.1.10 6379指定主节点IP和端口。 - 配置 Sentinel 监控:在任意 Redis 节点创建 Sentinel 配置文件
sentinel.conf。 - Sentinel 是一个特殊的 Redis 服务器,不会去进行持久化,Sentinel 实例启动后,每个 Sentinel 会创建2个连向主服务器的网络连接。
- 命令连接:用于向主服务器发送命令,并接收响应。
- 订阅连接:用于订阅主服务器的一个
sentinel:hello频道。
- 获取主节点信息:Sentinel 默认每10秒一次,向被监控的主节点发送
info命令,获取主节点和其下属从节点的信息。 - 获取从节点信息:当 Sentinel 发现主节点有新的从节点出现时,Sentinel 还会向从节点建立命令连接,当命令连接建立之后,Sentinel 还是会默认
10s一次,向从节点发送info命令,并记录从节点的信息。 sentinel monitor mymaster 192.168.1.10 6379 2表示监控名为mymaster的主节点。sentinel auth - pass mymaster your_master_password配置主节点密码。
2、故障检测
- 当 Sentinel 与主节点或从节点建立起订阅连接之后,Sentinel 就会通过订阅连接,向节点发送以下命令:
subscribe —sentinel—:hello - Sentinel 彼此之间只创建命令连接,而不创建订阅连接。通过订阅节点,就能感知到新的 Sentinel 的加入。
- 检测主观下线状态
SDOWN:- Sentinel 每2秒一次,向所有被监视的主节点和从节点所订阅的
sentinel:hello频道上发送PING命令消息,消息会携带 Sentinel 自身的信息和主节点的信息,也会向其他 Sentinel 发送PING命令消息。 - 当在
sentinel down - after - milliseconds mymaster设置的毫秒时间内返回除了+PONG、-LOADING、-MASTERDOWN的无效回复或者超时无回复,未收到主节点的PONG响应,单个 Sentinel 会先认为该主节点主观下线SDOWN。
- Sentinel 每2秒一次,向所有被监视的主节点和从节点所订阅的
- 检查客观下线状态
ODOWN:- 当一个 Sentinel 将一个主节点判断为主观下线后,Sentinel 会向同时监控这个主节点的所有其他 Sentinel 发送查询命令。
- 当同意主节点下线的 Sentinel 数量达到配置的最小选举数量,如上述配置中的2,则认为主节点客观下线
ODOWN。
3、故障转移选举
- 在认定主节点客观下线后,Sentinel 会进行故障转移选举。它会将失效主节点中的一个从节点升级为新的主节点,并让失效主节点的其他从节点改为复制新的主节点。
- 当客户端试图连接失效的主节点时,集群也会向客户端返回新主节点的地址,集群使用新主节点替换失效主节点。
- 主节点和从节点切换后,主节点的
redis.conf和从节点的redis.conf和sentinel.conf的配置文件的内容都会发生相应的改变。即从节点的配置文件中会有replicaof的配置,Sentinel 的监控目标也会调换。
4、选举规则
- 首先过滤掉主观下线的节点,先选举
Leader Sentinel,当一个主节点被判定为客观下线后,监视这个主节点的所有 Sentinel 会通过选举算法raft,选出一个Leader Sentinel去执行failover故障转移操作。 - 先看优先级,选
优先级最高的从节点,可在从节点配置slave - priority设置优先级,值越小优先级越高。 - 若优先级相同,会选择
复制偏移量最大(数据最完整)的从节点,复制偏移量越大则表示数据复制的越完整。 - 若仍相同,会根据节点的
runID选择,因为 ID 越小说明重启次数越少。
5、更新从节点配置
- 新主节点选出后,Sentinel 会将新主节点信息更新到所有从节点的配置文件中,从节点配置文件中的
replicaof配置会修改为新主节点的IP和端口。
6、重启从节点
- 从节点配置更新后,需重启每个从节点(执行
redis - server redis.conf),使其连接到新的主节点,至此完成故障转移,集群恢复正常服务能力。
至此,完成了故障转移。
本文参考:
1、Redis三主三从集群搭建(三台机器)
2、浅谈:redis的主从复制 + 哨兵模式
3、Redis缓存哨兵机制的基本流程
4、Redis 主从复制
相关文章:
Redis 集群原理、主从复制和哨兵模式的详细讲解
引言:本文记录了博主在学习Redis的过程中的原理,了解为什么使用与怎么样使用 Redis 集群,在使用 Redis 集群时出现的主从复制和哨兵模式的相关知识。本文并不涉及Redis安装。 文章目录 一、简单介绍什么是 Redis二、为什么要使用 Redis 集群三…...
基于Java的远程视频会议系统(源码+系统+论文)
第一章 概述 1.1 本课题的研究背景 随着人们对视频和音频信息的需求愈来愈强烈,追求远距离的视音频的同步交互成为新的时尚。近些年来,依托计算机技术、通信技术和网络条件的发展,集音频、视频、图像、文字、数据为一体的多媒体信息ÿ…...
springboot 事务管理
在Spring Boot中,事务管理是通过Spring框架的事务管理模块来实现的。Spring提供了声明式事务管理和编程式事务管理两种方式。通常,我们使用声明式事务管理,因为它更简洁且易于维护。 1. 声明式事务管理 声明式事务管理是通过注解来实现的。…...
深度学习-神经机器翻译模型
以下为你介绍使用Python和深度学习框架Keras(基于TensorFlow后端)实现一个简单的神经机器翻译模型的详细步骤和代码示例,该示例主要处理英 - 法翻译任务。 1. 安装必要的库 首先,确保你已经安装了以下库: pip insta…...
.NET周刊【2月第1期 2025-02-02】
国内文章 dotnet 9 已知问题 默认开启 CET 导致进程崩溃 https://www.cnblogs.com/lindexi/p/18700406 本文记录 dotnet 9 的一个已知且当前已修问题。默认开启 CET 导致一些模块执行时触发崩溃。 dotnet 使用 ColorCode 做代码着色器 https://www.cnblogs.com/lindexi/p/…...
【合集】Java进阶——Java深入学习的笔记汇总 amp; 再论面向对象、数据结构和算法、JVM底层、多线程
前言 spring作为主流的 Java Web 开发的开源框架,是Java 世界最为成功的框架,持续不断深入认识spring框架是Java程序员不变的追求;而spring的底层其实就是Java,因此,深入学习Spring和深入学习Java是硬币的正反面&…...
GPU、CUDA 和 cuDNN 学习研究【笔记】
分享自己在入门显存优化时看过的一些关于 GPU 和 CUDA 和 cuDNN 的网络资料。 更多内容见: Ubuntu 22.04 LTS 安装 PyTorch CUDA 深度学习环境-CSDN博客CUDA 计算平台 & CUDA 兼容性【笔记】-CSDN博客 文章目录 GPUCUDACUDA Toolkit都包含什么?NVID…...
【5】阿里面试题整理
[1]. 介绍一下ZooKeeper ZooKeeper是一个开源的分布式协调服务,核心功能是通过树形数据模型(ZNode)和Watch机制,解决分布式系统的一致性问题。 它使用ZAB协议保障数据一致性,典型场景包括分布式锁、配置管理和服务注…...
计算机毕业设计hadoop+spark+hive物流预测系统 物流大数据分析平台 物流信息爬虫 物流大数据 机器学习 深度学习
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
Wpf美化按钮,输入框,下拉框,dataGrid
Wpf美化按钮,输入框,下拉框,dataGrid 引用代码后 引用资源 <ControlTemplate x:Key"CustomProgressBarTemplate" TargetType"ProgressBar"><Grid><Border x:Name"PART_Track" CornerRadius&q…...
搜索插入位置:二分查找的巧妙应用
问题描述 给定一个已排序的整数数组 nums 和一个目标值 target,要求在数组中找到目标值并返回其索引。如果目标值不存在于数组中,则返回它按顺序插入的位置。必须使用时间复杂度为 O(log n) 的算法。 示例: 示例1: 输入: nums …...
Cocos2d-x 游戏开发-打包apk被默认自带了很多不必要的权限导致apk被报毒,如何在Cocos 2d-x中强制去掉不必要的权限-优雅草卓伊凡
Cocos2d-x 游戏开发-打包apk被默认自带了很多不必要的权限导致apk被报毒,如何在Cocos 2d-x中强制去掉不必要的权限-优雅草卓伊凡 实战操作 去除权限 要在 Cocos2d-x 开发的游戏中去掉 APK 自带权限,可以按照以下步骤操作: 编辑 AndroidMa…...
自动化xpath定位元素(附几款浏览器xpath插件)
在 Web 自动化测试、数据采集、前端调试中,XPath 仍然是不可或缺的技能。虽然 CSS 选择器越来越强大,但面对复杂 DOM 结构时,XPath 仍然更具灵活性。因此,掌握 XPath,不仅能提高自动化测试的稳定性,还能在爬…...
String类(6)
大家好,今天我们继续来学习一下String类的查找方法,主要是反向查找的一些方法。 ⭐️从后往前找一样的道理,如果找到了就返回对应字符的下标. 如果后面有对应的字符,则会返回第一个遇到的字符下标. ⭐️注意一下传入字符串的找法…...
动态表格html
题目: 要求: 1.表格由专业班级学号1-10号同学的信息组成,包括:学号、姓 名、性别、二级学院、班级、专业、辅导员; 2.表格的奇数行字体为黑色,底色为白色;偶数行字体为白色,底 色为黑…...
ZU47DR 100G光纤 高性能板卡
简介 2347DR是一款最大可提供8路ADC接收和8路DAC发射通道的高性能板卡。板卡选用高性价比的Xilinx的Zynq UltraScale RFSoC系列中XCZU47DR-FFVE1156作为处理芯片(管脚可以兼容XCZU48DR-FFVE1156,主要差别在有无FEC(信道纠错编解码࿰…...
mysql8.0使用pxc实现高可用
环境准备 准备三台虚拟机,其对应的主机名和IP地址为 pxc-1192.168.190.129pxc-2192.168.190.133pxc-3192.168.190.134 解析,都要做解析 测试 下载pxc的安装包, 官网:https://www.percona.com/downloads 选择8.0的版本并下载,…...
Kotlin 使用 Chrome 无头浏览器
1. 概念 无头浏览器在类似于流行网络浏览器的环境中提供对网页的自动控制,但是通过命令行界面或使用网络通信来执行。 它们对于测试网页特别有用,因为它们能够像浏览器一样呈现和理解超文本标记语言,包括页面布局、颜色、字体选择以及JavaSc…...
Arbess基础教程-创建流水线
Arbess(谐音阿尔卑斯) 是一款开源免费的 CI/CD 工具,本文将介绍如何使用 Arbess 配置你的第一条流水线,以快速入门上手。 1. 创建流水线 根据不同需求来创建不同的流水线。 1.1 配置基本信息 配置流水线的基本信息,如分组,环境&…...
vscode安装ESP-IDF
引言 ESP-IDF(Espressif IoT Development Framework)是乐鑫官方为其 ESP32、ESP32-S 系列等芯片提供的物联网开发框架。结合 Visual Studio Code(VSCode)这一强大的开源代码编辑器,能极大提升开发效率。本教程将详细介…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...
Rust 开发环境搭建
环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu 2、Hello World fn main() { println…...
基于江科大stm32屏幕驱动,实现OLED多级菜单(动画效果),结构体链表实现(独创源码)
引言 在嵌入式系统中,用户界面的设计往往直接影响到用户体验。本文将以STM32微控制器和OLED显示屏为例,介绍如何实现一个多级菜单系统。该系统支持用户通过按键导航菜单,执行相应操作,并提供平滑的滚动动画效果。 本文设计了一个…...
