Redis 高可用性:如何让你的缓存一直在线,稳定运行?

🎯 引言:Redis的高可用性为啥这么重要?

在现代高可用系统中,Redis 是一款不可或缺的分布式缓存与数据库系统。无论是提升访问速度,还是实现数据的高效持久化,Redis 都能轻松搞定。可是,当你把 Redis 用于关键业务时,它的高可用性就显得尤为重要。为了避免系统出现单点故障,保障业务连续性,我们需要有一套高可用架构来确保 Redis 的稳定运行。

今天,我们就一起来探讨一下 Redis 高可用架构 的几种实现方式,看看如何设计一套健壮的 Redis 高可用方案,保证我们的 Redis 缓存一直在线,稳定运行。


🛠️ 1. Redis 主从复制:简单的高可用方案

1.1 主从复制工作原理

Redis 主从复制(Master-Slave Replication)是 Redis 实现高可用性最基础的方案之一。在这种架构中,你会有一个主节点(Master)和一个或多个从节点(Slave)。主节点负责处理写操作和数据更新,而从节点则负责从主节点同步数据并进行只读操作。

当主节点发生故障时,可以将某个从节点提升为主节点(手动或自动),确保系统的持续可用。

主从复制基本架构
  • 主节点(Master) :处理所有的写操作(如SETDEL等命令)。
  • 从节点(Slave) :只处理读操作(如GET命令),并定期从主节点同步数据。
    在这里插入图片描述
主从复制工作流程
(1)初始同步

当从节点(Slave)首次启动并连接到主节点时,它需要将主节点的数据完全同步过来。这个过程称为“全量同步”。

  1. 从节点连接主节点:从节点向主节点发起连接请求。
  2. 主节点进行快照(RDB) :主节点执行 SAVEBGSAVE 命令,将当前的内存数据(RDB 快照)保存到磁盘。
  3. 从节点复制快照:主节点将保存的数据发送给从节点,从节点将数据写入本地数据库。
  4. 建立同步通道:从节点在完成全量同步后,开始监听主节点的变更。
(2)增量同步

从节点已经有了主节点的数据快照后,接下来的数据同步就是增量同步,只同步主节点上的变更数据。

  1. 主节点记录变更操作:主节点每处理一个写操作(如SETDEL),会将这个操作写入复制日志(replication log)中。
  2. 主节点发送变更命令给从节点:主节点将增量变更命令发送到所有的从节点。
  3. 从节点执行命令:从节点收到变更命令后,会在本地执行这些命令,保证数据的一致性。
(3)断线恢复

如果从节点与主节点的连接丢失,Redis 会进行断线恢复:

  • 当从节点重新连接到主节点时,Redis 会判断是进行全量同步还是增量同步。如果从节点没有数据快照,它会进行全量同步;如果有数据快照,则会通过增量同步方式进行恢复。
主从复制的特点
  • 只读模式:从节点默认只能进行读取操作(GET),不接受写操作。写操作必须通过主节点执行。
  • 延迟问题:由于从节点是从主节点获取数据的,主节点的写操作会有一定的延迟才会在从节点上看到。
  • 数据一致性:主从复制是最终一致性的,意味着从节点上的数据不会立即与主节点同步一致,在数据变更时可能会有短暂的不一致状态。
主从复制的优势
  • 提高可用性和可靠性:从节点可以用来分担主节点的读取压力,还可以在主节点故障时迅速切换,保证服务的可用性。
  • 数据备份:从节点可以作为主节点的备份,提供数据冗余,防止主节点数据丢失。
  • 负载均衡:多个从节点可以分担读取请求,从而降低主节点的负载。
主从复制使用场景
  • 高可用架构:当主节点出现故障时,可以通过从节点提升一个新的主节点来实现故障切换。
  • 读写分离:主节点处理写操作,从节点处理读操作,优化性能。
  • 数据冗余:从节点可以作为数据的备份,一旦主节点出现问题,可以快速恢复数据。

1.2 主从复制搭建步骤

1、Redis 环境准备
  1. 下载安装Redis

  2. 本次演示使用的版本是6.2.7版本(并且在本机环境模拟3个redis示例演示)

  3. 进行Redis目录下创建 redis-cluster (mkdir redis-cluster)

  4. 复制原有redis.conf新建3个配置文件 redis-6379.conf redis-6380.conf redis-6381.conf
    在这里插入图片描述

  5. 将配置文件放置到redis-cluster目录下

  6. 编辑主节点(redis-6379.conf),主要修改以下配置项

    port 6379
    bind 127.0.0.1
    pidfile ./redis-cluster/redis-6379.pid
    logfile ./redis-cluster/redis-6379.log
    dir ./redis-cluster/data/redis-6379
    
  7. 编辑从节点(redis-6380.conf)

    port 6380
    bind 127.0.0.1
    pidfile ./redis-cluster/redis-6380.pid
    logfile ./redis-cluster/redis-6380.log
    dir ./redis-cluster/data/redis-6380
    replicaof 127.0.0.1 6379
    
  8. 编辑从节点(redis-6381.conf)

    port 6381
    bind 127.0.0.1
    pidfile ./redis-cluster/redis-6381.pid
    logfile ./redis-cluster/redis-6381.log
    dir ./redis-cluster/data/redis-6381
    replicaof 127.0.0.1 6379
    

配置完成,主要配置项说明:

  • port:每个 Redis 实例需要不同的端口。
  • pidfile:每个实例需要独立的 PID 文件。
  • logfile:每个实例需要不同的日志文件。
  • replicaof:设置主从复制指定主节点。
  • dir:设置数据文件的存储路径。确保每个 Redis 实例的 dir 路径存在(提前创建,用于存储数据文件)

每个实例都需要不同的配置(特别是端口、PID 文件、日志文件和数据目录),确保它们不会冲突。

2、启动 Redis 实例
  1. 打开 命令终端

  2. 进入 Redis 所在的目录

  3. 启动3个实例

    ./src/redis-server ./redis-cluster/redis-6379.conf
    ./src/redis-server ./redis-cluster/redis-6380.conf
    ./src/redis-server ./redis-cluster/redis-6381.conf
    
  4. 检查实例是否正常
    你可以通过 redis cli 连接到每个实例,确认它们是否成功启动。

  5. 检查主从复制是否正常或者连接到主节点新增键值看同步是否成功

    ./src/redis-cli -p 6379 info replication
    ./src/redis-cli -p 6380 info replication
    

    主节点在这里插入图片描述

    从节点
    在这里插入图片描述

    说明主从复制成功。

⚙️ 2. Redis Sentinel:自动故障转移的英雄

2.1 Redis Sentinel的工作原理

Redis Sentinel 是 Redis 提供的自动故障转移系统。它监控 Redis 实例的健康状况,一旦主节点发生故障,Sentinel 会自动将一个从节点提升为主节点,并更新所有从节点的信息,保证系统的高可用性。Sentinel 的作用不止于监控故障,它还可以提供自动故障转移、配置发布以及客户端连接的重定向。

哨兵部署架构

在这里插入图片描述

1、监控:Sentinel 会不断检查 master 和 slave 是否按预期工作。
2、自动故障恢复:如果 master 故障,Sentinel 会将一个 slave 提升为 master,当故障实例恢复后也会安装新的 master 为主节点。
3、通知:Sentinel 充当 Redis 客户端的服务发现来源,当集群发生故障转移时,会将最新节点信息推送给 Redis 客户端。

哨兵集群监控原理

Sentinel 基于心跳机制监测服务状态,每隔1秒向集群的每个实例发送ping命令:

  • 主观下线:如果某 Sentinel 节点发现某实例未在规定时间响应,则认为该实例主观下线。
  • 客观下线:若超过指定数量(quorum)的 Sentinel 都认为该实例主观下线,则该实例客观下线。quorum 值最好超过 Sentinel 实例数量的一半。

在这里插入图片描述

集群故障恢复原理

一旦发现 master 故障,Sentinel 需要在 salve 中选择一个作为新的 master,选择依据是这样的:

  • 首先会判断 slave 节点与 master 节点断开时间长短 ,如果超过指定值(downafter-milliseconds * 10)则会排除该 slave 节点
  • 然后判断 slave 节点的 slave-priority 值,越小优先级越高,如果是0则永不参与选举
  • 如果slave-priority一样,则判断 slave 节点的 offset 值 ,越大说明数据越新,优先级越高
  • 最后是判断slave节点的 运行id 大小,越小优先级越高。

当选出一个新的 master 之后,该如何实现切换呢?
流程如下:

  • Sentinel给备选的 slave1 节点发送 slaveof no one 命令,让该节点成为 master
  • Sentinel给所有其它 slave 发送 slaveof 127.0.0.1 6380 命令,让这些 slave 成为新 master 的从节点,开始从新的 master 上同步数据。
  • 最后,Sentinel 将故障节点标记为 slave,当故障节点恢复后会自动成为新的 master 的 slave 节点。
    在这里插入图片描述

2.2 配置 Redis Sentinel(哨兵)

部署多个 Redis 实例后,配置 Redis Sentinel 以实现高可用性,可以通过以下步骤来完成。哨兵模式的主要功能是监控 Redis 主节点和从节点的状态,并在主节点宕机时自动切换到从节点。

  • 你已经有了多个 Redis 实例(例如637963806381)。
  • 你希望配置 Sentinel 来监控这些实例,并在主节点宕机时进行自动故障转移。

每个 Redis 哨兵都需要配置一个 sentinel.conf 文件来监控主节点。你可以创建多个 Sentinel 配置文件,并通过它们来监控 Redis 实例。

设置哨兵配置文件(sentinel.conf) 内容如下:

port 26379
bind 127.0.0.1
pidfile "./redis-cluster/sentinel-26379/sentinel-26379.pid"
logfile "./redis-cluster/sentinel-26379/sentinel-26379.log"
dir "./redis-cluster/sentinel-26379"
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 10000
sentinel parallel-syncs mymaster 1

复制文件进行 26380 和 26381 哨兵的配置。

port 26380
bind 127.0.0.1
pidfile "./redis-cluster/sentinel-26380/sentinel-26380.pid"
logfile "./redis-cluster/sentinel-26380/sentinel-26380.log"
dir "./redis-cluster/sentinel-26380"
sentinel monitor mymaster 127.0.0.1 6380 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 10000
sentinel parallel-syncs mymaster 1
  • sentinel monitor mymaster:这是 Sentinel 监控的主节点名称,这里设置为 mymaster,并且指定了主节点的 IP 和端口(127.0.0.1 6379)。后面的数字 2 表示至少需要 2 个哨兵节点确认主节点宕机后,才会进行故障转移。
  • sentinel down-after-milliseconds mymaster 5000:当主节点 5 秒没有响应时,认为该节点宕机。
  • sentinel failover-timeout mymaster 10000:故障转移的超时时间。
  • sentinel parallel-syncs mymaster 1:指定故障转移时,最多有多少个从节点同步数据。

2.3 启动 Redis Sentinel(哨兵)

  1. 你可以启动多个 Sentinel 实例来提高容错性。

    ./src/redis-sentinel ./redis-cluster/sentinel-26379.conf
    ./src/redis-sentinel ./redis-cluster/sentinel-26380.conf
    ./src/redis-sentinel ./redis-cluster/sentinel-26381.conf
    
  2. 验证哨兵状态查看是否发现主节点

    ./src/redis-cli -p 26379 sentinel masters
    

    在这里插入图片描述

  3. 查看从节点状态

    ./src/redis-cli -p 26379 sentinel slaves mymaster
    

    在这里插入图片描述5. 搭建完成,这说明 Sentinel 已经自动发现并管理了从节点 🎯

2.4 哨兵模式连接Redis

在Sentinel集群监管下的Redis主从集群,其节点会因为自动故障转移而发生变化,Redis的客户端必须感知这种变化,及时更新连接信息。
客户端应用程序应该使用RedisSentinel模式连接Redis,而不是直接固定的Redis的IP。我们可以直接通过哨兵获取到当前的主节点IP。可以使用命令:

./src/redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster

在这里插入图片描述

我们通过一个测试来实现Spring Boot实现集成哨兵机制。

Maven依赖

        <dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.15.3</version></dependency>

配置文件添加配置项

spring:redis:sentinel:master: mymasternodes: 127.0.0.1:26379,127.0.0.1:26380,127.0.0.1:26381host: 127.0.0.1port: 6379database: 1 # 默认使用 0 库password:

测试连接代码

@Configuration
@AutoConfigureBefore({RedisAutoConfiguration.class, RedissonAutoConfiguration.class})
public class RedissonConfig {protected final Logger logger = LoggerFactory.getLogger(this.getClass());@Value("${spring.redis.host}")private String host;@Value("${spring.redis.port}")private String port;@Value("${spring.redis.password}")private String password;@Value("${spring.redis.database}")private int database;@Value("${spring.redis.sentinel.master}")private String sentinelMaster;@Value("${spring.redis.sentinel.nodes}")private String sentinelNodes;@Value("${redisson.threads:4}")private int threads;@Value("${redisson.nettyThreads:5}")private int nettyThreads;@Value("${redisson.connectPoolSize:20}")private int connectPoolSize;@Value("${redisson.connectPoolIdleSize:5}")private int connectPoolIdleSize;@Value("${redisson.connectTimeout:10000}")private int connectTimeout;@Value("${redisson.retryAttempts:3}")private int retryAttempts;@Value("${redisson.retryInterval:1500}")private int retryInterval;@Value("${redisson.timeout:10000}")private int timeout;@Value("${redisson.pingConnectionInterval:30000}")private int pingConnectionInterval;@Bean(destroyMethod = "shutdown")@ConditionalOnMissingBean(RedissonClient.class)public RedissonClient redisson() throws IOException {Config config = new Config();int cpuCores = Runtime.getRuntime().availableProcessors();threads = (threads == 0 ? cpuCores * 2 : threads);nettyThreads = (nettyThreads == 0 ? cpuCores : nettyThreads);config.setThreads(threads);config.setNettyThreads(nettyThreads);config.setTransportMode(TransportMode.NIO);// 设置序列化(禁用class类型信息)config.setCodec(new SimpleRedisJsonCodec());if (StringUtils.isNotEmpty(sentinelMaster) && StringUtils.isNotEmpty(sentinelNodes)) {// 支持哨兵模式logger.info("RedissonClient init useSentinelServers");String[] sentinels = sentinelNodes.split(",");config.useSentinelServers().setMasterName(sentinelMaster).setDatabase(database).setPassword(StringUtils.isEmpty(password) ? null : password).setTimeout(timeout).addSentinelAddress(formatRedisUrls(sentinels));} else if (host.contains(",")) {// 集群模式logger.info("RedissonClient init useClusterServers");String[] clusterNodes = host.split(",");ClusterServersConfig cConfig = config.useClusterServers();for (String node : clusterNodes) {cConfig.addNodeAddress("redis://" + node + ":" + port);}cConfig.setPassword(password);cConfig.setMasterConnectionPoolSize(connectPoolSize);cConfig.setMasterConnectionMinimumIdleSize(connectPoolIdleSize);cConfig.setConnectTimeout(connectTimeout);cConfig.setRetryAttempts(retryAttempts);cConfig.setRetryInterval(retryInterval);cConfig.setTimeout(timeout);cConfig.setPingConnectionInterval(pingConnectionInterval);} else {// 单机模式logger.info("RedissonClient init useSingleServer");config.useSingleServer().setAddress("redis://" + host + ":" + port).setDatabase(database).setPassword(StringUtils.isEmpty(password) ? null : password).setConnectionPoolSize(connectPoolSize).setConnectionMinimumIdleSize(connectPoolIdleSize).setTimeout(timeout);}return Redisson.create(config);}/*** 格式化 Redis URL,确保前缀一致*/private String[] formatRedisUrls(String[] nodes) {return Arrays.stream(nodes).map(node -> node.startsWith("redis://") ? node : "redis://" + node).toArray(String[]::new);}
}

连接成功
在这里插入图片描述

2.5 测试故障转移

你可以通过停掉主节点(6379)来测试故障转移的功能。停掉主节点后,Sentinel 会自动将从节点提升为新的主节点。

  1. 停止主节点(6379

  2. Sentinel 会检测到主节点宕机,并自动执行故障转移,将选择一个从节点升级为新的主节点。你可以通过以下命令查看新的 Sentinel 的主节点。可以看到新的主节点已经变成6381。

	./src/redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster1) "127.0.0.1"2) "6381"

并且SpringBoot中自动感知到节点变化,业务可正常使用,不受到Redis节点宕掉的影响。
在这里插入图片描述

  • 自动化:Sentinel 自动监控 Redis 状态,发生故障时,自动完成故障转移。
  • 高可用:Redis Sentinel 可以防止单点故障,增强系统的稳定性。

3. Redis Cluster:实现水平扩展和高可用性的终极武器

3.1 Redis Cluster的工作原理

Redis Cluster 是 Redis 3.0 引入的一个新特性,它可以实现水平扩展并且在多个节点之间分配数据。Redis Cluster 是基于分片的架构,数据会自动分布到不同的节点上。每个节点都有一个主节点和若干从节点组成的高可用集群。

当某个节点发生故障时,Redis Cluster 可以自动将从节点提升为主节点,继续保持服务的可用性。同时,Cluster 支持 自动分片,即每个节点负责一部分数据。

3.2 Redis Cluster的搭建步骤

持续更新中…

🚀 4. 实际应用案例:如何实现生产环境中的 Redis 高可用架构

在实际生产环境中,Redis 的高可用架构设计需要根据具体的需求来选择适合的方案。比如,对于需要高吞吐量和低延迟的场景,使用 Redis Cluster 是一个不错的选择;而对于一些中小型应用,可以选择 Redis Sentinel 来确保故障自动切换。

4.1 使用 Redis Sentinel 实现高可用

  1. 部署 Redis 实例:设置主从节点,并在至少 3 个机器上运行 Redis。
  2. 配置 Sentinel:配置 Sentinel 进行监控和故障转移。
  3. 自动切换:当主节点宕机时,Sentinel 自动将从节点提升为主节点。

4.2 使用 Redis Cluster 实现高可用

  1. 分配数据分片:将数据分配到多个 Redis 节点上,每个节点负责不同的数据分片。
  2. 设置集群:通过 redis-trib 工具来创建 Redis 集群。
  3. 监控集群状态:使用 redis-cli 检查集群状态,确保节点间通信正常。

🔒 5. 结论:如何选择合适的 Redis 高可用方案?

每个系统对 Redis 高可用性的需求都不尽相同,因此选择合适的架构尤为重要:

  • 小型系统:可以选择 Redis 主从复制,设置少量的从节点来提升读取性能。
  • 中型系统:使用 Redis Sentinel 来实现自动故障转移,并增加更多的监控和故障处理功能。
  • 大型系统:对于大规模的应用,建议使用 Redis Cluster 进行分片存储与水平扩展,并结合 Sentinel 进行高可用性保障。

通过了解 Redis 的高可用架构,结合实际业务需求来进行部署,我们就能避免系统因为 Redis 故障导致的业务中断,提升整体系统的可靠性。


总结:Redis 缓存一直在线,稳定运行

Redis 的高可用性不仅关乎缓存系统的稳定性,更是支撑业务连续性的关键。通过选择合适的高可用架构,我们可以让 Redis 在系统故障时仍然坚挺不倒,保证业务流畅运行。

希望你通过这篇文章了解了 Redis 主从复制、Sentinel 和 Cluster 的不同高可用实现方式,找到适合自己的方案,确保 Redis 在高负载下仍能保持稳定运行!

🌟 你的支持是我持续创作的动力,欢迎点赞、收藏、分享!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI 编码 2.0 分析、思考与探索实践:从 Cursor Composer 到 AutoDev Sketch

在周末的公司【AI4SE 效能革命与实践&#xff1a;软件研发的未来已来】直播里&#xff0c;我分享了《AI编码工具 2.0 从 Cursor 到 AutoDev Composer》主题演讲&#xff0c;分享了 AI 编码工具 2.0 的核心、我们的思考、以及我们的 AI 编码工具 2.0 探索实践。 在这篇文章中&am…

Qt Creator + CMake 构建教程

此教程基于: Qt 6.7.4Qt Creator 15.0.1CMake 3.26.4 Qt 6 以下的版本使用 CMake 构建可能会存在一些问题. 目录 新建窗体工程更新翻译添加资源软件部署(Deploy) 此教程描述了如何一步步在 Qt Creator 中使用 CMake 构建应用程序工程. 涉及 新建窗体工程, 更新翻译, 添加资源, …

锂电池保护板测试仪:电池安全的守护者与创新驱动力

在新能源产业蓬勃发展的今天&#xff0c;锂电池以其高能量密度、长循环寿命和环保特性&#xff0c;成为电动汽车、无人机、便携式电子设备等领域不可或缺的能量来源。然而&#xff0c;锂电池的安全性和稳定性一直是行业关注的焦点。为了确保锂电池在各种应用场景下的可靠运行&a…

岳阳市美术馆预约平台(小程序论文源码调试讲解)

第4章 系统设计 一个成功设计的系统在内容上必定是丰富的&#xff0c;在系统外观或系统功能上必定是对用户友好的。所以为了提升系统的价值&#xff0c;吸引更多的访问者访问系统&#xff0c;以及让来访用户可以花费更多时间停留在系统上&#xff0c;则表明该系统设计得比较专…

【Java】I/O 流篇 —— 转换流与序列化流

目录 转换流原理InputStreamReader 转换输入流构造方法代码示例 OutputStreamWriter 转换输出流构造方法代码示例 练习 序列化流序列化流反序列化流**serialVersionUID**基本概念作用使用方式transient 关键字注意事项 转换流 原理 转换流属于字符流&#xff0c;是字符流和字节…

Mac 版 本地部署deepseek ➕ RAGflow 知识库搭建流程分享(附问题解决方法)

安装&#xff1a; 1、首先按照此视频的流程一步一步进行安装&#xff1a;(macos版&#xff09;ragflowdeepseek 私域知识库搭建流程分享_哔哩哔哩_bilibili 2、RAGflow 官网文档指南&#xff1a;https://ragflow.io 3、RAGflow 下载地址&#xff1a;https://github.com/infi…

计算机三级网络技术备考

#subtotal 1Mbps1024kb128KB12.8M/s #1024B1KB 1024KB1MB 1024MB1GB #路由器的5G信号和平常的波长不同&#xff08;5G的穿墙性能差&#xff09; #局域网LAN&#xff08;一公里内——构成集线机、交换机、同轴电缆&#xff09; #城域网MAN&#xff08;几公里到几十公里——光…

IDEA 2024.1 最新永久可用(亲测有效)

今年idea发布了2024.1版本&#xff0c;这个版本带来了一系列令人兴奋的新功能和改进。最引人注目的是集成了更先进的 AI 助手&#xff0c;它现在能够提供更复杂的代码辅助功能&#xff0c;如代码自动补全、智能代码审查等&#xff0c;极大地提升了开发效率。此外&#xff0c;用…

30 分钟从零开始入门 CSS

前言 最近也是在复习&#xff0c;把之前没写的博客补起来&#xff0c;之前给大家介绍了 html&#xff0c;现在是 CSS 咯。 30分钟从零开始入门拿下 HTML_html教程-CSDN博客 一、CSS简介&#xff1a;给网页“化妆”的神器 CSS&#xff08;层叠样式表&#xff09;就像“化妆“&a…

Game Maker 0.11更新:构建社交竞速游戏并增强玩家互动

在这三部分系列中&#xff0c;我们将介绍如何实现Game Maker 0.11中一些最激动人心的新功能。 欢迎来到我们系列文章的第一篇&#xff0c;重点介绍了The Sandbox Game Maker 0.11更新中的新特性。 The Sandbox Game Maker 0.11是一个多功能工具&#xff0c;帮助创作者通过游戏…

软件供应链安全工具链研究系列——RASP自适应威胁免疫平台(上篇)

1.1 基本能力 RASP是一种安全防护技术&#xff0c;运行在程序执行期间&#xff0c;使程序能够自我监控和识别有害的输入和行为。也就是说一个程序如果注入或者引入了RASP技术&#xff0c;那么RASP就和这个程序融为一体&#xff0c;使应用程序具备了自我防护的能力&#xff0c;…

2024信息技术、信息安全、网络安全、数据安全等国家标准合集共125份。

2024信息技术、信息安全、网络安全、数据安全等国家标准合集&#xff0c;共125份。 一、2024信息技术标准&#xff08;54份&#xff09; GB_T 17966-2024 信息技术 微处理器系统 浮点运算.pdf GB_T 17969.8-2024 信息技术 对象标识符登记机构操作规程 第8部分&#xff1a;通用…

HTTP与网络安全

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、HTTPS和HTTP有怎样的区别呢&#xff1f;HTTPS HTTP SSL/TLS&#xff08;SSL或者TLS&#xff09; HTTP&#xff1a;应用层 SSL/TLS&#xff1a;协议中间层 …

ASP.NET Core 8.0学习笔记(二十八)——EFCore反向工程

一、什么是反向工程 1.原则&#xff1a;DBFirst 2.反向工程&#xff1a;根据数据库表来反向生成实体类 3.生成命令&#xff1a;Scaffold-DbContext ‘连接字符串’ 字符串示例&#xff1a; Server.;DatabaseDemo1;Trusted_Connectiontrue; MultipleActiveResultSets true;Tru…

Unity基础——资源导出分享为Unity Package

一.选中要打包的文件夹&#xff0c;右击&#xff0c;点击Exporting package 二.勾选 Include Dependencies&#xff0c;点击Export Include Dependencies&#xff1a;代表是否包含资源依赖的选项 三.选择保存的位置&#xff0c;即可生成Unity package 最终形成文件&#xff1a…

kafka-leader -1问题解决

一. 问题&#xff1a; 在 Kafka 中&#xff0c;leader -1 通常表示分区的领导者副本尚未被选举出来&#xff0c;或者在获取领导者信息时出现了问题。以下是可能导致出现 kafka leader -1 的一些常见原因及相关分析&#xff1a; 1. 副本同步问题&#xff1a; 在 Kafka 集群中&…

【Java企业生态系统的演进】从单体J2EE到云原生微服务

Java企业生态系统的演进&#xff1a;从单体J2EE到云原生微服务 目录标题 Java企业生态系统的演进&#xff1a;从单体J2EE到云原生微服务摘要1. 引言2. 整体框架演进&#xff1a;从原始Java到Spring Cloud2.1 原始Java阶段&#xff08;1995-1999&#xff09;2.2 J2EE阶段&#x…

内容中台的企业CMS架构是什么?

企业CMS模块化架构 现代企业内容管理系统的核心在于模块化架构设计&#xff0c;通过解耦内容生产、存储、发布等环节构建灵活的技术栈。动态/静态发布引擎整合技术使系统既能处理实时更新的产品文档&#xff0c;也能生成高并发的营销落地页&#xff0c;配合版本控制机制确保内…

Binder通信协议

目录 一,整体架构 二,Binder通信协议 三&#xff0c;binder驱动返回协议 四&#xff0c;请求binder驱动协议 一,整体架构 二,Binder通信协议 三&#xff0c;binder驱动返回协议 binder_driver_return_protocol共包含18个命令&#xff0c;分别是&#xff1a; 四&#xff0c…

react 中,使用antd layout布局中的sider 做sider的展开和收起功能

一 话不多说&#xff0c;先展示效果&#xff1a; 展开时&#xff1a; 收起时&#xff1a; 二、实现代码如下 react 文件 import React, {useState} from react; import {Layout} from antd; import styles from "./index.module.less"; // 这个是样式文件&#…