Linux下安装配置redis详细教程,并配置哨兵模式,redis配置文件中文详解

redis版本为redis-3.2.12,使用工具将安装包上传到data目录。


redis.jpeg

在data目录下创建文件夹redis,将redis安装在此目录。

第一步:解压。

cd data 
tar -zxvf redis-3.2.12.tar.gz

第二步:安装,PREFIX=/data/redis用来设置安装目录。

cd redis-3.2.12/ 
make 
make install PREFIX=/data/redis

到此,redis已经安装完成,剩下就是配置和启动服务。

进入redis目录,创建配置文件conf、日志logs、数据库dump、进程号pid四个目录,用来存放对应的文件,这四个目录也可以存放在其他文件夹,只要与配置文件中的配置一致即可,否则在启动服务时会报错。其中bin目录就是redis安装成功后的一些命令文件。

cd redis
mkdir conf
mkdir logs
mkdir dump
mkdir pid

redis服务配置一主二从,哨兵模式。注意:如果在实际开发中用不到哨兵模式,redis服务配置一主一从即可。

主Redis配置:redis_6379.conf

# Redis配置文件# 请注意,为了读取配置文件,Redis必须以文件路径作为第一个参数启动:
# ./redis-server /data/redis/conf/redis_6379.conf# 加载更多配置文件
# include /path/to/local.conf
# include /path/to/other.conf# 默认Redis不以守护进程的方式运行。如果需要开启修改为"yes"。
# 在该模式下,redis会在后台运行,并将进程pid号写入至redis.conf选项pidfile设置的文件中
# 此时redis将一直运行,除非手动kill该进程。
daemonize yes # 以守护进程运行时,Redis默认会将pid存入/var/run/redis.pid文件中。
# 指定pid存放位置和文件名
pidfile /data/redis/pid/redis_6379.pid# 接收指定端口的连接,默认是6379。
port 6379# 在每秒高请求的环境中,您需要提高backlog的配置,来避免客户端连接速度慢的问题。
# 注意,Linux内核会截断这个值,因此同时修改/proc/sys/net/core/somaxconn和tcp_max_syn_backlog的值,来获得期待的效果。
tcp-backlog 6000 # 默认Redis监听所有能够链接服务器的网络链接。
# 可以使用"bind"配置指令只监听一个或多个接口,后面可以跟一个或多个ip地址。
# bind 192.168.1.100 10.0.0.1
# bind 127.0.0.1
bind 0.0.0.0# 客户端空闲N秒后连接关闭(0表示永不超时)
timeout 0# TCP保活机制,就是为了保证连接的有效性,探测连接的对端是否存活的作用,在间隔一定的时间发探测包,根据回复来确认该连接是否有效。
# Redis3.2.1版本之后默认值为300秒
tcp-keepalive 300# 指定日志级别
# debug(大量新秀,针对开发/测试)
# verbose(大量的有用信息,但不像debug级别那样混乱)
# notice(一般的信息,可以在生产中使用)
# warning(只记录非常重要和关键的消息)
loglevel notice# 指定日志存放位置和日志文件名称
logfile "/data/redis/logs/redis_6379.log"# 设置数据库编号
databases 16# 将数据库数据保存到磁盘策略:
#   save <seconds> <changes>
#   如果给定的秒数和对数据库的修改操作数两个条件同时满足,则都会触发保存。
#   下面的示例中会触发保存:
#   900秒(15分钟)后,如果有1个key被修改
#   300秒(5分钟)后,如果有10个key被修改
#   60秒后,如果有10000个key被修改
save 900 1
save 300 10
save 60 10000# 最近一次保存失败,Redis将停止接受写入。
# 如果保存过程中Redis再次运行,RDB将会允许再次写入。
stop-writes-on-bgsave-error yes# 开启RDB文件压缩,Redis会采用LZF算法进行压缩。
# 如果不想消耗CPU性能来进行文件压缩的话,可以设置为关闭此功能,这样的缺点是需要更多的磁盘空间来保存文件。
rdbcompression yes# 自从RDB 5版本之后CRC64校验被放置在文件末尾。
# 开启RDB文件检查,检查是否有无损坏,如果在启动是检查发现损坏,则停止启动。
rdbchecksum yes# 转储数据库的文件名
dbfilename dump_6379.rdb# 指定转储数据库存放目录,必须指定
dir /data/redis/dump# 主从复制关系,主redis不需要配置,从redis需要配置
# slaveof <masterip> <masterport># 如果主redis设置了密码,则从redis必须设置masterauth,否则主从数据同步会被拒绝。
# masterauth nxredis@YH# 当从redis与主redis失去连接时,或者正在同步数据时,从机有两种工作方式:
# 1.如果slave serve stale data设置为“yes”(默认值),则slave仍会回复客户端请求,可能会包含过期数据,或者如果这是第一次同步,则数据集可能为空。
# 2.如果slave serve stale data设置为“no”,则slave将对除INFO和SLAVEOF之外的所有类型的命令回复错误“正在与主机同步”。
slave-serve-stale-data yes# Redis2.6版本之后默认情况下从机为只读。
slave-read-only yes# 主从同步策略: 是否开启无磁盘交互模式.
# 1) 磁盘备份: 主Redis创建一个新进程,将RDB文件写入磁盘。然后该文件由父进程以增量方式同步到从Redis内存。
# 2) 无磁盘交互模式: 主Redis创建一个新进程直接将RDB文件同步到从Redis内存。
repl-diskless-sync no# 在进行无磁盘交互模式下Redis从库的延迟时间
repl-diskless-sync-delay 5# 从Redis以设定的间隔时间向主Redis发送ping,默认为10秒。
# repl-ping-slave-period 10# 主从同步超时时间,该值必须大于ping的时间间隔。
# repl-timeout 60# 第一次数据同步后是否采用延迟策略。
# 设置成yes,则redis会合并小的TCP包从而节省带宽,但会增加同步延迟(40ms),造成master与slave数据不一致。
# 设置成no,则redis master会立即发送同步数据,没有延迟
repl-disable-tcp-nodelay no# 缓冲复制队列大小
# repl-backlog-size 1mb# 缓冲复制队列存活时长,0表示永远有效
# repl-backlog-ttl 3600# 主Redis宕机后,选取从Redis时根据该设置的优先级选取,该值越小优先级越大。
# 如果多个从Redis优先级相同,则选取复制内容越完整的当选。
# 如果优先级和内容复制都相同,则选取runid最小的。
# 设置为0表示永不能当选为主Redis。
# 默认值为100
slave-priority 100# 设置访问密码,密码尽可能复杂,以免被攻击破解。
# 注意,主redis设置了密码,则从redis必须设置masterauth,否则主从数据同步会被拒绝。
requirepass nxredis@YH#设置客户端同时最大连接数,默认情况下10000。
maxclients 1024# 内存大小配置
# 1k => 1000 bytes
# 1kb => 1024 bytes
# 1m => 1000000 bytes
# 1mb => 1024*1024 bytes
# 1g => 1000000000 bytes
# 1gb => 1024*1024*1024 bytes
# 单位不区分大小写,所以1GB 1Gb 1gB时相同的含义
maxmemory 1073741824# 内存回收策略
# 1.volatile-lru:从设置了过期时间的数据集中,选择最近最久未使用的数据释放。
# 2.allkeys-lru:从数据集中(包括设置过期时间以及未设置过期时间的数据集中),选择最近最久未使用的数据释放。
# 3.volatile-random:从设置了过期时间的数据集中,随机选择一个数据进行释放。
# 4.allkeys-random:从数据集中(包括了设置过期时间以及未设置过期时间)随机选择一个数据进行入释放。
# 5.volatile-ttl:从设置了过期时间的数据集中,选择马上就要过期的数据进行释放操作。
# 6.noeviction:不删除任意数据(但redis还会根据引用计数器进行释放呦~),这时如果内存不够时,会直接返回错误。
# 默认回收策略为:noeviction
# maxmemory-policy noeviction# LRU和TTL不是精确算法,而是近似算法。
# Redis默认将检查5个key并选择释放最近使用最少的key,因此可以通过调整该值来提高速度或精度。
# 该配置只对1-5的回收策略有效。
# 10非常接近真实的LRU,但需要更多的CPU。
# 3很快,但不是很准确。
# maxmemory-samples 5# Redis默认采用异步的方式将数据存放到磁盘上,这个模式对大部份应用来说是足够好的。
# AOF与RDB模式可以同时启用,默认AOF模式不启用,所以以下众多AOF配置不起作用。
appendonly noappendfilename "appendonly_6379.aof"# no: 不即时同步,由操作系统控制何时刷写到磁盘上,这种模式速度最快。
# always: 每次只写日志,速度较慢,但最安全。
# everysec: 每秒钟同步一次,折中的方案。
appendfsync everysecno-appendfsync-on-rewrite noauto-aof-rewrite-percentage 100auto-aof-rewrite-min-size 64mbaof-load-truncated yes# lua脚本的最大运行时间,单位是毫秒。
lua-time-limit 5000# slog log是用来记录redis运行中执行比较慢的命令耗时。slog log保存在内存中。
# 执行时间比slowlog-log-slower-than大的请求命令记录到slowlog里面,单位是微秒,所以1000000就是1秒。
slowlog-log-slower-than 10000# 最大保存命令条数
slowlog-max-len 128# 延迟监控,默认关闭。
latency-monitor-threshold 0# 使得客户端可以通过订阅频道或模式,来接收那些以某种方式改动了 Redis 数据集的事件。
# 因为开启键空间通知功能需要消耗一些 CPU ,所以在默认配置下,该功能处于关闭状态。
# 该配置可以是以下字符的任意组合
#  K     Keyspace events, published with __keyspace@<db>__ prefix.
#  E     Keyevent events, published with __keyevent@<db>__ prefix.
#  g     Generic commands (non-type specific) like DEL, EXPIRE, RENAME, ...
#  $     String commands
#  l     List commands
#  s     Set commands
#  h     Hash commands
#  z     Sorted set commands
#  x     Expired events (events generated every time a key expires)
#  e     Evicted events (events generated when a key is evicted for maxmemory)
#  A     Alias for g$lshzxe, so that the "AKE" string means all the events.
notify-keyspace-events ""# ziplist中允许存储的最大条目个数,默认为512,建议为128
hash-max-ziplist-entries 512# ziplist中允许条目value值最大字节数,默认为64,建议为1024
hash-max-ziplist-value 64# -5: 每个quicklist节点上的ziplist大小不能超过64 Kb。
# -4: 每个quicklist节点上的ziplist大小不能超过32 Kb。
# -3: 每个quicklist节点上的ziplist大小不能超过16 Kb。
# -2: 每个quicklist节点上的ziplist大小不能超过8 Kb。(-2是Redis给出的默认值)
# -1: 每个quicklist节点上的ziplist大小不能超过4 Kb。
list-max-ziplist-size -2# quicklist两端不被压缩的节点个数。
list-compress-depth 0set-max-intset-entries 512zset-max-ziplist-entries 128
zset-max-ziplist-value 64hll-sparse-max-bytes 3000# Redis将在每100毫秒时使用1毫秒的CPU时间来对redis的hash表进行重新hash,可以降低内存的使用。
# 当你的使用场景中,有非常严格的实时性需要,不能够接受Redis时不时的对请求有2毫秒的延迟的话,把这项配置为no。
# 如果没有这么严格的实时性要求,可以设置为yes,以便能够尽可能快的释放内存。
activerehashing yes# normal -> normal clients including MONITOR clients
# slave  -> slave clients
# pubsub -> clients subscribed to at least one pubsub channel or pattern
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60# 默认值为10。
# Redis会调用一个内部函数来执行许多后台任务,例如在超时时关闭客户端的连接,清除从未请求的过期密钥等等。
# 该值越大,后台任务执行的越及时,但是会消耗更多的CPU。
hz 10# 在aof重写的时候,如果打开了aof-rewrite-incremental-fsync开关,系统会每32MB执行一次fsync。
# 这对于把文件写入磁盘是有帮助的,可以避免过大的延迟峰值
aof-rewrite-incremental-fsync yes

从Redis配置,redis_6380.conf和redis_6381.conf,与主Redis配置基本上一样,不一样的地方在于端口、数据库、日志、pid文件名称,都以6380或6381为标志,最重要的地方是建立主从关系和同步验证。

# 设置主Redis的地址和端口,该Redis为从节点
# 主从复制关系,主redis不需要配置,从redis需要配置
slaveof 127.0.0.1 6379# 设置访问密码,密码尽可能复杂,以免被攻击破解。
# 注意,主redis设置了密码,则从redis必须设置masterauth,否则主从数据同步会被拒绝。
# requirepass nxredis@YH
# 如果主redis设置了密码,则从redis必须设置masterauth,否则主从数据同步会被拒绝。
masterauth nxredis@YH

注意:对只使用redis服务,只需要在主Redis里面配置requirepass,在从Redis里面配置masterauth,密码保持一致,密码尽可能复杂,以免被攻击破解。

注意:对只使用redis服务,如果从Redis也有必要加入访问验证,也可以设置requirepass,而且密码可以与主Redis密码不同。

将配置文件放置到/data/redis/conf目录下,然后就可以启动服务了。

启动服务要按照主从顺序依次启动。

cd /data/redis/bin
./redis-server /data/redis/conf/redis_6379.conf
./redis-server /data/redis/conf/redis_6380.conf
./redis-server /data/redis/conf/redis_6381.conf

查看服务启动情况:

ps -ef|grep redis

也可以通过查看日志文件来确认服务是否正常启动。

通过客户端登录Redis验证数据同步情况:

主Redis登录验证,设置数据:

cd /data/redis/bin
./redis-cli
auth nxredis@YH
set name zqz

从Redis登录,获取数据:从Redis并没有设置密码,所以无需验证就可以操作。

./redis-cli -p 6380 
get name

配置哨兵模式:

Redis Sentinel集群通常由3到5个节点组成,如果个别节点挂了,集群还可以正常运作。Sentinel负责监控Redis集群的健康情况。

如果主Redis挂掉,Sentinel集群会通过投票选择一个新的主Redis。当原来的主Redis恢复时,它会被当做新的主Redis的从Redis重新加入Redis集群。

设置连接master和slave的密码,需要注意的是sentinel不能分别为master和slave设置不同的密码,因此master和slave的密码必须设置相同。也就是说主Redis和从Redis都必须设置requirepass和masterauth,而且密码必须相同。

sentinel.conf配置信息:

protected-mode no
port 26379
sentinel myid a2b0854207a29e03e256b9628a18538c9a16a38b
# 监控的主节点的名字、IP 和端口,最后一个1表示有1台 Sentinel 发现有问题,就会发生故障转移
sentinel monitor redisYH 127.0.0.1 6379 1
# sentinel日志
logfile "/data/redis/logs/sentinel.log"
# Generated by CONFIG REWRITE
dir "/data/redis/"
# 密码验证,通过添加主节点的密码,对主Redis的运行状态做监控
sentinel auth-pass redisYH nxredis@YH
sentinel config-epoch redisYH 0
sentinel leader-epoch redisYH 115744
sentinel current-epoch 115744

将该配置文件放置到/data/redis/conf目录下,启动sentinel服务:

./server-sentinel /data/redis/conf/sentinel.conf

验证sentinel是否起作用,可以手工shutdown掉主Redis。

./redis-cli 
auth nxredis@YH 
shutdown

这时从Redis想要访问主Redis同步数据就会提示错误信息:

Connecting to MASTER 127.0.0.1:6379 
MASTER <-> SLAVE sync started 
Error condition on socket for SYNC: Connection refused

sentinel在监测到主Redis宕机之后,通过选举,将一个从Redis选定为新的主Redis。通过查看sentinel日志可以发现,选定6380为新的主Redis,同时将另外两个Redis作为从Redis。

switch-master redisYH 127.0.0.1 6379 127.0.0.1 6380
slave slave 127.0.0.1:6381 127.0.0.1 6381 @ redisYH 127.0.0.1 6380
slave slave 127.0.0.1:6379 127.0.0.1 6379 @ redisYH 127.0.0.1 6380

注意:选定6380为主Redis后,所有的配置文件都会被修改,主要是重新建立主从关系。

6379会新增:slaveof 127.0.0.1 6380

6380会删掉:slaveof 127.0.0.1 6379

6381会修改:slaveof 127.0.0.1 6380

由于6379服务已经关掉,所以虽然sentinel将6379作为6380的从服务,但是没有真正的建立。

重新启动6379服务,这时sentinel会重建建立一次主从关系:

convert-to-slave slave 127.0.0.1:6379 127.0.0.1 6379 @ redisYH 127.0.0.1 6380


喜欢的朋友记得点赞、收藏、关注哦!!!

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

R语言数据分析案例45-全国汽车销售数据分析(可视化与回归分析)

一、研究背景 随着经济的发展和人们生活水平的提高&#xff0c;汽车已经成为人们日常生活中不可或缺的交通工具之一。汽车市场的规模不断扩大&#xff0c;同时竞争也日益激烈。对于汽车制造商和经销商来说&#xff0c;深入了解汽车销售数据背后的规律和影响因素&#xff0c;对…

Java 网络编程:Socket 与网络通信

1 引言 在古代&#xff0c;由于通信不便利&#xff0c;人们利用鸽子的飞行能力和方向辨识能力&#xff0c;驯化鸽子进行消息传递&#xff0c;即所谓的“飞鸽传书”。在现代计算机网络中&#xff0c;套接字&#xff08;Socket&#xff09;扮演了类似的角色。套接字是应用程序通…

编程之路,从0开始:结构体详解

目录 前言 正文 1、结构体引入 2、结构体的声明 3、typedef 4、结构体的匿名声明 5、结构的自引用 &#xff08;1&#xff09;链表 &#xff08;2&#xff09;自引用 6、结构体内存对齐 &#xff08;1&#xff09;对齐规则 &#xff08;2&#xff09;题目 &#x…

Flink监控checkpoint

Flink的web界面提供了一个选项卡来监控作业的检查点。这些统计信息在任务终止后也可用。有四个选项卡可以显示关于检查点的信息:概述(Overview)、历史(History)、摘要(Summary)和配置(Configuration)。下面依次来看这几个选项。 Overview Tab Overview选项卡列出了以…

04-转录组下游分析-标准化、聚类、差异分析

准备工作 1.数据标准化 标准化前需要进行数据预处理 过滤低表达的基因&#xff0c;并检查是否有异常样本 以下是常见的几种过滤方式&#xff08;过滤的标准都可以自己调整&#xff09; 1&#xff1a;在至少在75%的样本中都表达的基因&#xff08;表达是指在某个样本中count值…

常见网络厂商设备默认用户名/密码大全

常见网络厂商的默认用户名/密码 01 思科 (Cisco) 设备类型&#xff1a;路由器、交换机、防火墙、无线控制器 默认用户名&#xff1a;cisco 默认密码&#xff1a;cisco 设备类型&#xff1a;网管型交换机 默认用户名&#xff1a;admin 默认密码&#xff1a;admin 02 华…

Spring 与 Spring MVC 与 Spring Boot三者之间的区别与联系

一.什么是Spring&#xff1f;它解决了什么问题&#xff1f; 1.1什么是Spring&#xff1f; Spring&#xff0c;一般指代的是Spring Framework 它是一个开源的应用程序框架&#xff0c;提供了一个简易的开发方式&#xff0c;通过这种开发方式&#xff0c;将避免那些可能致使代码…

【热门主题】000055 网络安全:构筑数字时代的坚固防线

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 【热…

鸿蒙中位置权限和相机权限

1.module.json5中添加相关权限和string.json中配置信息 2. import { hilog } from kit.PerformanceAnalysisKit; import { TAG } from ohos/hypium/src/main/Constant; import { bundleManager, common } from kit.AbilityKit; import { abilityAccessCtrl } from kit.Ability…

2024.6使用 UMLS 集成的基于 CNN 的文本索引增强医学图像检索

Enhancing Medical Image Retrieval with UMLS-Integrated CNN-Based Text Indexing 问题 医疗图像检索中&#xff0c;图像与相关文本的一致性问题&#xff0c;如患者有病症但影像可能无明显异常&#xff0c;影响图像检索系统准确性。传统的基于文本的医学图像检索&#xff0…

H.264/H.265播放器EasyPlayer.js网页直播/点播播放器关于播放的时候就有声音

EasyPlayer.js H5播放器&#xff0c;是一款能够同时支持HTTP、HTTP-FLV、HLS&#xff08;m3u8&#xff09;、WS、WEBRTC、FMP4视频直播与视频点播等多种协议&#xff0c;支持H.264、H.265、AAC、G711A、Mp3等多种音视频编码格式&#xff0c;支持MSE、WASM、WebCodec等多种解码方…

Redis 的代理类注入失败,连不上 redis

在测试 redis 是否成功连接时&#xff0c;发现 bean 没有被创建成功&#xff0c;导致报错 根据报错提示&#xff0c;需要我们添加依赖&#xff1a; <dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId>&l…

Prometheus结合K8s(一)搭建

公司之前K8s集群没有监控&#xff0c;top查看机器cpu使用率很高&#xff0c;为了监控pod的cpu和内存&#xff0c;集群外的mysql资源&#xff0c;初步搭建了Prometheus监控系统 提前准备镜像 docker.io/grafana/grafana 10.4.4 docker.io/prom/prometheus v2.47.2 docker.io/…

Vscode/Code-server无网环境安装通义灵码

Date: 2024-11-18 参考材料&#xff1a;https://help.aliyun.com/zh/lingma/user-guide/individual-edition-login-tongyi-lingma?spma2c4g.11186623.0.i0 1. 首先在vscode/code-server插件市场中安装通义插件&#xff0c;这步就不细说了。如果服务器没网&#xff0c;会问你要…

【划分型DP-约束划分个数】力扣813. 最大平均值和的分组

给定数组 nums 和一个整数 k 。我们将给定的数组 nums 分成 最多 k 个非空子数组&#xff0c;且数组内部是连续的 。 分数 由每个子数组内的平均值的总和构成。 注意我们必须使用 nums 数组中的每一个数进行分组&#xff0c;并且分数不一定需要是整数。 返回我们所能得到的最…

IDEA:2023版远程服务器debug

很简单&#xff0c;但是很多文档没有写清楚&#xff0c;wocao 一、首先新建一个远程jvm 二、配置 三、把上面的参数复制出来 -agentlib:jdwptransportdt_socket,servery,suspendn,address5005 四、然后把这串代码放到服务器中 /www/server/java/jdk1.8.0_371/bin/java -agentl…

centos安装jenkins

本机使用虚拟机centos 7.9.2009 安装gitlab&#xff0c;本机的虚拟机ip地址是 192.168.60.151&#xff0c; 步骤记录如下 1、下载jenkins&#xff0c;安装jenkins之前需要安装jdk jdk和jenkins的版本对应关系参考&#xff1a;Redhat Jenkins Packages Index of /redhat-stable…

蜀道山CTF<最高的山最长的河>出题记录

出这道题的最开始感觉就是,因为现在逆向的形式好多,我最开始学习的时候,经常因为很多工具,或者手段完全不知道,就很懵逼,很多师傅都出了各种类型的,我就想着给以前的"自己"出一道正常exe,慢慢调的题,为了不那么简单,我就选择了C(究极混淆,可能比rust好点),让大家无聊…

中伟视界:AI智能分析算法如何针对非煤矿山的特定需求,提供定制化的安全生产解决方案

非煤矿山智能化改造&#xff0c;除了政策文件&#xff0c;上级监管单位需要安装的AI智能分析算法功能之外的&#xff0c;矿方真正关心的&#xff0c;能解决矿方安全生产隐患的AI智能分析算法功能有哪些呢&#xff1f; 经过与矿方的现场交流沟通&#xff0c;收集第一现场人员对安…

如何生成python项目需要的最小requirements.txt文件?

今天咱们来聊聊 Python 项目中如何生成一个“最小的” requirements.txt 文件。我们都知道&#xff0c;当我们开发一个 Python 项目的时候&#xff0c;很多时候都会在一个虚拟环境中进行&#xff0c;这样一来&#xff0c;就能避免不同项目之间的依赖冲突。 可有时候&#xff0c…