3. redis常见部署架构

redis常见部署架构

  • 一、redis常见部署架构
    • 1、常见部署架构
    • 2、多实例部署
      • 2.1 规划安装目录、配置文件
      • 2.2.2 编辑实例配置文件
      • 2.2.3 启动实例
      • 2.2.4 测试数据读写
    • 3、redis主从复制
      • 3.1 规划
      • 3.2 从服务器配置
      • 3.3 验证主从状态
      • 3.4 主从角色切换
    • 4、分片集群
      • 4.1 原理
      • 4.2 分片集群的部署
        • 4.2.1 两台服务器安装redis
        • 4.2.2 配置redis实例
        • 4.2.3 创建分片集群
        • 4.2.5 连接集群测试数据读写
    • 5、哨兵集群
    • 6、Redis哨兵模式的配置
        • 准备环境
        • 主从节点配置
        • 哨兵节点配置
        • 启用哨兵
        • 启动sentienl,系统会在配置文件中自动写入哨兵的id、链接信息,主从节点信息和其他哨兵信息。如下sentinel-26380.conf启动后的完整信息:
        • 关掉端口号为6381的redis主服务器程序
        • 端口号为6382的服务器成为了主服务器

一、redis常见部署架构

1、常见部署架构

多实例部署
主从复制
分片集群
哨兵集群

2、多实例部署

安装目录: /opt/6380 端口: 6380
安装目录: /opt/6381 端口: 6381

2.1 规划安装目录、配置文件

[root@localhost ~]# mkdir -p /opt/638{0,1}/{conf,data} 
[root@localhost ~]# 
[root@localhost ~]# cp /usr/local/redis50/conf/redis.conf /opt/6380/conf/
[root@localhost ~]# 

2.2.2 编辑实例配置文件

[root@localhost ~]# vim /opt/6380/conf/redis.conf 
bind 192.168.140.10
port 6380
daemonize yes
appendonly yes
pidfile /var/run/redis_6380.pid
loglevel warning
logfile "/var/log/redis_6380.log"
dbfilename dump_6380.rdb
dir /opt/6380/data
appendfilename "appendonly_6380.aof"

2.2.3 启动实例

[root@localhost ~]# redis-server /opt/6380/conf/redis.conf 
[root@localhost ~]# redis-server /opt/6381/conf/redis.conf 

[root@localhost ~]# netstat -tunlp | grep redis
tcp        0      0 192.168.140.10:6380     0.0.0.0:*               LISTEN      1331/redis-server 1 
tcp        0      0 192.168.140.10:6381     0.0.0.0:*               LISTEN      1336/redis-server 1 

2.2.4 测试数据读写

[root@localhost ~]# redis-cli -h 192.168.140.10 -p 6380
192.168.140.10:6380> set name martin
OK
192.168.140.10:6380> get name
"martin"
192.168.140.10:6380> exit

[root@localhost ~]# redis-cli -h 192.168.140.10 -p 6381
192.168.140.10:6381> set name demon
OK
192.168.140.10:6381> get name
"demon"
192.168.140.10:6381> exit

3、redis主从复制

在主从复制基础上,整合读写分离提升性能
从服务器默认为只读
基于异步的方式进行数据同步
支持一主多从

3.1 规划

192.168.140.10 6380 主
192.168.140.10 6381 从

3.2 从服务器配置

[root@localhost ~]# vim /opt/6381/conf/redis.conf 
replicaof 192.168.140.10 6380
[root@localhost ~]# redis-cli -h 192.168.140.10 -p 6381 shutdown
[root@localhost ~]# 
[root@localhost ~]# redis-server /opt/6381/conf/redis.conf 

3.3 验证主从状态

[root@localhost ~]# redis-cli -h 192.168.140.10 -p 6380
192.168.140.10:6380> set a 100
OK
192.168.140.10:6380> exit
[root@localhost ~]# 
[root@localhost ~]# redis-cli -h 192.168.140.10 -p 6381
192.168.140.10:6381> get a
"100"
192.168.140.10:6381> 
192.168.140.10:6381> set b 20
(error) READONLY You can't write against a read only replica.
192.168.140.10:6381> exit

主服务器状态:

192.168.140.10:6380> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.140.10,port=6381,state=online,offset=360,lag=0
master_replid:58d767e64932f28545096a5a20b217e9787fd0df
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:360
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:360
192.168.140.10:6380> 
192.168.140.10:6380> exit

从服务器状态:

[root@localhost ~]# redis-cli -h 192.168.140.10 -p 6381
192.168.140.10:6381> info replication
# Replication
role:slave
master_host:192.168.140.10
master_port:6380
master_link_status:up
master_last_io_seconds_ago:8
master_sync_in_progress:0
slave_repl_offset:402
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:58d767e64932f28545096a5a20b217e9787fd0df
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:402
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:402
192.168.140.10:6381> 

3.4 主从角色切换

将从服务器提升为主

192.168.140.10:6381> SLAVEOF no one 
OK
192.168.140.10:6381> 
192.168.140.10:6381> info replication
# Replication
role:master
connected_slaves:0
master_replid:87e2111823deba148396441304837a7bdd1d8399
master_replid2:58d767e64932f28545096a5a20b217e9787fd0df
master_repl_offset:584
second_repl_offset:585
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:584
192.168.140.10:6381> 
192.168.140.10:6381> set b 20
OK
192.168.140.10:6381> set c 30
OK
192.168.140.10:6381> set d 30
OK
192.168.140.10:6381> 

将配置文件中连接主服务器的信息注释、删除 

4、分片集群

redis 3.x版本开始支持的
作用:所有缓存数据分散存储到不同的redis上,提升读写性能, 提升数据可靠性

4.1 原理

Redis集群使用哈希槽slot进行数据分片

Redis集群有16384个哈希槽, 每个key通过CRC16校验后对16384取模来决定放置哪个槽, 集群的每个节点负责一部分hash槽

举个例子,比如当前集群有3个节点,
在这里插入图片描述
定位数据的算法的优劣势:
优势:简单
劣势:随着集群扩容、缩容,会造成缓存数据丢失

4.2 分片集群的部署

192.168.140.10 3个集群模式的实例 7001 7002 7003
192.168.140.11 3个集群模式的实例 7004 7005 7006

4.2.1 两台服务器安装redis
4.2.2 配置redis实例

实例配置文件参考

bind 192.168.140.10
port 6380
daemonize yes
appendonly yes
pidfile /var/run/redis_6380.pid
loglevel warning
logfile "/var/log/redis_6380.log"
dbfilename dump_6380.rdb
dir /opt/6380/data
appendfilename "appendonly_6380.aof"

cluster-enabled yes
cluster-config-file nodes-7001.conf
[root@localhost ~]# sed -ri 's|7001|7002|g' /opt/7002/conf/redis.conf 
[root@localhost ~]# sed -ri 's|7001|7003|g' /opt/7003/conf/redis.conf 
[root@localhost ~]# netstat -tunlp | grep redis
tcp        0      0 192.168.140.10:17001    0.0.0.0:*               LISTEN      1683/redis-server 1 
tcp        0      0 192.168.140.10:17002    0.0.0.0:*               LISTEN      1688/redis-server 1 
tcp        0      0 192.168.140.10:17003    0.0.0.0:*               LISTEN      1693/redis-server 1 
tcp        0      0 192.168.140.10:7001     0.0.0.0:*               LISTEN      1683/redis-server 1 
tcp        0      0 192.168.140.10:7002     0.0.0.0:*               LISTEN      1688/redis-server 1 
tcp        0      0 192.168.140.10:7003     0.0.0.0:*               LISTEN      1693/redis-server 1 

[root@localhost ~]# ps -elf | grep redis
5 S root       1683      1  0  80   0 - 39139 ep_pol 11:25 ?        00:00:00 redis-server 192.168.140.10:7001 [cluster]
5 S root       1688      1  0  80   0 - 39139 ep_pol 11:25 ?        00:00:00 redis-server 192.168.140.10:7002 [cluster]
5 S root       1693      1  0  80   0 - 39139 ep_pol 11:25 ?        00:00:00 redis-server 192.168.140.10:7003 [cluster]
0 S root       1701   1228  0  80   0 - 28203 pipe_w 11:27 pts/0    00:00:00 grep --color=auto redis


另外一台服务器配置大致相同 

[root@localhost ~]# netstat -tunlp | grep redis
tcp        0      0 192.168.140.11:7004     0.0.0.0:*               LISTEN      1471/redis-server 1 
tcp        0      0 192.168.140.11:7005     0.0.0.0:*               LISTEN      1476/redis-server 1 
tcp        0      0 192.168.140.11:7006     0.0.0.0:*               LISTEN      1481/redis-server 1 
tcp        0      0 192.168.140.11:17004    0.0.0.0:*               LISTEN      1471/redis-server 1 
tcp        0      0 192.168.140.11:17005    0.0.0.0:*               LISTEN      1476/redis-server 1 
tcp        0      0 192.168.140.11:17006    0.0.0.0:*               LISTEN      1481/redis-server 1 
[root@localhost ~]# 
[root@localhost ~]# ps -elf | grep redis
5 S root       1471      1  0  80   0 - 39139 ep_pol 11:33 ?        00:00:00 redis-server 192.168.140.11:7004 [cluster]
5 S root       1476      1  0  80   0 - 39139 ep_pol 11:33 ?        00:00:00 redis-server 192.168.140.11:7005 [cluster]
5 S root       1481      1  0  80   0 - 39139 ep_pol 11:33 ?        00:00:00 redis-server 192.168.140.11:7006 [cluster]
4.2.3 创建分片集群
[root@localhost ~]# redis-cli --cluster create \
> 192.168.140.10:7001 \
> 192.168.140.10:7002 \
> 192.168.140.10:7003 \
> 192.168.140.11:7004 \
> 192.168.140.11:7005 \
> 192.168.140.11:7006 \
> --cluster-replicas 1
>>> 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.140.11:7006 to 192.168.140.10:7001
Adding replica 192.168.140.10:7003 to 192.168.140.11:7004
Adding replica 192.168.140.11:7005 to 192.168.140.10:7002
M: ed73c1a4724e5961c9291148312f63b83e841e36 192.168.140.10:7001
   slots:[0-5460] (5461 slots) master
M: d51484815a84d7485bd191b3018b29987f3831b7 192.168.140.10:7002
   slots:[10923-16383] (5461 slots) master
S: df6f16e2c84aeda6efb60cf5ab98a7ea7928a37e 192.168.140.10:7003
   replicates 404b8acd3289b80973cafcf6738e079ed0866526
M: 404b8acd3289b80973cafcf6738e079ed0866526 192.168.140.11:7004
   slots:[5461-10922] (5462 slots) master
S: afc90762e411df0212880fcb4d151fbf84d205f1 192.168.140.11:7005
   replicates d51484815a84d7485bd191b3018b29987f3831b7
S: 7e3d9c1be77afa0c04c6bfc49056e793d56d575e 192.168.140.11:7006
   replicates ed73c1a4724e5961c9291148312f63b83e841e36
Can I set the above configuration? (type 'yes' to accept): yes
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[root@localhost ~]# redis-cli --cluster info 192.168.140.10:7001
192.168.140.10:7001 (ed73c1a4...) -> 0 keys | 5461 slots | 1 slaves.
192.168.140.10:7002 (d5148481...) -> 3 keys | 5461 slots | 1 slaves.
192.168.140.11:7004 (404b8acd...) -> 1 keys | 5462 slots | 1 slaves.
[OK] 4 keys in 3 masters.
0.00 keys per slot on average.
4.2.5 连接集群测试数据读写
[root@localhost ~]# redis-cli -h 192.168.140.11 -p 7004 -c
192.168.140.11:7004> 
192.168.140.11:7004> set name martin
OK
192.168.140.11:7004> set url www.jd.com
-> Redirected to slot [12521] located at 192.168.140.10:7002
OK

5、哨兵集群

作用: 用于一主多从的环境下,目的是提升主服务器的可用性
在这里插入图片描述

6、Redis哨兵模式的配置

准备环境

主从环境,一主多从
至少三台哨兵节点(奇数个,避免脑裂)

主从节点配置

一个主redis实例,配置文件路径:/opt/6380/conf/redis.conf
两个从redis实例,配置文件路径:
/opt/6381/conf/redis.conf
/opt/6382/conf/redis.conf
redis实例配置文件修改见上述主从配置
启动主从节点并测试是否能够进行正常主从配置,测试成功后进行redis哨兵配置

哨兵节点配置

在三个redis目录下创建redis-sentinel目录,用于存放哨兵的配置文件

[root@localhost 6382]# mkdir -p /opt/6380/redis-sentinel
[root@localhost 6382]# mkdir -p /opt/6381/redis-sentinel
[root@localhost 6382]# mkdir -p /opt/6382/redis-sentinel

在data目录下创建三个存放哨兵文件的数据目录

[root@localhost ~]# mkdir -p /opt/6380/data/26380
[root@localhost ~]# mkdir -p /opt/6381/data/26381
[root@localhost ~]# mkdir -p /opt/6382/data/26382

将安装目录下的sentinel.conf文件分别复制到三个redis-sentinel目录下,重命名

[root@localhost ~]# cp redis-5.0.12/sentinel.conf /opt/6380/redis-sentinel/sentinel-26380.conf
[root@localhost ~]# cp redis-5.0.12/sentinel.conf /opt/6381/redis-sentinel/sentinel-26381.conf
[root@localhost ~]# cp redis-5.0.12/sentinel.conf /opt/6382/redis-sentinel/sentinel-26382.conf

编辑sentinel.conf配置文件,主要修改端口、后台启动进程、pidfile、logfile、dir、主从节点地址等,具体可参考如下修改
sentinel-26380.conf

port 26380
daemonize yes
pidfile /var/run/redis-sentinel-26380.pid
logfile "/var/log/26380.log"
dir /opt/6380/data/26380
sentinel monitor mymaster 191.168.140.10 6381 2 //这里的地址和端口号写主服务器的

sentinel-26381.conf

port 26381
daemonize yes
pidfile /var/run/redis-sentinel-26381.pid
logfile "/var/log/26381.log"
dir /opt/6381/data/26381
sentinel monitor mymaster 191.168.140.10 6381 2 //这里的地址和端口号写主服务器的

sentinel-26382.conf

port 26382
daemonize yes
pidfile /var/run/redis-sentinel-26382.pid
logfile "/var/log/26382.log"
dir /opt/6382/data/26382
sentinel monitor mymaster 191.168.140.10 6381 2 //这里的地址和端口号写主服务器的
启用哨兵
[root@localhost ~]# redis-sentinel /opt/6380/redis-sentinel/sentinel-26380.conf 
[root@localhost ~]# redis-sentinel /opt/6381/redis-sentinel/sentinel-26381.conf 
[root@localhost ~]# redis-sentinel /opt/6382/redis-sentinel/sentinel-26382.conf 
启动sentienl,系统会在配置文件中自动写入哨兵的id、链接信息,主从节点信息和其他哨兵信息。如下sentinel-26380.conf启动后的完整信息:
[root@localhost ~]# cat /opt/6380/redis-sentinel/sentinel-26380.conf | grep -v '#' | grep -v '^$'
port 26380
daemonize yes
pidfile "/var/run/redis-sentinel-26380.pid"
logfile "/var/log/26380.log"
dir "/opt/6380/data/26380"
sentinel myid 72f9410b2bc741edaeed261286c0a6bf1242efb8 //哨兵的myid
sentinel deny-scripts-reconfig yes
sentinel monitor mymaster 191.168.140.10 6381 2
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0
protected-mode no
sentinel current-epoch 0
关掉端口号为6381的redis主服务器程序
root       2412  0.0  1.4 167308 14368 ?        Ssl  16:54   0:00 redis-server 192.168.140.10:6381
[root@localhost 6381]# kill -9 2412
端口号为6382的服务器成为了主服务器
[root@localhost 6381]# redis-cli -h 192.168.140.10 -p 6382
192.168.140.10:6382> info replication
# Replication
role:master
connected_slaves:0
master_replid:93c49286a4b921d25391e39db1f13a0122df7836
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于单片机的船舱温度临界报警系统

摘 要 : 针对传统的船舱温度临界报警系统,由于温度监控不到位导致报警不及时的问题,提出一个基于单片机的船舱温度临界报警系统设计。该设计将单片机作为核心控制硬件,控制系统整体电路。同时设计数据采集模块,利用温度测量仪测试…

【vue3|第6期】如何正确地更新和替换响应式对象reactive

日期:2024年6月5日 作者:Commas 签名:(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释:如果您觉得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方&#xff…

Leetcode 第 399 场周赛题解

Leetcode 第 399 场周赛题解 Leetcode 第 399 场周赛题解题目1:3162. 优质数对的总数 I思路代码复杂度分析 题目2:3163. 压缩字符串 III思路代码复杂度分析 题目3:3164. 优质数对的总数 II思路代码复杂度分析 题目4:3165. 不包含相…

C51单片机 串口打印printf重定向

uart.c文件 #include "uart.h"void UartInit(void) //4800bps11.0592MHz {PCON | 0x80; //使能波特率倍速位SMODSCON 0x50; //8位数据,可变波特率。使能接收TMOD & 0x0F; //清除定时器1模式位TMOD | 0x20; //设定定时器1为8位自动重装方式TL1 0xF4; //设…

IPFS节点部署及连接java服务接口

文章目录 引言前言:IPFS网络部署1.下载安装文件2.安装及初始化3.测试上传文件 引入IPFS 依赖包初始化IPFS创建接口类以及实现类创建前端访问的控制类前端设计及验证 引言 该篇文章是记录使用IPFS存储文件与java的Springboot项目连接的过程,前端简单地用…

基于websocket与node搭建简易聊天室

一、前言 上一篇文章介绍了websocket的详细用法与工具类的封装,本篇就基于websocket搭建一个简易实时的聊天室。 在本篇开始之前也可以去回顾一下websocket详细用法:WebSocket详解与封装工具类 二、基于node搭建后台websocket服务 首先确认本机电脑中…

YOLOv8改进 | Conv篇 | 利用YOLOv10提出的C2fUIB魔改YOLOv8(附代码 + 完整修改教程)

一、本文介绍 本文给大家带来的改进机制是利用YOLOv10提出的C2fUIB模块助力YOLOv8进行有效涨点,其中C2fUIB模块所用到的CIB模块是一种紧凑的倒置块结构,它采用廉价的深度卷积进行空间混合,并采用成本效益高的点卷积进行通道混合。本文针对该…

Window10磁盘的分盘和合并

注意: 当我们c盘不够大需要扩大磁盘空间时,当c盘后面没有未划分的磁盘时候,我们是无法进行扩充c盘的,此时,我们可以先删除后面一个磁盘,再进行扩大。 如下:c盘后没有未分配的空间,…

Flink端到端的精确一次(Exactly-Once)

目录 状态一致性 端到端的状态一致性 端到端精确一次(End-To-End Exactly-Once) Flink内部的Exactly-Once 输入端保证 输出端保证 幂等写入 事务写入 Flink和Kafka连接时的精确一次保证 整体介绍 需要的配置 案例 状态一致性 流式计算本身就…

UI 自动化分布式测试 -Docker Selenium Grid

分布式测试Selenium Grid 对于大型项目或者有大量测试用例的项目,单机的测试环境往往无法快速完成所有测试用例的执行,此时自动化测试执行效率将会成为最大的瓶颈,Selenium Grid 可以通过多机的分布式架构允许测试用例并行运行,大大缩短了测试时间。 Selenium Grid 提供了多…

命令模式(行为型)

目录 一、前言 二、命令模式 三、总结 一、前言 命令模式(Command Pattern)是一种行为型设计模式,命令模式将一个请求封装为一个对象,从而可以用不同的请求对客户进行参数化;对请求排队或记录请求日志,以…

此表单不安全,因此系统已关闭自动填充功能

问题截图: 截图就不放了,公司的系统不方便,就是form表单会有个提示“此表单不安全,因此系统已关闭自动填充功能” 解决思路: 1、问题原因 使用https访问,但表单提交地址是http的 2、查看表单配置 表单…

行业分析---造车新势力之理想汽车

1 前言 在之前的博客中,笔者撰写了多篇行业类分析的文章(科技新能源): 《行业分析---我眼中的Apple Inc.》 《行业分析---马斯克的Tesla》 《行业分析---造车新势力之蔚来汽车》 《行业分析---造车新势力之小鹏汽车》 此类文章的受…

IIC信号质量测试、时序测试详解

IIC 时序图 信号质量测试 1、vIL: 低输入电平。 2、vIH: 高输入电平。 3、vhys: 施密特触发器输入的滞后。 4、vOL1: VDD>2V时&#xff0c;低电平输出电压&#xff08;漏极开路或集电极开路&#xff09;。 5、vOL3: VDD<2V时&#xff0c;低电平输出电压&#xff08;漏极开…

js 数字精确度

事情的起源&#xff1a; 项目中 填写的赔付金额是小数 传给后端需要 *100 9.87 *100 传给后端后是986.9999999999999 后端直接取整 就变成了9.86了 0.1 0.2 ! 0.3 console.log(0.1 0.2) //0.30000000000000004 console.log(0.1 0.2 0.3) //false1. 数字的存储 浮点数是用…

【因果推断python】14_控制混淆因素3

目录 不良控制 - 选择偏差 糟糕的 COP 关键思想 不良控制 - 选择偏差 让我们回到债务催收电子邮件的案例。 请记住&#xff0c;电子邮件是随机分配给客户的。 我们已经解释了什么是 信用额度 和 风险分 。 现在&#xff0c;让我们看看剩下的变量。 打开 是客户是否打开电子邮…

工厂模式——工厂方法模式+注册表

工厂方法模式的瑕疵 在前一篇笔记中我们介绍了工厂方法模式&#xff0c;示例的类图如下&#xff1a; 考虑一种情况&#xff1a;现在要在程序运行时&#xff0c;根据外部资源&#xff0c;动态的实例化对象。也就是说在编译期我们无法知道要实例化的对象的类型。因此在实例化的过…

el-input实现后缀图标和clearable的兼容,调整el-input clearable与自定义图标展示位置问题

背景&#xff1a;常见的输入框存在两个图标的展示效果都是清空在前搜索或其他图标在后 常见以及最终实现效果&#xff08;清空图标在前&#xff0c;搜索图标在后&#xff09; BUG以及el-input默认效果 问题排查 通过控制台审查元素能够发现&#xff0c;默认的效果是自定义图标…

数据结构_手撕七大排序(快排,归并,堆排,希尔,选择,插入,冒泡)

✨✨所属专栏&#xff1a;数据结构✨✨ ✨✨作者主页&#xff1a;嶔某✨✨ 排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a;假定在待排序的记录序…

使用wheelnav.js构建酷炫的动态导航菜单

目录 前言 一、WheelNav是什么 1、项目地址 2、关于开源协议 3、相关目录介绍 二、如何使用wheelnav.js 1、新建html页面 2、设置style样式 3、创建展示元素实现动态导航 三、参数即方法介绍 1、参数列表 2、运行方法 3、实际成果 四、总结 前言 用户体验永远是一…