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

Redis主从复制:告别单身Redis!

在这里插入图片描述

目录

    • 一、 为什么需要主从复制?🤔
    • 二、 如何搭建主从架构?
      • 前提条件✅
      • 步骤
        • 📁 创建工作目录
        • 📜 创建 Docker Compose 配置文件
        • 🚀 启动所有 Redis
        • 🔍 验证主从状态
      • 💡 重要提示和后续改进
    • 三、 主从复制的数据同步原理是什么?
    • 四、 主从复制的优缺点是什么?
    • 五、 总结

🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!

🌟了解 缓存雪崩、穿透、击穿 请看 : 缓存雪崩、穿透、击穿:别让你的数据库“压力山大”!

其他优质专栏: 【🎇SpringBoot】【🎉多线程】【🎨Redis】【✨设计模式专栏(已完结)】…等

如果喜欢作者的讲解方式,可以点赞收藏加关注,你的支持就是我的动力
✨更多文章请看个人主页: 码熔burning


Redis主从复制,可以把它想象成一个“跟班”系统

  • Master (主节点):就是“大哥” ,所有的事情(写数据📝、改数据✏️)都由他说了算,他手里有最新的、最全的信息(数据)。
  • Slave (从节点):就是“小弟”或“跟班” ,他们不直接干活(默认不能写数据),主要任务就是时刻盯着大哥 👀,大哥做了什么,他们就跟着学(复制数据🔄),保持和大哥信息同步。
    在这里插入图片描述

一、 为什么需要主从复制?🤔

主要有这么几个原因:

  • a. 数据备份与高可用 (大哥万一出事了 💀,有人顶上 💪)

    • 备份:小弟手里有大哥数据的完整副本 📑。万一大哥突然“挂了”(服务器宕机、硬盘坏了),数据不会完全丢失,至少小弟那里还有一份。
    • 高可用:如果大哥真的出事了,我们可以快速“提拔”一个小弟当新大哥(这个过程叫“故障转移”,通常需要配合哨兵模式或集群模式自动完成 ✨),保证服务能快速恢复,不会停太久。
  • b. 读写分离,提升性能 (大哥太忙 🥵,小弟分担点任务 🤝)

    • 在一个系统中,“读”数据的操作往往比“写”数据的操作多得多。
    • 如果所有读写请求都压在大哥一个人身上,他可能会累垮(性能瓶颈 🏺)。
    • 有了小弟后,可以让大哥专门处理“写”请求和少量的“读”请求,而把大量的“读”请求分流给各个小弟去处理。这样大家分工合作,整个系统的处理能力就上去了 🚀,响应速度也更快 ⚡。这就像大哥负责决策和发布命令,小弟们负责对外宣传和解答疑问。
  • c. 负载均衡 (分摊压力 ⚖️)

    • 和读写分离类似,多个小弟可以分摊读请求的压力,避免所有读请求都集中在一台服务器上。

二、 如何搭建主从架构?

下面是使用一台 Linux 服务器和 Docker 技术搭建 Redis 一主二从(Master-Slave)复制结构的步骤。我们将使用 Docker Compose 来简化管理。

前提条件✅

  1. 拥有一台 Linux 服务器 🖥️。
  2. 服务器上已安装 Docker 和 Docker Compose 🐳(这里就不演示了,自行查找教程安装)。
  3. 安装完成之后,使用 docker pull redis 来拉去最新的redis的镜像。

步骤

📁 创建工作目录

在你的服务器上选择一个合适的位置,创建一个用于存放配置文件的目录。

 mkdir redis-clustercd redis-cluster
📜 创建 Docker Compose 配置文件

redis-cluster 目录下创建一个名为 docker-compose.yml 的文件,并填入以下内容:

services:redis-master:image: redis:latest # 或者指定具体版本, 如 redis:7.2container_name: redis-masterports:- "6379:6379" # 将主节点的 6379 端口映射到宿主机的 6379 端口networks:- redis-net# 可以添加 volumes 实现数据持久化 (可选) 💾# volumes:#   - ./master-data:/data#   - ./master-redis.conf:/usr/local/etc/redis/redis.conf # 如果需要自定义配置# command: redis-server /usr/local/etc/redis/redis.conf # 如果使用了自定义配置redis-slave1:image: redis:latestcontainer_name: redis-slave1ports:- "6380:6379" # 将第一个从节点的 6379 端口映射到宿主机的 6380 端口networks:- redis-netcommand: redis-server --slaveof redis-master 6379 # 🔑 指定主节点地址和端口depends_on:- redis-master # 确保主节点先启动# 可以添加 volumes 实现数据持久化 (可选) 💾# volumes:#   - ./slave1-data:/data#   - ./slave1-redis.conf:/usr/local/etc/redis/redis.conf# command: redis-server /usr/local/etc/redis/redis.conf --slaveof redis-master 6379redis-slave2:image: redis:latestcontainer_name: redis-slave2ports:- "6381:6379" # 将第二个从节点的 6379 端口映射到宿主机的 6381 端口networks:- redis-netcommand: redis-server --slaveof redis-master 6379 # 🔑 指定主节点地址和端口depends_on:- redis-master # 确保主节点先启动# 可以添加 volumes 实现数据持久化 (可选) 💾# volumes:#   - ./slave2-data:/data#   - ./slave2-redis.conf:/usr/local/etc/redis/redis.conf# command: redis-server /usr/local/etc/redis/redis.conf --slaveof redis-master 6379networks:redis-net:driver: bridge # 创建一个桥接网络供容器间通信

配置说明:

  • services: 定义了三个服务(容器):redis-master, redis-slave1, redis-slave2
  • image: redis:latest: 指定使用最新的官方 Redis 镜像。建议在生产环境中使用具体的版本号(如 redis:7.2)。
  • container_name: 为容器指定一个易于识别的名称。
  • ports: 将容器的 6379 端口映射到宿主机的不同端口。redis-master 映射到 6379,redis-slave1 映射到 6380,redis-slave2 映射到 6381。这样你可以在宿主机上通过不同端口访问它们。
  • networks: - redis-net: 将所有容器连接到名为 redis-net 的自定义 Docker 网络。这使得容器可以通过容器名称(redis-master, redis-slave1, redis-slave2)相互通信。
  • command: redis-server --slaveof redis-master 6379 🔑: 这是关键配置。它告诉 redis-slave1redis-slave2 容器启动时,连接到名为 redis-master 的容器的 6379 端口,并成为它的从节点。
  • depends_on: - redis-master: 确保从节点容器在主节点容器启动之后再启动。
  • networks: redis-net: driver: bridge: 定义了一个名为 redis-net 的自定义桥接网络。
  • volumes (注释掉的部分) 💾: 如果需要数据持久化(即使容器停止或删除,数据也不会丢失),取消这些行的注释。
    • ./master-data:/data:将宿主机当前目录下的 master-data 文件夹挂载到 redis-master 容器内的 /data 目录(Redis 默认数据存储目录)。你需要手动创建 master-data, slave1-data, slave2-data 目录。
    • ./master-redis.conf:/usr/local/etc/redis/redis.conf:如果你需要更复杂的 Redis 配置(如设置密码 requirepassmasterauth,修改 RDB/AOF 配置等),可以创建一个 redis.conf 文件,并将其挂载到容器内。如果挂载了自定义配置文件,通常需要修改 command 来指定加载该配置文件。
🚀 启动所有 Redis

redis-cluster 目录下(包含 docker-compose.yml 文件的目录),运行以下命令:

# 启动容器并在后台运行
docker compose up -d
# 如果你的 docker compose 不是插件形式,可能是 docker-compose up -d

在这里插入图片描述

Docker Compose 会根据 `docker-compose.yml` 文件创建并启动三个 Redis 容器。`-d` 参数表示在后台(detached mode)运行。
🔍 验证主从状态
  • 查看容器状态:

    docker compose ps
    # 或者 docker ps
    

    在这里插入图片描述

    你应该能看到 redis-master, redis-slave1, redis-slave2 三个容器正在运行 (State 为 Up)。✅

  • 检查主节点信息:
    连接到主节点容器并查看复制信息。

    docker exec -it redis-master redis-cli
    

    进入 redis-cli 后,输入:

    INFO replication
    

    在这里插入图片描述

    在输出中查找:

    • role:master ✅:确认它是主节点。
    • connected_slaves:2 ✅:确认有两个从节点连接。
    • 下面会列出两个 slave 的信息(IP、端口、状态等)。
  • 检查从节点信息:
    连接到任意一个从节点容器(例如 redis-slave1)并查看复制信息。

    docker exec -it redis-slave1 redis-cli
    

    进入 redis-cli 后,输入:

    INFO replication
    

    在这里插入图片描述

    在输出中查找:

    • role:slave ✅:确认它是从节点。
    • master_host:redis-master ✅:确认主节点的主机名正确。
    • master_port:6379 ✅:确认主节点的端口正确。
    • master_link_status:up ✅:确认与主节点的连接正常。
  • ➡️ 测试数据同步:

    1. 主节点 (redis-master) 的 redis-cli 中设置一个键值对:
      SET mykey "hello world from master! 👋"
      
      应该返回 OK
    2. 从节点 (redis-slave1redis-slave2) 的 redis-cli 中获取这个键的值:
      GET mykey
      
      应该能成功返回 "hello world from master! 👋"。这表明数据已从主节点同步到从节点 🎉。
      在这里插入图片描述

🛑 停止和清理 (如果需要):
如果你想停止并删除这些容器、网络,可以在 redis-cluster 目录下运行:

docker compose down

如果使用了挂载卷(volumes)并且想删除数据,可以添加 -v 选项:

docker compose down -v # 这个会把数据也删掉哦,请小心!

💡 重要提示和后续改进

  • 数据持久化: 上面的示例默认没有启用持久化。对于生产环境,强烈建议通过挂载 volumes 💾 来持久化 /data 目录,并可能需要配置 RDB 快照或 AOF 日志。
  • 安全性: 示例没有设置密码 🔑。在生产环境中,务必为主节点设置 requirepass,并为从节点设置 masterauth 来连接到需要密码的主节点。这需要在自定义的 redis.conf 文件中配置,并通过 volumes 挂载进去,同时修改 command 以加载配置文件。
  • 高可用: 这个设置只是主从复制,如果主节点宕机 💥,从节点不会自动提升为主节点。你需要手动处理故障转移,或者使用 Redis Sentinel(哨兵模式)或 Redis Cluster(集群模式)来实现自动故障转移和更高可用性。
  • 资源限制: 在生产环境中,你可能需要为每个 Redis 容器设置 CPU 和内存限制 ⚖️,以防止它们消耗过多服务器资源。这可以在 docker-compose.yml 文件的服务定义中通过 deploy -> resources -> limits 来配置。
  • 监控: 部署后,需要建立监控机制 📊 来跟踪 Redis 实例的健康状况、内存使用、连接数和复制延迟等。

这样,你就成功地在一台 Linux 服务器上使用 Docker 搭建了一个 Redis 一主二从的复制结构啦!👍


三、 主从复制的数据同步原理是什么?

这个过程分为两个阶段:

  • a. 首次连接/全量复制 (小弟刚入门,大哥先给一本完整的秘籍 📖)

    1. 握手 🤝:小弟启动后,会主动向大哥发送一个 PSYNC (或者旧版的 SYNC) 命令,告诉大哥:“大哥,我是新来的(或者断线重连的),我想跟你混,告诉我你的ID和现在的数据进度(偏移量)”。
    2. 大哥准备:大哥收到后,会执行一个 BGSAVE 命令,在后台生成一个当前数据的快照(RDB文件)📸。这就像大哥把目前所有的武功秘籍复印一份。
    3. 缓冲命令 ⏳:在生成快照期间,大哥如果又收到了新的写命令(比如又学了新招式),会先把这些新命令缓存起来,不立刻发给这个正在等待快照的小弟。
    4. 发送快照 📤📁:大哥把生成的RDB快照文件发给小弟。
    5. 小弟加载 📥⏳:小弟收到快照文件后,会清空自己原来的旧数据(如果有的话),然后加载这个RDB文件,这样小弟的数据就和大哥生成快照那个时间点完全一致了。
    6. 发送缓冲命令 📨:大哥把在生成快照期间缓存起来的新命令,再发给小弟。小弟执行这些命令,追上大哥最新的状态。
    7. 完成 👍✅:至此,小弟的数据就和大哥完全同步了。这个过程叫“全量复制”。
  • b. 持续同步/增量复制 (入门后,大哥有新招式随时教 🏃‍♂️💨)

    • 全量复制完成后,大哥每次执行一个“写”命令(如 SET, DEL, INCR 等),都会把这个命令实时地、异步地发送给所有跟着他的小弟 📡。
    • 小弟收到命令后,就在自己这边也执行一遍同样的命令,从而保持和大哥的数据一致。
    • 这个过程是持续不断的,只要主从连接正常,大哥一有动作,小弟马上跟着学。
  • 断线重连优化 (小弟临时掉线了怎么办?🔗❓)

    • Redis 2.8 版本之后引入了 PSYNC 命令,支持部分重同步(Partial Resynchronization)
    • 大哥会维护一个“复制积压缓冲区”(Replication Backlog),这是一个固定大小的队列,记录了最近发送给小弟们的命令。
    • 如果小弟只是短暂断线(比如网络抖动),重连时,小弟会告诉大哥自己断线前的“进度”(复制偏移量 offset)。
    • 大哥检查这个进度,如果在自己的积压缓冲区里还能找到小弟断线后产生的所有新命令,那么大哥就只把这些增量的命令发给小弟 🩹➡️。小弟执行完就追上了。这样就避免了代价很高的全量复制。
    • 如果小弟断线时间太长,或者积压缓冲区太小,大哥找不到小弟需要的增量信息了,那就只能辛苦一点 😥,再来一次全量复制 🏋️‍♀️。

四、 主从复制的优缺点是什么?

  • 优点 (好处 👍)

    • 高可用性基础 🛡️:是Redis Sentinel(哨兵)和 Redis Cluster(集群)实现自动故障转移和高可用的基石。
    • 读扩展性好 📈:可以通过增加Slave节点来线性地扩展系统的读性能。
    • 数据冗余 📑:提供了数据的热备份。
  • 缺点 (不足之处 👎)

    • 写能力无扩展 ✍️➡️:所有写操作都必须经过Master,Master的写压力无法通过增加Slave来分摊。单点写性能瓶颈 🏺。
    • 主节点故障问题 (若无哨兵等机制) ⚠️:如果Master宕机,需要手动将一个Slave提升为新的Master,并且通知应用切换连接,这期间服务会中断。需要配合哨兵或集群才能实现自动故障恢复。
    • 数据一致性问题 ⏰:主从复制是异步的。命令从Master发送到Slave需要时间,Slave执行也需要时间。所以在极短的时间窗口内,Slave的数据可能稍微落后于Master(比如Master刚写完一个值,还没来得及传给Slave,这时去Slave读可能读到旧值)。这叫最终一致性,对于要求强一致性的场景可能有影响。
    • 全量复制开销 🏋️‍♀️💸:首次连接或断线重连时间过长导致的全量复制,会对Master造成CPU、内存和网络带宽的压力,尤其是在数据量大的情况下。

五、 总结

Redis主从复制就是找一堆小弟(Slaves)跟着大哥(Master)学习。好处是大哥倒了有人顶上(高可用备份 💪),人多力量大能帮大哥分担读数据的活儿(读写分离/负载均衡 🤝🚀)。搭建起来就是在小弟的配置文件里写上大哥的地址和密码 ⚙️🔑。同步原理是,新来的小弟先拿一份大哥的完整笔记(全量复制 📸➡️📖),之后大哥有新动作就实时通知小弟们跟着做(增量复制 🏃‍♂️💨)。缺点是写操作还得大哥一个人扛 ✍️➡️,大哥真挂了得有人手动扶小弟上位(除非有哨兵帮忙 ⚠️),而且小弟学东西总会慢半拍(数据有延迟 ⏰)。

相关文章:

Redis主从复制:告别单身Redis!

目录 一、 为什么需要主从复制?🤔二、 如何搭建主从架构?前提条件✅步骤📁 创建工作目录📜 创建 Docker Compose 配置文件🚀 启动所有 Redis🔍 验证主从状态 💡 重要提示和后续改进 …...

PHP:将关联数组转换为索引数组的完整示例

处理之前的数据 头和行在一起显示 // 执行SQL查询后的原始数据(假设查询返回3条记录) $rawData [[wip_entity_name > JOB001,primary_item > ITEM001,primary_name > 主产品1,primary_desc > 主产品描述1,start_quantity > 100,quanti…...

27.[2019红帽杯]easyRE1(保姆教程)

收到文件,.elf 文件,ExeinfoPE查看一下基础信息。无壳,64bit。 把文件拖入IDA工具,查看一下。 点击关键字,ctrl x 交叉搜索一下位置,跟进,顺便菜单左侧 Edit --> Plugins--> findcrypt …...

【Redis】Redis实现分布式锁

1. 基于Redis 1.1 加锁 setnx lockKey uniqueValue1.2 解锁 基于Lua脚本保证解锁的原子性。Redis在执行Lua脚本时,可以以原子性的方式执行,确保原子性。 if redis.call("get", keys[1]) argv[1] then return redis.call("del", …...

AI大模型底层技术——Scaling Law

0. 定义 Scaling Law 是描述 AI 模型性能随关键因素(如参数量、数据量、计算量)增长而变化的数学规律,通常表现为幂律关系。 历史里程碑: **OpenAI 2020 年论文首次系统提出语言模型的缩放定律**DeepMind、Google 等机构后续发表…...

Spring MVC 国际化机制详解(MessageSource 接口体系)

Spring MVC 国际化机制详解(MessageSource 接口体系) 1. 核心接口与实现类详解 接口/类名描述功能特性适用场景MessageSource核心接口,定义消息解析能力支持参数化消息(如{0}占位符)所有国际化场景的基础接口Resource…...

java学习笔记13——IO流

File 类的使用 常用构造器 路径分隔符 常用方法 File类的获取功能和重命名功能 File 类的判断功能 File类的创建功能和删除功能 File 类的使用 总结: 1.File类的理解 > File类位于java.io包下,本章中涉及到的相关流也都声明在java.io包下 > File…...

防DDoS流量清洗核心机制解析

本文深度剖析DDoS流量清洗技术演进路径,揭示混合云清洗系统的四层过滤架构,结合2023年新型反射攻击案例,提出基于AI行为分析的动态防御策略。通过Gartner最新攻防效能数据与金融行业实战方案,阐明流量清洗系统在误判率、清洗延迟、…...

边缘计算革命:低功耗GPU在自动驾驶实时决策中的应用

边缘计算革命:低功耗GPU在自动驾驶实时决策中的应用 ——分析NVIDIA Jetson与华为昇腾的嵌入式方案差异 一、自动驾驶的实时决策挑战与边缘计算需求 自动驾驶系统需在30ms内完成环境感知、路径规划与车辆控制的全流程闭环‌。传统云端计算受限于网络延迟&#xf…...

ubuntu24.04-MyEclipse的项目导入到 IDEA中

用myeclipse创建的一个web项目, jdk1.7,tomcat7,mysql8.0,导入到idea项目中 1.导入现有项目 1.打开IDEA,选择“Import Project”进入下一步 2.选择所需要导入的项目,点击“OK” 3.点击创建一个新的项目,然后下一步 4.直接点…...

基于SpringBoot的律师事务所案件管理系统【附源码】

基于SpringBoot的律师事务所案件管理系统(源码L文说明文档) 目录 4 系统设计 4.1界面设计原则 4.2功能结构设计 4.3数据库设计 4.3.1属性图 4.3.2 数据库物理设计 5 系统实现 5.1客户信息管理 5.2 律师…...

电力网关:推动电力物联网及电力通信系统革新

在“双碳”目标与新型电力系统建设的背景下,电力行业正加速向数字化、智能化、绿色化转型。作为国内领先的电力物联网解决方案提供商,厦门计讯物联科技有限公司(以下简称“计讯物联”)依托自主研发的电力专用网关、边缘计算平台及…...

Android系统的Wi-Fi系统框架和详细启动流程

目录 一、前言 二、系统架构层次 ‌1、应用层‌ ‌2、Framework层‌ 3‌、HAL层‌ ‌4、驱动层‌ 三、Wi-Fi 目录树结构 四、系统流程 1、应用层请求 2、Wi-Fi管理服务处理 3、硬件交互 4、数据处理与事件通知 5.连接管理 6.状态维护 五、WiFi启动流程及函数调用…...

Scala基础知识8

集合计算高级函数 包括过滤、转换或映射、扁平化、扁平化加映射、分组、简化(归约),折叠 过滤:遍历一个集合并从中获取满足指定条件的元素组成一个新的集合。 转换或映射:将原始集合中的元素映射到某个函数中。 扁平化:取消嵌套格式&…...

SwiftUI 本地推送(Local Notification)教程目录

1. 本地推送简介 1.1 什么是本地推送?1.2 本地推送的应用场景(提醒、定时任务、用户交互等)1.3 本地推送与远程推送的区别 2. 前提条件 2.1 开发环境要求(Xcode 13、iOS 15)2.2 需要的基础知识(SwiftUI …...

大数据技术与Scala

集合高级函数 过滤 通过条件筛选集合元素,返回新集合。 映射 对每个元素应用函数,生成新集集合 扁平化 将嵌套集合展平为单层集合。 扁平化映射 先映射后展平,常用于拆分字符串。 分组 按规则将元素分组为Map结构。 归约 …...

golang通过飞书邮件服务API发送邮件功能详解

一.需求 需要实现通过飞书邮件服务API发送邮件验证码功能:用户输入邮箱, 点击发送邮件,然后发送邮件验证码, 这里验证码有过期时间, 保存到redis缓存中 二.实现 实现的部分代码如下: 控制器部分代码 // 发送邮件控制器 func EmailSendController(userId uint64, m proto.Messa…...

BoostSearch搜索引擎项目 —— 测试用例设计 + web自动化测试代码

web自动化代码: https://gitee.com/chicken-c/boost-search/tree/master/AutoTest...

MySQL学习笔记集--触发器

触发器 MySQL触发器(Trigger)是一种特殊的存储过程,它在指定的数据库表上指定的事件(INSERT、UPDATE、DELETE)之前或之后自动执行。触发器可以用来强制执行复杂的业务逻辑、数据完整性规则、自动更新数据等。 触发器…...

算力驱动未来:从边缘计算到高阶AI的算力革命

算力驱动未来:从边缘计算到高阶AI的算力革命 摘要 本文深入探讨了不同算力水平(20TOPS至160TOPS)在人工智能领域的多样化应用场景。从边缘计算的实时目标检测到自动驾驶的多传感器融合,从自然语言处理的大模型应用到AI for Scie…...

4.8刷题记录(双指针)

今天刷的部分是代码随想录中的双指针专题代码随想录 由于里面包含的题目大部分之前刷过,并且用双指针做过。所以今天仅仅复习,不再进行代码的搬运。 1.19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode) 分析:此题无…...

在shell脚本中,$@和$#的区别与联系

在 Shell 脚本里,$ 和 $* 都是用于表示传递给脚本或函数的所有参数,下面详细介绍它们的区别与联系。 联系 表示所有参数:二者都能够代表传递给脚本或者函数的全部参数。当你在执行脚本时带上了多个参数,$ 和 $* 都能把这些参数呈…...

IP节点详解及国内IP节点获取指南

获取国内IP节点通常涉及网络技术或数据资源的使用,IP地址作为网络设备的唯一标识,对于网络连接和通信至关重要。详细介绍几种修改网络IP地址的常用方法,无论是对于家庭用户还是企业用户,希望能找到适合自己的解决方案。以下是方法…...

Google Play上架:解决android studio缓存问题(内容清理不干净导致拒审)

在as打包中,经常会遇到改变工程参数或者对应文件参数的情况,比如 修改android gradle版本 快捷键:ctrl + alt + shift + s 修改SDK文件路径 快捷键:ctrl + alt + shift + s 修改Gradle存储下载文件的默认位置 快捷键:ctrl + alt + s 先打开设置 修改compile...

蓝桥杯备赛 Day 21 图论基础

图的基础 ![[图的基础.png]] 1.图的存储方式 (1)邻接表(常用) vector<pair<int,int>> g[N]; //g[x]存放x的所有出点信息,二维数组 g[i][j]{first,second},first是从i出发的第j个出点,second表示边权 例如上图: g[1]{{2,0}.{3,0}} g[6]{{3,7}} g[4]{{5,0},{6,0}…...

MySQL数据库应用技术试卷

建一个以自己名字拼音为命名的数据库。&#xff08;3分&#xff09; CREATE DATABASE example; 令这个数据库为当前所使用的数据库。&#xff08;2分&#xff09; USE example; 写出如下student表结构语句。&#xff08;95分&#xff09; 表1&#xff1a; 列名 数据类型 …...

openssl源码分析之加密模式(modes)

openssl实现分组加密模式&#xff08;例如AES128-CBC的CBC部分&#xff09;的模块名字叫做modes&#xff0c;源代码位于 https://gitee.com/gh_mirrors/openssl/tree/master/crypto/modes 博主又打不开github了TT&#xff0c;只能找个gitee镜像 头文件是modes.h。 该模块目前…...

【Unity】Unity Transform缩放控制教程:实现3D模型缩放交互,支持按钮/鼠标/手势操作

【Unity 】Transform缩放控制教程&#xff1a;实现3D模型缩放交互&#xff0c;支持按钮/鼠标/手势操作 在Unity开发中&#xff0c;Transform组件承担着场景中物体的空间信息控制&#xff0c;包括位置、旋转和缩放。而缩放&#xff08;Scale&#xff09;操作&#xff0c;作为三…...

集成nacos2.2.1出现的错误汇总

总结 1.jdk问题 jdk要一致 2.idea使用问题 idea启动nacos要配置&#xff0c;idea启动类要启动两次&#xff0c;并配置两次vm参数 3.项目依赖问题 依赖要正确添加&#xff0c;有的模块就是不能用公共模块的pom配置&#xff0c;需要独立配置&#xff0c;先后启动顺序也要注意…...

从零到有的游戏开发(visual studio 2022 + easyx.h)

引言 本文章适用于C语言初学者掌握基本的游戏开发&#xff0c; 我将用详细的步骤引领大家如何开发属于自己的游戏。 作者温馨提示&#xff1a;不要认为开发游戏很难&#xff0c;一些基本的游戏逻辑其实很简单&#xff0c; 关于游戏的开发环境也不用担心&#xff0c;我会详细…...

海外高防服务器延迟优化——跨国业务安全加速的底层逻辑

本文深度解析海外高防服务器延迟优化的技术实现路径&#xff0c;揭示跨国业务场景下DDoS防护与网络性能的平衡法则。从物理线路选择到协议栈调优&#xff0c;从流量调度算法到安全检测机制重构&#xff0c;系统阐述降低20ms-50ms延迟的工程实践方案&#xff0c;并附2023年东南亚…...

常用环境部署(二十六)——Centos搭建MQTT服务端EMQX

1、安装docker https://blog.csdn.net/wd520521/article/details/112609796?spm1011.2415.3001.5331 2、安装EMQX4.4.4 &#xff08;1&#xff09;使用docker pull指令安装emqx镜像 docker pull emqx/emqx:4.4.4 &#xff08;2&#xff09;查看镜像 docker images 3、启…...

ecovadis认证基本概述,ecovadis认证审核有效期

EcoVadis认证基本概述 1. 什么是EcoVadis认证&#xff1f; EcoVadis是全球领先的企业可持续发展&#xff08;ESG&#xff09;评级平台&#xff0c;专注于评估企业在**环境&#xff08;E&#xff09;、劳工与人权&#xff08;S&#xff09;、商业道德&#xff08;L&#xff09…...

2.8.4 iOS覆盖率SDK开发

iOS系统的覆盖率SDK,通过搭建本地的pod仓库,直接在podfile中添加指定的下载地址,就可以实现对被测试的app注入覆盖率SDK。 2.8.4.1 开发iOS覆盖率获取Pod私有库 在网上查找了相应的开发方法后,决定开发自己的依赖库,开发方法及步骤如下: 1,开发新的包 (1)通过Xcode创…...

Redhat(6)-ansible-变量

变量 1.作用域 Global scope:命令行中设置。 Play scope:play中设置。 Host scope &#xff1a;inventory中定义、facts收集或任务中注册&#xff0c;在主机组和主机上设置。 1.全局变量 1.1cmd命令 #1.全局变量 #显示变量 echo %PATH1.2.ansible变量 全局变量 var变量不加…...

麦科信光隔离探头在碳化硅(SiC)MOSFET动态测试中的应用

碳化硅&#xff08;SiC&#xff09;MOSFET 是基于宽禁带半导体材料碳化硅&#xff08;SiC&#xff09;制造的金属氧化物半导体场效应晶体管&#xff0c;相较于传统硅&#xff08;Si&#xff09;MOSFET&#xff0c;具有更高的击穿电压、更低的导通电阻、更快的开关速度以及更优异…...

android audiorecord

这里写目录标题 初始化失败记录 AudioRecord 初始化及参数介绍基本初始化参数详解1. audioSource (音频源)2. sampleRateInHz (采样率)3. channelConfig (声道配置)4. audioFormat (音频格式)5. bufferSizeInBytes (缓冲区大小) 完整初始化示例使用注意事项 参考地址 初始化失败…...

有一个变量 在有些线程没有加锁 有些线程加锁了,那我在这些加锁的线程中能起到对应的作用吗

这是一个非常经典、但也很危险的问题。 &#x1f9e8; 简单结论&#xff1a; 如果一个变量在某些线程访问时没有加锁&#xff0c;即使其他线程对它加了锁&#xff0c;也&#xff1a; ❌ 不能保证线程安全&#xff01; ❌ 加锁的部分不会“保护”未加锁的部分&#xff01; &am…...

【人工智能】AI大模型开发数学基础指南

目录 学习内容**1. 线性代数****2. 概率与统计****3. 微积分****4. 优化理论****5. 信息论****6. 数值计算****7. 离散数学****8. 统计学进阶****如何学习&#xff1f;****总结** 如何学习**1. 明确学习目标****2. 分阶段学习计划****阶段 1&#xff1a;夯实基础****阶段 2&…...

直流减速电机控制实验:Simulink应用层开发(3)

文章目录 1 阶段目标2 单元测试方法3 单元测试过程3.1 按键指令识别测试3.2 电机状态转换测试4 代码生成5 总结1 阶段目标 本文是《直流减速电机控制实验》的第四部分,会通过图文结合的方式,手把手带读者操作Simulink工具进行直流减速电机的应用层开发。 本章主要将《直流减…...

隔行换色总结

功能效果展示&#xff1a; 第一种思路&#xff1a; 使用数组&#xff0c;将数组的内容渲染到页面上&#xff0c;序号也就是将数组的下标输出到第一个td上&#xff0c;将数组的内容输出到第二个td上&#xff0c;&#xff08;使用拼接字符串&#xff09; 具体操作&#xff1a; …...

【kind管理脚本-2】脚本使用说明文档 —— 便捷使用 kind 创建、删除、管理集群脚本

当然可以&#xff0c;以下是为你这份 Kind 管理脚本写的一份使用说明文档&#xff0c;可作为 README.md 或内部文档使用&#xff1a; &#x1f680; Kind 管理脚本说明文档 本脚本是一个便捷的工具&#xff0c;帮助你快速创建、管理和诊断基于 Kind (Kubernetes IN Docker) 的…...

Python星球日记 - 第13天:封装、继承与多态

🌟引言: 上一篇:Python星球日记 - 第12天:面向对象编程(OOP)基础 名人说:不要人夸颜色好,只留清气满乾坤(王冕《墨梅》) 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、引言二、封装的概念与实现1. 公有属性与私有属性2. 使用getter和sett…...

基于AT89C52单片机的GSM上报智能家居报警温度烟雾防盗系统

点击链接获取Keil源码与Project Backups仿真图&#xff1a; https://download.csdn.net/download/qq_64505944/90579530?spm1001.2014.3001.5503 功能介绍&#xff1a; 1、功能&#xff1a;具有温度、烟雾、入侵报警功能&#xff0c;采用LCD1602液晶显示屏实时显示温度值与…...

北重数控滑台厂家:机器人地轨究竟是如何运作的,又在哪些领域发光发热呢?

机器人地轨是指利用机器人技术在地面上移动或执行任务的轨道系统。这种系统通常包括导轨、传动装置、传感器和控制系统等组成部分。机器人地轨的运作原理是通过控制传动装置沿着导轨移动&#xff0c;同时利用传感器获取周围环境信息并通过控制系统进行实时调节。 机器人地轨在…...

2025最新系统 Git 教程(三)

2.3 Git 基础 - 查看提交历史 查看提交历史 在提交了若干更新&#xff0c;又或者克隆了某个项目之后&#xff0c;你也许想回顾下提交历史。 完成这个任务最简单而又有效的工具是 git log 命令。 我们使用一个非常简单的 simplegit 项目作为示例。 运行下面的命令获取该项目&…...

显示器各类异常处理方法

显示器各类异常处理方法 导航 文章目录 显示器各类异常处理方法导航画面无显示/黑屏/无HDMI信号输入显示器闪烁显示器花屏显示画面模糊或扭曲显示器颜色异常显示器出现死点或亮点 画面无显示/黑屏/无HDMI信号输入 ​ 首先应该检查的是显示器电源&#xff08;真的有人弄掉电源…...

Error 1062 (23000): Duplicate entry ‘‘ for key ‘id‘`

目录 Error 1062 (23000): Duplicate entry for key id1. **问题分析**2. **解决方法****步骤 1&#xff1a;检查 id 字段的值****步骤 2&#xff1a;检查表结构****步骤 3&#xff1a;检查现有数据****步骤 4&#xff1a;检查插入逻辑****步骤 5&#xff1a;修改表结构&#…...

谈谈模板方法模式,模板方法模式的应用场景是什么?

一、模式核心理解 模板方法模式是一种​​行为设计模式​​&#xff0c;通过定义算法骨架并允许子类重写特定步骤来实现代码复用。 如同建筑图纸规定房屋结构&#xff0c;具体装修由业主决定&#xff0c;该模式适用于​​固定流程中需要灵活扩展​​的场景。 // 基础请求处理…...

未来蓉城:科技与生态共舞的诗意栖居-成都

故事背景 故事发生在中国四川成都的2075年&#xff0c;展现科技与自然深度交融的未来城市图景。通过六个充满想象力的生态装置场景&#xff0c;描绘市民在智慧城市中诗意栖居的生活状态&#xff0c;展现环境保护与人文传承的和谐共生。 故事内容 在电子竹林轻轨站&#xff0c;通…...