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

Redis高阶集群搭建+集群读写

问题

        容量不够,redis 如何进行扩容?并发写操作, redis 如何分摊?另外,主从模式,薪火相传模式,主机宕机,导致 ip 地址发生变化,应用程序中配置需要修改对应的主机地址、端口等信息。

之前通过代理主机来解决,但是 redis7.0 中提供了解决方案。就是 无中心化集群 配置:即每个节点都可以和其他节点进行联系。如 A、B、C 节点。想访问 B 节点,可以先访问 A 节点,A 节点会去联系 B 节点。无须代理服务器或者负载均衡去找对应的节点

什么是集群

        Redis 集群实现了对 Redis 的水平扩容,即启动 N 个 redis 节点,将整个数据库分布存储在这 N 个节点中,每个节点存储总数据的 1/N。

        Redis 集群通过分区(partition)来提供一定程度的可用性(availability):即使集群中有一部分节点失效或者无法进行通讯,集群也可以继续处理命令请求。

环境准备

  • 将 rdb、aof 文件都删除掉
  • 三台虚拟机,新建目录/myredis/cluster
  • 制作 6 个实例,三主三从,三主机端口分别为 6381,6383,6385。三从机端口分别为6382,6384,6386(具体端口视情况)
  • 每一个配置文件的基本信息修改(和 主从复制 - 哨兵模式 一样)
    • 开启 daemonize yes
    • 指定 6 个端口,不能重复
    • 6 个 Pid 文件名字配置,不能重复,尽量以加上端口进行识别
    • 6 个 Log 文件名字,不能重复,尽量以加上端口进行识别
    • 6 个 dump.rdb 名字,不能重复,尽量以加上端口进行识别
    • Appendonly 关掉或者换名字
  • 每一个配置文件的集群信息修改
    • cluster-enabled yes:打开集群模式
    • cluster-config-file nodes-6379.conf:设定节点配置文件名
    • cluster-node-timeout 15000:设定节点失联时间,超过该时间(毫秒),集群自动进行主从切换

配置文件模板(替换端口号):

[root@redis-cluster2 cluster]# cat redisCluster6383.conf 
bind 0.0.0.0
daemonize yes
protected-mode no
logfile "/myredis/cluster/cluster6383.log"
pidfile /myredis/cluster6383.pid
dir /myredis/cluster
dbfilename dump6383.rdb
appendonly yes
appendfilename "appendonly6383.aof"
requirepass 111111
masterauth 111111
port 6383cluster-enabled yes
cluster-config-file nodes-6383.conf
cluster-node-timeout 5000

将以上配置文件分别写入到三台虚拟机中,每个虚拟机其两个redis服务,使用redis-server指定配置文件启动

[root@redis-cluster2 cluster]# redis-server /myredis/cluster/redisCluster6383.conf 
[root@redis-cluster2 cluster]# redis-server /myredis/cluster/redisCluster6384.conf 
[root@redis-cluster2 cluster]# ps -ef | grep redis
root        1950       1  0 15:38 ?        00:00:00 redis-server 0.0.0.0:6383 [cluster]
root        1956       1  0 15:38 ?        00:00:00 redis-server 0.0.0.0:6384 [cluster]
root        1962    1569  0 15:38 pts/0    00:00:00 grep --color=auto redis

通过命令redis-cli为集群构建主从关系

[root@k8s-master01 cluster]# redis-cli -a 111111 --cluster create --cluster-replicas 1 192.168.58.129:6381 192.168.58.129:6382 192.168.58.130:6383 192.168.58.130:6384 192.168.58.212:6385 192.168.58.212:6386
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.58.130:6384 to 192.168.58.129:6381
Adding replica 192.168.58.212:6386 to 192.168.58.130:6383
Adding replica 192.168.58.129:6382 to 192.168.58.212:6385
M: 772165af2d8a6b4600833ff36f33d1fe02acfa96 192.168.58.129:6381slots:[0-5460] (5461 slots) master
S: 5edb851c0aa5de08924f1d079c21b668e74e14ab 192.168.58.129:6382replicates c1e8aaf10e92cd3aebffe1247d8c99a9d857e916
M: e722f20399055c4543aa5a60697a1c6cebfe8e06 192.168.58.130:6383slots:[5461-10922] (5462 slots) master
S: afc75f35d9856b15040460f3373fd658907e1cc8 192.168.58.130:6384replicates 772165af2d8a6b4600833ff36f33d1fe02acfa96
M: c1e8aaf10e92cd3aebffe1247d8c99a9d857e916 192.168.58.212:6385slots:[10923-16383] (5461 slots) master
S: a256bdaeafd97ff59a4e59d994046ff102e7509b 192.168.58.212:6386replicates e722f20399055c4543aa5a60697a1c6cebfe8e06
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
.
>>> Performing Cluster Check (using node 192.168.58.129:6381)
M: 772165af2d8a6b4600833ff36f33d1fe02acfa96 192.168.58.129:6381slots:[0-5460] (5461 slots) master1 additional replica(s)
S: afc75f35d9856b15040460f3373fd658907e1cc8 192.168.58.130:6384slots: (0 slots) slavereplicates 772165af2d8a6b4600833ff36f33d1fe02acfa96
S: 5edb851c0aa5de08924f1d079c21b668e74e14ab 192.168.58.129:6382slots: (0 slots) slavereplicates c1e8aaf10e92cd3aebffe1247d8c99a9d857e916
M: e722f20399055c4543aa5a60697a1c6cebfe8e06 192.168.58.130:6383slots:[5461-10922] (5462 slots) master1 additional replica(s)
S: a256bdaeafd97ff59a4e59d994046ff102e7509b 192.168.58.212:6386slots: (0 slots) slavereplicates e722f20399055c4543aa5a60697a1c6cebfe8e06
M: c1e8aaf10e92cd3aebffe1247d8c99a9d857e916 192.168.58.212:6385slots:[10923-16383] (5461 slots) master1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[root@k8s-master01 cluster]# ll
total 52
drwxr-xr-x. 2 root root  4096 Dec  1 15:30 appendonlydir
-rw-r--r--. 1 root root 10718 Dec  1 15:50 cluster6381.log
-rw-r--r--. 1 root root 15205 Dec  1 15:50 cluster6382.log
-rw-r--r--. 1 root root   171 Dec  1 15:49 dump6382.rdb
-rw-r--r--. 1 root root   799 Dec  1 15:49 nodes-6381.conf
-rw-r--r--. 1 root root   811 Dec  1 15:49 nodes-6382.conf
-rw-r--r--. 1 root root   347 Dec  1 15:32 redisCluster6381.conf
-rw-r--r--. 1 root root   346 Dec  1 15:32 redisCluster6382.conf

以6381为切入点查看集群状态

[root@k8s-master01 cluster]# redis-cli -a 111111 -p 6381
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6381> 
127.0.0.1:6381> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.58.130,port=6384,state=online,offset=224,lag=0
master_failover_state:no-failover
master_replid:6955624b397904832e2911972f1c9b871e8b86fc
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:224
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:224
127.0.0.1:6381> 

集群指令

查看集群信息

127.0.0.1:6381> cluster nodes
afc75f35d9856b15040460f3373fd658907e1cc8 192.168.58.130:6384@16384 slave 772165af2d8a6b4600833ff36f33d1fe02acfa96 0 1733039642782 1 connected
5edb851c0aa5de08924f1d079c21b668e74e14ab 192.168.58.129:6382@16382 slave c1e8aaf10e92cd3aebffe1247d8c99a9d857e916 0 1733039641297 5 connected
e722f20399055c4543aa5a60697a1c6cebfe8e06 192.168.58.130:6383@16383 master - 0 1733039641617 3 connected 5461-10922
a256bdaeafd97ff59a4e59d994046ff102e7509b 192.168.58.212:6386@16386 slave e722f20399055c4543aa5a60697a1c6cebfe8e06 0 1733039641067 3 connected
c1e8aaf10e92cd3aebffe1247d8c99a9d857e916 192.168.58.212:6385@16385 master - 0 1733039640849 5 connected 10923-16383
772165af2d8a6b4600833ff36f33d1fe02acfa96 192.168.58.129:6381@16381 myself,master - 0 1733039639000 1 connected 0-5460

查看键的插槽值

cluster keyslot k1
192.168.58.129:6381> cluster keyslot k1
(integer) 12706
192.168.58.129:6381> cluster keyslot k2
(integer) 449

查看插槽值里有几个key

cluster countkeysinslot 4847             #只能看自己插槽的值

查询集群中的值 

cluster getkeysinslot <slot> <count>     #返回 count 个 slot 槽中的键

 查看单节点

127.0.0.1:6381> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:1226
cluster_stats_messages_pong_sent:1199
cluster_stats_messages_sent:2425
cluster_stats_messages_ping_received:1194
cluster_stats_messages_pong_received:1226
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:2425
total_cluster_links_buffer_limit_exceeded:0

集群读写

在6381进行写操作时,set k1出现报错,显示到6385进行写,操作,set k2 却可以执行成功,这是为什么呢?

127.0.0.1:6381> set k1 v1
(error) MOVED 12706 192.168.58.212:6385
127.0.0.1:6381> set k2 v2
OK
127.0.0.1:6381> keys *
1) "k2"
127.0.0.1:6381> 

是因为集群在创建时,分配了三个槽位,必须在各自的槽位进行写操作 

 

如何解决?

防止路由失效,添加参数-c并新增两个key 

127.0.0.1:6381> FLUSHALL
OK
127.0.0.1:6381> keys *
(empty array)
127.0.0.1:6381> quit
[root@k8s-master01 cluster]# redis-cli -a 111111 -p 6381 -c
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6381> 
127.0.0.1:6381> 
127.0.0.1:6381> keys *
(empty array)
127.0.0.1:6381> set k1 v1 
-> Redirected to slot [12706] located at 192.168.58.212:6385
OK
192.168.58.212:6385> 
192.168.58.212:6385> set k2 v2 
-> Redirected to slot [449] located at 192.168.58.129:6381
OK

相关文章:

Redis高阶集群搭建+集群读写

问题 容量不够&#xff0c;redis 如何进行扩容&#xff1f;并发写操作&#xff0c; redis 如何分摊&#xff1f;另外&#xff0c;主从模式&#xff0c;薪火相传模式&#xff0c;主机宕机&#xff0c;导致 ip 地址发生变化&#xff0c;应用程序中配置需要修改对应的主机地址、端…...

Vision Transformer(vit)的主干

图解&#xff1a; 代码&#xff1a; class VisionTransformer(nn.Module):def __init__(self, img_size224, patch_size16, in_c3, num_classes1000,embed_dim768, depth12, num_heads12, mlp_ratio4.0, qkv_biasTrue,qk_scaleNone, representation_sizeNone, distilledFalse,…...

手撸了一个文件传输工具

在日常的开发与运维中&#xff0c;文件传输工具是不可或缺的利器。无论是跨服务器传递配置文件&#xff0c;还是快速从一台机器下载日志文件&#xff0c;一个高效、可靠且简单的文件传输工具能够显著提高工作效率。今天&#xff0c;我想分享我自己手撸一个文件传输工具的全过程…...

Java程序调kubernetes(k8s1.30.7)core API简单示例,并解决403权限验证问题,即何进行进行权限授权以及验证

简单记录问题 一、问题描述 希望通过Java程序使用Kubernetes提供的工具包实现对Kubernetes集群core API的调用&#xff0c;但是在高版本上遇见权限验证问题4xx。 <dependency><groupId>io.kubernetes</groupId><artifactId>client-java</artifact…...

java八股-Redis Stream和RocketMQ实现的解决方案

文章目录 Redis Stream方案&#xff1a;ShortLinkStatsSaveProducer.javaShortLinkStatsSaveConsumer.java RocketMQ方案ShortLinkStatsSaveProducer.javaShortLinkStatsSaveConsumer.java Redis Stream方案&#xff1a; ShortLinkStatsSaveProducer.java package com.nageoff…...

第29天 MCU入门

目录 MCU介绍 MCU的组成与作用 电子产品项目开发流程 硬件开发流程 常用元器件初步了解 硬件原理图与PCB板 常见电源符号和名称 电阻 电阻的分类 贴片电阻的封装说明&#xff1a; 色环电阻的计算 贴片电阻阻值计算 上拉电阻与下拉电阻 电容 电容的读数 二极管 LED 灯电路 钳位作…...

【Python网络爬虫笔记】6- 网络爬虫中的Requests库

一、概述 Requests 是一个用 Python 语言编写的、简洁且功能强大的 HTTP 库。它允许开发者方便地发送各种 HTTP 请求&#xff0c;如 GET、POST、PUT、DELETE 等&#xff0c;并且可以轻松地处理请求的响应。这个库在 Python 生态系统中被广泛使用&#xff0c;无论是简单的网页数…...

Linux网络_网络协议_网络传输_网络字节序

一.协议 1.概念 协议&#xff08;Protocol&#xff09; 是一组规则和约定&#xff0c;用于定义计算机网络中不同设备之间如何进行通信和数据交换。协议规定了数据的格式、传输方式、传输顺序等详细规则&#xff0c;确保不同设备和系统能够有效地互联互通。 在网络通信中&#…...

浅谈网络 | 应用层之流媒体与P2P协议

目录 流媒体名词系列视频的本质视频压缩编码过程如何在直播中看到帅哥美女&#xff1f;RTMP 协议 P2PP2P 文件下载种子文件 (.torrent)去中心化网络&#xff08;DHT&#xff09;哈希值与 DHT 网络DHT 网络是如何查找 流媒体 直播系统组成与协议 近几年直播比较火&#xff0c;…...

css vue vxe-text-ellipsis table 实现多行文本超出隐藏省略

分享 vxe-text-ellipsis table grid 多行文本溢出省略的用法 正常情况下如果需要使用文本超出隐藏&#xff0c;通过 css 就可以完成 overflow: hidden; text-overflow: ellipsis; white-space: nowrap;但是如果需要实现多行文本溢出&#xff0c;就很难实现里&#xff0c;谷歌…...

基于hexo框架的博客搭建流程

这篇博文讲一讲hexo博客的搭建及文章管理&#xff0c;也算是我对于暑假的一个交代 &#xff01;&#xff01;&#xff01;注意&#xff1a;下面的操作是基于你已经安装了node.js和git的前提下进行的&#xff0c;并且拥有github账号 创建一个blog目录 在磁盘任意位置创建一个…...

数据结构-简单排序

一.前提 二.冒泡排序 三.插入排序 #include<iostream> using namespace std; typedef int ElemengType; void Bubble_Sort(ElemengType A[], int N) {for (int p N - 1; p > 0; p--) {int flag 0;for (int i 0; i < p; i) {if (A[i] > A[i 1]) {swap(A[i], …...

三十一:HTTP多种重定向跳转方式的差异

在现代网站开发中&#xff0c;HTTP 重定向是一种常见的技术&#xff0c;用于将用户的请求从一个 URL 跳转到另一个 URL。重定向机制广泛应用于网站迁移、SEO 优化、以及内容管理系统中。不同的 HTTP 状态码代表不同的重定向方式&#xff0c;每种方式的行为和适用场景各有不同。…...

利用Python爬虫精准获取淘宝商品详情的深度解析

在数字化时代&#xff0c;数据的价值日益凸显&#xff0c;尤其是在电子商务领域。淘宝作为中国最大的电商平台之一&#xff0c;拥有海量的商品数据&#xff0c;对于研究市场趋势、分析消费者行为等具有重要意义。本文将详细介绍如何使用Python编写爬虫程序&#xff0c;精准获取…...

架构师的英文:Architect

中文版 软件架构师 的英文是 “Software Architect”。 Software: 软件Architect: 架构师&#xff0c;通常指的是设计和规划某种系统或结构的人。 Software Architect 通常负责软件系统的整体设计、技术选型、架构规划&#xff0c;确保系统的可扩展性、可维护性和高效性等。…...

数据结构 ——— 计数排序算法的实现

目录 计数排序算法的思想 计数排序算法的实现 计数排序算法的思想 遍历数组&#xff0c;找出数组中的最大值 max 和 最小值 min 最大值 max 减去最小值 min 再加 1 得出数组元素的范围 range 利用 range 的大小 malloc 一个 count 数组用来计数 再对 count 数组进行初始化…...

k8s搭建Istio环境,案例pod一直处在Init:CrashLoopBackOff

1 部署calico网络环境&#xff0c;网上去找k8s版本对应的calico的配置文件&#xff0c;k8s2.8.0我用的3.28 2 安装istio环境 curl -L https://istio.io/downloadIstio | sh - # 省略istioctl生效的步骤 source <(istioctl completion zsh) istioctl install --set profile…...

Jenkins升级到最新版本后无法启动

1. 场景还原 最近在web界面将jenkins升级到最新版本后&#xff0c;后台无法启动jenkins服务&#xff0c;服务状态如下&#xff1a; 运行jenkins命令提示invalid Java version jenkins --version jenkins: invalid Java version: java version "1.8.0_202" Java(TM)…...

用户界面创建一个新的运动类型

● 现在我们需要根据我们之前规划的架构步骤来实现在用户界面创建一个运动类型 ● 首先我们在要获取用户在表单中输入的数据 //从表单中获取数据const type inputType.value;const distance inputDistance.value;const duration inputDuration.value;● 然后针对与不同的运动…...

ubuntu防火墙入门(一)——设置服务、关闭端口

本机想通过git clone gitgithub.com:skumra/robotic-grasping.git下载代码&#xff0c;firewall-config中需要为当前区域的防火墙开启SSH服务吗 是的&#xff0c;如果你想通过 git clone gitgithub.com:skumra/robotic-grasping.git 使用 SSH 协议从 GitHub 下载代码&#xff0…...

分治算法——二分查找(c++)(详解)

大家好&#xff0c;今天进入一个实用算法&#xff1a;分治算法。 1.分治算法介绍 分治算法&#xff0c;大概就是将一个大问题拆解成若干个小问题&#xff0c;将小问题一一解决&#xff0c;大问题也就迎刃而解。它包含了多种算法&#xff0c;比如递归、递推等。这里就讲解一下其…...

Binder架构

一、架构 如上图&#xff0c;binder 分为用户层和驱动层两部分&#xff0c;用户层有客户端&#xff08;Client&#xff09;、服务端&#xff08;Server&#xff09;、服务管理&#xff08;ServiceManager&#xff09;。 从用户空间的角度&#xff0c;使用步骤如下&#xff08;…...

大数据治理:解锁数据价值,引领未来创新

目录 引言 一、大数据治理的定义 二、大数据治理的重要性 三、大数据治理的核心组件 四、大数据治理的实践案例 1. 数据标准化 2. 数据质量管理 案例一&#xff1a;医疗行业的大数据治理——智能医疗助手守护健康 引言 在数字化时代&#xff0c;数据已成为企业最宝贵的…...

解决windows下php8.x及以上版本,在Apache2.4中无法加载CURL扩展的问题

本文已首发于&#xff1a;秋码记录 若你也想搭建一个个人博客&#xff0c;可参考&#xff1a;国内 gitee.com Pages 下线了&#xff0c;致使众多站长纷纷改用 github、gitlab Pages 托管平台 在日新月异的信息化下&#xff0c;软件也在跟随着互联网的脚步&#xff0c;逐步推进…...

【韩顺平老师Java反射笔记】

反射 文章目录 基本使用反射机制java程序在计算机有三个阶段反射相关的主要类 反射调用优化Class类的常用方法获取Class对象的6种方式哪些类型有Class对象类加载类加载时机类加载过程图 通过反射获取类的结构信息第一组&#xff1a;java.lang.Class类第二组&#xff1a;java.la…...

Arrays.asList()新增报错,该怎么解决

一、前言 在 Java 开发中&#xff0c;Arrays.asList() 是一个常用的工具方法&#xff0c;它允许开发者快速将数组转换为列表。尽管这个方法非常方便&#xff0c;但许多开发者在使用时可能会遭遇一个常见的错误&#xff1a;尝试向由 Arrays.asList() 返回的列表中添加元素时抛出…...

【热门主题】000072 分布式数据库:开启数据管理新纪元

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

基于Springboot开发的云野旅游平台

一、功能介绍 云野旅游平台包含管理员、用户两个角色以及前后台系统。 前台系统功能 用户登录成功后&#xff0c;可以进行查看旅游路线、最新线路、旅游资讯、个人中心、后台管理、购物车、客服等功能模块。进行相对应操作。 后台系统功能 管理员或用户登录成功后&#xf…...

2024金盾信安杯线上赛 MISC ezpng[wp]

下载题目发现给了个password和png 图片发现损坏的 password丢随波逐流一键解 base64 给出解码的结果是 cimbar搜索发现在Github有工具 然后对附件中的图片进行小厨房xor 得到一张新图片 利用工具进行跑出答案...

搭建业务的性能优化指南

这是一篇搭建业务优化的心路历程&#xff0c;也是写给搭建业务的性能优化指南。 前言 直到今天&#xff0c;淘内的页面大多都迁移到了 SSR&#xff0c;从我们终端平台 - 搭建研发团队的视角看&#xff0c;业务大致可以分为两类 —— 搭建派 和 源码派。 这两者互不冲突&#xf…...

wordpress 输入框/网络推广平台大全

变量 是可以改变的值&#xff0c;本质上是内存的空间&#xff0c;用来存储信息 数据类型 本质上是数据的一种存储方式&#xff0c;和它能参与的运算的一种抽象 数据类型的分类 值类型和引用类型的区别 值类型&#xff0c;从栈里互相引用&#xff1b; 引用类型&#xff0c;从堆里…...

湖南网站制作流程/百度关键字推广费用

Echarts地图扩展文件使用geoJson格式&#xff0c;将shp数据转换为geojson格式 1、制作shp数据。地理信息行业的人员都对ArcGis和shp格式的数据编辑比较了解&#xff0c;也不是简单能说清楚的&#xff0c;不再详细说明。 2、然后利用得到的shp数据转换为geojson格式&#xff0c;…...

wordpress模板优化/产品线上营销有哪些方式

1、字符数组的定义与初始化 字符数组的初始化&#xff0c;最容易理解的方式就是逐个字符赋给数组中各元素。char str[10]{ I, ,a,m, ,‘h’,a,p,p,y}; 即把10个字符分别赋给str[0]到str[9]10个元素如果花括号中提供的字符个数大于数组长度&#xff0c;则按语法错误处理&#xf…...

直播视频网站如何做/网站优化是做什么的

鉴于生产环境的Linux上无telnet命令&#xff0c;但有wget命令&#xff0c;写了一条语句检测对端TCP是否开放监听 #!/bin/bashwget --delete-after -t1 -T1 "http://$1:$2" 2>&1 | grep "connected" && echo ok || echo nok 实测http&#x…...

个人网站icp备案教程/文案写作软件app

终于可以从百度云上BOS读取数据到本地了转载于:https://www.cnblogs.com/geili/p/10235390.html...

网站建设 无锡/天津企业seo

视口单位&#xff08; Viewport units )初探 起因 最近在写的一个仿网易云的webapp中有一个nav组件。其中nav-item需要宽度自适应屏幕的1/4.其中nav-icon需设置圆形。问题在于&#xff1a;宽度不确定&#xff0c;需要设置高度与宽度相同&#xff0c;且icon-font的font-size需随…...