redis高可用

文章目录

    • redis高可用概述
    • 哨兵模式
      • 原理
      • 配置
      • 流程
      • 使用
      • 缺点
    • cluster集群
      • 原理
      • 特征
      • 流程
      • 缺点
      • 故障转移
        • 故障检测
        • 故障转移
      • 集群配置和管理
        • 主要命令
        • 搭建集群
        • 创建集群
        • 查看集群配置信息
        • 测试集群
        • 主从切换
        • 扩容
        • 缩容

redis高可用概述

1、高可用是分布式的概念。 Redis的高可用性是指在Redis集群中,当主节点宕机了,通过切换备用节点顶替它继续运行,保持系统正常运行且数据可靠性不受影响。

2、通过实现Redis的高可用性,可以提供以下几个主要优势:

1)避免单点故障:通过配置和设置多个Redis节点,如果其中一个节点发生故障,其他节点可以接替工作,避免了单点故障对整个系统的影响。

2)数据冗余和复制:通过数据的复制和持久化备份,Redis能够在主节点出现故障时,自动切换到备用节点,并恢复数据,确保数据的持久性和可用性。

3)故障自动检测和故障转移:Redis的高可用方案通常具备故障检测和自动故障转移的功能,能够监控节点的健康状态,并在节点故障时自动将从节点升级为主节点。

3、因此,redis的高可用主要完成以下工作:

1)数据同步。主节点和从节点(备用节点)之间的数据需要进行同步。

2)主从切换。若主节点宕机,需要有一种机制可以切换从节点变成主节点。

哨兵模式

原理

哨兵模式是 Redis 可用性的解决方案,它由一个或多个 sentinel实例构成 sentinel 系统。该系统通过 ping-pong心跳检测的方法监视任意多个主库以及这些主库所属的从库。当主库处于下线状态,自动将该主库所属的某个从库升级为新的主库,从而实现高可用。

客户端来连接集群时,会首先连接 sentinel,通过 sentinel 来查询主节点的地址,然后再连接主节点进行数据交互。当主节点发生故障时,客户端会重新向 sentinel 索要主库地址,sentinel会将最新的主库地址告诉客户端。通过这样客户端无须重启即可自动完成节点切换。

Sentinel 节点个数是奇数,不存储数据,用来监控节点的状态和选举主节点,只提供一个数据节点服务。Sentinel 节点不仅监控 Redis 主从节点,同时还互相监控,形成多哨兵模式。

Sentinel 模式当中涉及的多个选举流程采用的是 raft 一致性算法。

在这里插入图片描述

说明:

哨兵作用:

  • 监控数据节点的状态,自身不存储具体业务的数据,只存储redis节点的状态信息。

  • 选主节点,通常部署奇数个哨兵节点,主要是为了选主。

  • 只提供一个数据节点服务。

根据什么来选举?

  • 数据最新的选举为主库。 如何判断最新? 根据数据偏移量,偏移量从0加到64位最大值。

为什么需要奇数个哨兵节点呢?

  • 因为要半数以上认为某个节点可以为主节点才会选取该节点为主节点。如果是偶数个,那就可能平票。

配置

# sentinel.cnf
# sentinel 只需指定检测主节点就行了,通过主节点自动发现从节点
sentinel monitor mymaster 127.0.0.1 6379 2
# 判断主观下线时长
sentinel down-after-milliseconds mymaster 30000
# 指定可以有多少个Redis服务同步新的主机,一般而言,
# 这个数字越小同步时间越长,而越大,则对网络资源要求越高
sentinel parallel-syncs mymaster 1
# 指定故障切换允许的毫秒数,超过这个时间,就认为故障切换失败,默认为3分钟
sentinel failover-timeout mymaster 180000

流程

1)主观下线 sentinel 会以每秒一次的频率向所有节点(其他sentinel、主节点、以及从节点)发送 ping 消息,然后通过接收返回判断该节点是否下线。如果在配置指定 down-after-milliseconds 时间内则被判断为主观下线。

2)客观下线 当一个 sentinel 节点将一个主节点判断为主观下线之后,为了确认这个主节点是否真的下线,它会向其他 sentinel 节点进行询问,如果收到一定数量(半数以上)的已下线回复,sentinel 会将主节点判定为客观下线,并通过领头 sentinel 节点对主节点执行故障转移。

3)故障转移 主节点被判定为客观下线后,开始领头 sentinel 选举。按照谁发现谁处理的原则选举领头 sentinel,需要半数以上的 sentinel 支持。选举领头 sentinel 后,开始执行对主节点故障转移:

  • 从从节点中选举一个从节点作为新的主节点

  • 通知其他从节点复制连接新的主节点

  • 若故障主节点重新连接,将作为新的主节点的从节点

使用

**1)**连接哨兵节点 —— 连接一个哨兵节点,并且获取主节点信息:SENTINEL GET-MASTER-ADDR-BY-NAME 。

**2)**获取主节点地址并连接 —— 验证当前获取的主节点:ROLE 或者 INFO REPLICATION。

**3)**发起发布订阅连接,监听主节点迁移信息 —— 为当前连接的哨兵节点,添加发布订阅(PUB/SUB)连接,并且订阅 +switch-master 频道,以此互相感知,互相连接,组成哨兵集群。

缺点

redis 采用异步复制的方式,意味着当主节点挂掉时,从节点可能没有收到全部的同步消息,这部分未同步的消息将丢失。如果主从延迟特别大,那么丢失可能会特别多。sentinel 无法保证消息完全不丢失,但是可以通过配置来尽量保证少丢失。

# 主库必须有一个从节点在进行正常复制,否则主库就停止对外
# 写服务,此时丧失了可用性
min-slaves-to-write 1
# 这个参数用来定义什么是正常复制,该参数表示如果在10s内
# 没有收到从库反馈,就意味着从库同步不正常;
min-slaves-max-lag 10

总结来说:

1)部署麻烦:哨兵模式的配置相对复杂,需要管理和维护多个哨兵节点以及与它们关联的 Redis 服务器。调试和故障排除也可能变得更加困难。

2)数据一致性:哨兵模式下的故障转移是异步进行的,这意味着在发生主服务器故障时,可能会有一段时间内的数据丢失。因此,在一些对数据一致性要求非常高的场景下,哨兵模式可能无法满足需求。

3)难以在线扩容的缺点,Redis的容量受限于单机配置

4)延迟增加:当主服务器故障时,哨兵节点需要通过选举机制选择新的主服务器,并通知其他从服务器切换到新的主服务器。这个过程需要时间(至少十几秒),会导致系统的延迟增加。

5)单点故障:哨兵节点是集群的核心,,它们负责监控主服务器和从服务器的状态,并执行故障转移操作。然而,如果哨兵节点本身发生故障,整个系统的可用性将会受到影响。

cluster集群

原理

Redis cluster 将所有数据划分为 16384( 2^14)个槽位,每个 redis 节点负责其中一部分槽位。cluster 集群是一种去中心化的集群方式;

在这里插入图片描述

如图,该集群由三个 redis 节点组成,每个节点负责整个集群的 一部分数据,每个节点负责的数据多少可能不一样。这三个节点相互连接组成一个对等的集群,它们之间通过一种特殊的二进制协议交互集群信息;

在这里插入图片描述

当 redis cluster 的客户端来连接集群时,会得到一份集群的槽位配置信息。这样当客户端要查找某个 key 时,可以直接定位到目标节点。

客户端为了可以直接定位(对 key 通过 crc16 进行 hash 再对2^14取余)某个具体的 key 所在节点,需要缓存槽位相关信息, 这样才可以准确快速地定位到相应的节点。同时因为可能会存在客户端与服务器存储槽位的信息不一致的情况,还需要纠正机制(通过返回 -MOVED 3999 127.0.0.1:6479,客户端收到 后需要立即纠正本地的槽位映射表)来实现槽位信息的校验调整。

说明:

为什么要对2^14取余?

  • 增大样本数,让数据均衡的落在节点当中;

  • 固定算法,增加节点和删除节点不会让原来的映射关系失效。

另外,redis cluster 的每个节点会将集群的配置信息持久化到配置文件中,这就要求确保配置文件是可写的,而且尽量不要依靠人工修改配置文件。

特征

1)去中心化,主节点关系对等

2)解决了数据扩容

3)客户端与服务端缓存槽位信息,以服务端为准,客户节点缓存主要为了避免连接切换

4)可人为迁移数据

5)主节点处理读写命令

流程

1)连接集群中任意一个节点

2)若数据不在该节点,将收到连接切换的命令,继而连接到目标节点

3)故障转移(主节点下移)

  • 集群结点间互相监控,交换节点的状态信息
  • 若某主节点下线,将会被其他主节点标记下线
  • 接着从下线主节点的从节点中选择一个数据最新的从节点作为主节点
  • 从节点继承下线主节点的槽位信息,并广播该消息给集群中的其他节点

缺点

主从异步复制在故障转移时仍存在数据丢失的问题。

故障转移

cluster 集群中节点分为主节点和从节点,其中主节点用于处理槽,而从节点则用于复制该主节点,并在主节点下线时,代替主节点继续处理命令请求。

故障检测

集群中每个节点都会定期地向集群中的其他节点发送 ping 消息,如果接收 ping 消息的节点没有在规定时间内回复 pong消息,那么这个没有回复 pong消息的节点会被标记为 PFAIL(probable fail)。

集群中各个节点会通过互相发送消息的方式来交换集群中各个节点的状态信息;如果在一个集群中,半数以上负责处理槽的主节点都将某个主节点 A 报告为疑似下线,那么这个主节点 A将被标记为下线( FAIL );标记主节点 A 为下线状态的主节点会广播这条消息,其他节点(包括A节点的从节点)也会将A节点标识为FAIL

故障转移

当从节点发现自己的主节点进入 FAIL 状态,从节点将开始对下线主节点进行故障转移:

  • 从数据最新的从节点中选举为主节点;
  • 该从节点会执行 replica no one 命令,称为新的主节点;
  • 新的主节点会撤销所有对已下线主节点的槽指派,并将这些槽全部指派给自己;
  • 新的主节点向集群广播一条 pong 消息,这条 pong 消息可以让集群中的其他节点立即知道这个节点已经由从节点变成主节点,并且这个主节点已经接管了之前下线的主节点;
  • 新的主节点开始接收和自己负责处理的槽有关的命令请求,故障转移结束

集群配置和管理

主要命令
 redis-cli --cluster help# 创建集群create <ip>:<port>--cluster-replicas <num>    # 创建集群的同时,为每个主节点配备的从节点个数# 查看集群的信息,群中任意节点地址作为参数,后面同理info <ip>:<port>    # 检查集群的配置check <ip>:<port># 重分片,将指定数量的槽从源节点迁移至目标节点,由目标节点负责迁移的槽和# 槽中数据reshared <ip>:<port>--cluster-from  # 源节点的ID--cluster-to    # 目标节点的ID--cluster-slots <num> # 需要迁移的槽数量# 添加节点,添加新节点 new 集群 existing,默认添加主节点add-node <new_host>:<port> <existing_host>:<port># 添加从节点,需要以下两个子命令--cluster-slave --cluster-master-id <id> # 设置从节点要复制的主节点# 移除节点del-node <ip>:<port> <id>
搭建集群

设置启动配置文件

# 创建文件夹mkdir -p 7001 7002 7003 7004 7005 7006cd 7001vi 7001.conf# 输入内容pidfile "/home/jtz/redis-data/7001/7001.pid"   logfile "/home/jtz/redis-data/7001/7001.log"    dir /home/mark/redis-data/7001/port 7001       daemonize yes    cluster-enabled yes  cluster-config-file nodes-7001.confcluster-node-timeout 15000# 复制配置cp 7001/7001.conf 7002/7002.confcp 7001/7001.conf 7003/7003.confcp 7001/7001.conf 7004/7004.confcp 7001/7001.conf 7005/7005.confcp 7001/7001.conf 7006/7006.conf​# 修改配置sed -i 's/7001/7002/g' 7002/7002.confsed -i 's/7001/7003/g' 7003/7003.confsed -i 's/7001/7004/g' 7004/7004.confsed -i 's/7001/7005/g' 7005/7005.confsed -i 's/7001/7006/g' 7006/7006.conf​# 创建启动脚本vi start.sh# 输入内容#!/bin/bashredis-server 7001/7001.confredis-server 7002/7002.confredis-server 7003/7003.confredis-server 7004/7004.confredis-server 7005/7005.confredis-server 7006/7006.conf# 创建停止脚本vi stop.shredis-cli -p 7001 shutdownredis-cli -p 7002 shutdownredis-cli -p 7003 shutdownredis-cli -p 7004 shutdownredis-cli -p 7005 shutdownredis-cli -p 7006 shutdown
创建集群
redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 
127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 --cluster-replicas 1

说明:

需要先执行./start.sh启动6个redis服务器再执行创建集群的命令才能让6个服务器成为集群。

查看集群配置信息

搭建成功,查看集群配置信息

 redis-cli --cluster check 127.0.0.1:7001# 集群配置信息M: 6d67700c3a40ea80488a48c232f9459e664bf899 127.0.0.1:7001slots:[0-5460] (5461 slots) master 1 additional replica(s)S: 9a66a88e4b4da0edeb2767d55dbd4623f0f2ec52 127.0.0.1:7004slots: (0 slots) slavereplicates 8b8339a497d07237b1fce6abef45d251132fc594S: 3171812cc5b5e956c142321d6d31e68fa8708872 127.0.0.1:7006slots: (0 slots) slavereplicates e4da2884848793a8deb973fe623097d5089a8031S: be0058062baca91b2a27f884c6cebd59f24f0cd2 127.0.0.1:7005slots: (0 slots) slavereplicates 6d67700c3a40ea80488a48c232f9459e664bf899M: 8b8339a497d07237b1fce6abef45d251132fc594 127.0.0.1:7003slots:[10923-16383] (5461 slots) master1 additional replica(s)M: e4da2884848793a8deb973fe623097d5089a8031 127.0.0.1:7002slots:[5461-10922] (5462 slots) master1 additional replica(s)
测试集群
 redis-cli -c -p 7001127.0.0.1:7001> set name mark-> Redirected to slot [5798] located at 127.0.0.1:7002 # 分配到其他主# 节点存储OK​redis-cli -c -p 7003127.0.0.1:7003> get name-> Redirected to slot [5798] located at 127.0.0.1:7002 # 重定向到存储# 该key的节点"mark"127.0.0.1:7002> 
主从切换
 # 主节点宕机,发生主从切换redis-cli -p 7003 shutdown# 主节点重启redis-server 7003/7003.conf​# 配置信息变化# 初始状态M: 8b8339a497d07237b1fce6abef45d251132fc594 127.0.0.1:7003slots:[10923-16383] (5461 slots) master1 additional replica(s)# 主从切换后,从节点7004替换宕机的主节点7003M: 9a66a88e4b4da0edeb2767d55dbd4623f0f2ec52 127.0.0.1:7004slots:[10923-16383] (5461 slots) master1 additional replica(s)replicates 6d67700c3a40ea80488a48c232f9459e664bf899# 节点7003上线后,成为其他节点的从节点   S: 8b8339a497d07237b1fce6abef45d251132fc594 127.0.0.1:7003slots: (0 slots) slave
扩容

先添加节点,再分配槽位

 # 1、先添加节点# 添加主节点,新添加的节点默认作为主节点redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7001 # 添加从节点redis-cli --cluster add-node 127.0.0.1:7008 127.0.0.1:7001  --cluster-slave --cluster-master-id 5043e35b99e3c3e45241dd7b748502aa8daf544c​# 2、再分配槽# 重分片,将主节点 7001 的 1000 个槽迁移至新的主节点 7007redis-cli --cluster reshard 127.0.0.1:7001 --cluster-from 6d67700c3a40ea80488a48c232f9459e664bf899 --cluster-to 5043e35b99e3c3e45241dd7b748502aa8daf544c --cluster-slots 1000# 对比迁移前后的集群配置# 迁移前M: 6d67700c3a40ea80488a48c232f9459e664bf899 127.0.0.1:7001slots:[0-5460] (5461 slots) master2 additional replica(s)M: 5043e35b99e3c3e45241dd7b748502aa8daf544c 127.0.0.1:7007slots: (0 slots) master# 迁移后M: 6d67700c3a40ea80488a48c232f9459e664bf899 127.0.0.1:7001slots:[1000-5460] (4461 slots) master1 additional replica(s)M: 5043e35b99e3c3e45241dd7b748502aa8daf544c 127.0.0.1:7007slots:[0-999] (1000 slots) master1 additional replica(s)
缩容

先移动槽位,再删除节点

# 1、先移动槽位# 将主节点 7007 的所有槽迁移至主节点 7001redis-cli --cluster reshard 127.0.0.1:7007 --cluster-from 5043e35b99e3c3e45241dd7b748502aa8daf544c --cluster-to 6d67700c3a40ea80488a48c232f9459e664bf899 --cluster-slots 1000# 迁移后的集群配置M: 6d67700c3a40ea80488a48c232f9459e664bf899 127.0.0.1:7001slots:[0-5460] (5461 slots) master2 additional replica(s)M: 5043e35b99e3c3e45241dd7b748502aa8daf544c 127.0.0.1:7007slots: (0 slots) master​# 2、删除节点# 删除节点 7007redis-cli --cluster del-node 127.0.0.1:7007 5043e35b99e3c3e45241dd7b748502aa8daf544c​# 此时7008成为其他节点的从节点M: 6d67700c3a40ea80488a48c232f9459e664bf899 127.0.0.1:7001slots:[0-5460] (5461 slots) master2 additional replica(s)S: 1d5f5827cdb9f294de702f4247d1471fce9545df 127.0.0.1:7008slots: (0 slots) slavereplicates 6d67700c3a40ea80488a48c232f9459e664bf89​# 删除从节点7008redis-cli --cluster del-node 127.0.0.1:7008 1d5f5827cdb9f294de702f4247d1471fce9545df

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

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

相关文章

springsecurity学习笔记-未完

目录 前言 一、概念 1.什么是springsecurity 2.对比shiro 二、开始项目 1.建立一个空项目&#xff0c;建立module&#xff0c;引入相关依赖 2.启动项目&#xff0c;访问项目 3.自定义密码 总结 前言 记录一下学习springsecurity的过程 开发环境&#xff1a;IDEA 一、概念 1.…

解决提交到App Store时的ITMS-90478和ITMS-90062错误

解决提交到App Store时的ITMS-90478和ITMS-90062错误 目录 引言 正文 1. 什么是ITMS-90478和ITMS-90062错误&#xff1f; 2. 解决方法 2.1 确定当前的版本号和构建号 2.2 递增版本号和构建号 2.3 再次尝试提交应用 总结 参考资料 错误记录 摘要&#xff1a;本文为iOS…

鼎鑫鸿鄴引入“能源互联网+”理念 打造共赢

近年来&#xff0c;随着全球能源消耗的不断增长和环境问题的日益突出&#xff0c;清洁能源转型成为全球共同关注的话题。中国作为全球最大的能源消费国&#xff0c;也在积极推动能源结构的优化和清洁能源的发展。鼎鑫鸿鄴新能源科技有限公司在推动清洁能源转型方面制定了一系列…

北太天元安装教程 及使用方法

北太天元是面向科学计算与工程计算的国产通用型科学计算软件。提供科学计算、可视化、交互式程序设计&#xff0c;具备丰富的底层数学函数库&#xff0c;支持数值计算、数据分析、数据可视化、数据优化、算法开发等工作&#xff0c;并通过SDK与API接口&#xff0c;扩展支持各类…

Vite介绍及实现原理

Vite介绍及实现原理 一、Vite简介1.1、什么是Vite1.2 、Vite的主要特性1.3、 为什么要使用Vite 二、Vite的实现原理2.1、依赖处理2.2、静态资源加载2.3、vue文件缓存2.4、 js/ts处理 三、热更新原理四、vite基本使用4.1、安装4.2、搭建项目 一、Vite简介 1.1、什么是Vite Vite…

计算机网络——理论知识总结(上)

开新番&#xff0c;因为博主备考的学校计网只考察1/6的分值&#xff0c;而且定位偏向于送分题&#xff0c;因此在备考时并没有很高强度的复习。本帖基于王道考研的教辅总结归纳&#xff0c;虽然是408的教材&#xff0c;但忽略其中有难度的部分&#xff0c;如计算题、画图题等&a…

如何通过员工工时管理降低企业成本?

作为当今快节奏商业环境的领导者或管理者&#xff0c;掌握员工的工作时间对于控制企业成本和确保每个人都各尽其责至关重要。 员工工时表软件就是这样一款工时跟踪管理解决方案&#xff1a;数字化的工时表有助于保护企业的财务不会被无节制的开支冲垮。然而&#xff0c;引入此…

Spark SQL概述与基本操作

目录 一、Spark SQL概述 &#xff08;1&#xff09;概念 &#xff08;2&#xff09;特点 &#xff08;3&#xff09;Spark SQL与Hive异同 &#xff08;4&#xff09;Spark的数据抽象 二、Spark Session对象执行环境构建 (1)Spark Session对象 &#xff08;2&#xff09;代码演…

Flink on yarn 加载失败plugins失效问题解决

Flink on yarn 加载失败plugins失效问题解决 flink版本&#xff1a;1.13.6 1. 问题 flink 任务运行在yarn集群,plugins加载失效,导致通过扩展资源获取任务参数失效 2. 问题定位 yarn容器的jar包及插件信息,jar包是正常上传 源码定位 加载plugins入口&#xff0c;TaskMana…

TCP三次握手具体过程

四次挥手 1&#xff09;客户端进程发出连接释放报文&#xff0c;并且停止发送数据。释放数据报文首部&#xff0c;FIN1&#xff0c;其序列号为sequ&#xff08;等于前已经传送过来的数据的最后一个字节的序号加1)&#xff0c;此时&#xff0c;客户端进入FIN_WAIT_1&#xff08…

AI新能量!FortiGate NGFW面向数据中心全面集成FortiGuard AI 安全服务

企业IT技术正在以惊人的速度发展&#xff0c;转型最大的领域之一是下一代防火墙&#xff08;NGFW&#xff09;市场。如今&#xff0c;混合云、多云、边缘等多种基础设施形态共存&#xff0c;已经成为大部分企业的常态&#xff0c;不断扩张的攻击面需要不同形态防火墙的安全防护…

若依ruoyi-nbcio如何做一个仿钉钉流程设计器的思考

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 看到有些流程图采用仿钉钉的流程设计&#xff0c;比如下面界面&#xff1a; 这种方式虽然简单&#xff0c…

计算机网络文章荟萃

脑残式网络编程入门(二)&#xff1a;我们在读写Socket时&#xff0c;究竟在读写什么&#xff1f;-网络编程/专项技术区 - 即时通讯开发者社区! 1.什么是 socket - 掘金2.socket 的实现原理 - 掘金本文讲述了 socket 在 linux 操作系统下的数据结构&#xff0c;以及阻塞 IO 利用…

檢測項目簡體字

某些項目可能要求代碼中不允許使用簡體字 安裝stcheck檢查 yarn add stcheck --dev在項目根目錄創建 st.config.json 文件 {"patterns": ["./**/*.(ts|js|tsx|jsx|vue|html)","!**/node_modules/**","!.git/**"],"gitignore&q…

Express框架开发接口之登录与注册API

我们利用nodeexpressmysql开发接口&#xff0c;对数据库数据进行简单增、删、查改等操作。 接口是什么&#xff1f; 接口是 前后端通信的桥梁 简单理解&#xff1a;一个接口就是 服务中的一个路由规则 &#xff0c;根据请求响应结果 接口的英文单词是 API (Application Progra…

Java工具库——FastJson的40个常用方法

那些想看却没看的书&#xff0c;在心里摆满一个图书馆… 工具库介绍 阿里巴巴的 FastJSON&#xff0c;也被称为 Alibaba FastJSON 或阿里巴巴 JSON&#xff0c;是一个高性能的 Java JSON 处理库&#xff0c;用于在 Java 应用程序中解析和生成 JSON 数据。FastJSON 以其卓越的性…

HTTP发起请求与收到响应的大致过程

可以《《透视 HTTP 协议》Windows 10 搭建最小实验环境》搭建环境&#xff0c;之后才能进行下边的操作。 1.鼠标左键点击两下www目录下的start.bat批处理文件。 2.打开Wireshark&#xff0c;然后选择Adapter for loopback traffic capture。 3.然后把tcp.port 80 || udp.…

碳排放数据,各地区的(直辖市数据细分到区县),含shp和xlsx格式,带符号化

这两天推了道路相关的数据&#xff0c;道路线路、客运飞机场、航空、地铁、火车站点等等交通出行类的数据之前都已发过&#xff0c;需要的可以自己翻一翻。 交通运输行业还比较关注的碳排放数据&#xff0c;也整理出来了&#xff0c;有需要的自取。 数据地址&#xff1a; 全…

项目管理工具ConceptDraw PROJECT mac中文版自定义列功能

ConceptDraw PROJECT Mac是一款专业的项目管理工具&#xff0c;适用于MacOS平台。它提供了成功规划和执行项目所需的完整功能&#xff0c;包括任务和资源管理、报告和变更控制。 这款软件可以与ConceptDraw office集成&#xff0c;利用思维导图和数据可视化的强大功能来改进项目…

Microsoft.Extensions 简介

Microsoft.Extensions 简介 一、Microsoft.Extensions 简介 .NET Extensions 是一套官方的、开源的、跨平台的 API 集合&#xff0c;提供了一些常用的编程模式和实用工具&#xff0c;例如依赖项注入、日志记录、缓存、Host以及配置等等。该项目的大多数 API 都被用在 .NET 平…