概述、搭建Redis服务器、部署LNP+Redis、创建Redis集群、连接集群、集群工作原理

发布时间:2024年01月22日

1 案例1:搭建redis服务器

1.1 具体要求如下

  1. 在主机redis64运行redis服务
  2. 修改服务运行参数
  • ip 地址192.168.88.64
  • 服务监听的端口6364
  • redis服务的连接密码为 tarenaplj

1.2 方案

准备1台新虚拟机,要求如表-1所示。

1.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:在主机redis64运行redis服务

命令操作如下所示:

    [root@redis64 ~]# yum -y install redis  安装软件
    [root@redis64 ~]# systemctl  start redis 启动服务
    [root@redis64 ~]# netstat  -utnlp  | grep redis-server  查看端口
    tcp        0      0 127.0.0.1:6379    0.0.0.0:*    LISTEN      1970/redis-server 1
    [root@redis64 ~]# redis-cli  连接服务
    127.0.0.1:6379> ping 检查能否正在访问
    PONG 
    127.0.0.1:6379> set school tarena 存储变量
    OK
    127.0.0.1:6379> get school 查看变量
    "tarena"
    127.0.0.1:6379> exit 断开连接
    [root@redis64 ~]#

步骤二:修改服务运行参数

命令操作如下所示:

    [root@redis64 ~]# systemctl  stop redis
    [root@redis64 ~]# vim /etc/redis.conf
    69 bind 192.168.88.64
    92 port 6364
    647 requirepass tarenaplj
    :wq
    [root@redis64 ~]# setenforce 0
    [root@redis64 ~]# systemctl start redis
    [root@redis64 ~]# netstat  -utnlp  | grep redis-server
    tcp   0    0 192.168.88.64:6364   0.0.0.0:*    LISTEN      2009/redis-server 1 
    [root@redis64 ~]#
    [root@redis64 ~]# redis-cli  -h 192.168.88.64 -p 6364 连接服务
    192.168.88.64:6364> ping 不输入密码无法正常访问
    (error) NOAUTH Authentication required.
    192.168.88.64:6364> auth tarenaplj  输入密码
    OK
    192.168.88.64:6364> keys *  查看存储的变量
    1) "school"
    192.168.88.64:6364> exit  断开连接
    [root@redis64 ~]#

2 案例2:常用命令限

2.1 问题

1)练习如下命令的使用

  • mset mget keys type
  • exists ttl expire move select
  • del flushdb flushall

2.2 方案

在搭建的redis64练习常用命令的使用。

2.3 步骤

实现此案例需要按照如下步骤进行。

命令操作如下所示:

192.168.88.64:6364> mset name plj  age 80 class nsd2108    一起存储多个变量
OK
192.168.88.64:6364> keys *
1) "age"
2) "classs"
3) "name"
4) "school"
192.168.88.64:6364> mget name age  一起查看多个变量
1) "plj"
2) "80"
keys 使用统配符查看变量
* 匹配所有变量名
? 一个字符
192.168.88.64:6364> keys *
1) "age"
2) "classs"
3) "name"
4) "school"
192.168.88.64:6364> keys ???  变量名是3个字符
1) "age"
192.168.88.64:6364> keys a*   变量名是a 开头的
1) "age"
192.168.88.64:6364> 
192.168.88.64:6364> keys gender 查看指定变量是否存在
(empty list or set) 说明变量没有定义
192.168.88.64:6364> keys name
1) "name"
192.168.88.64:6364> 
select 切换库 默认库编号 0-15 
192.168.88.64:6364> select 1  切换到 1号库里
OK
192.168.88.64:6364[1]> keys * 查看数据没有数据
(empty list or set)
192.168.88.64:6364[1]> 
192.168.88.64:6364[1]> select 0  
OK
192.168.88.64:6364> select 16
(error) ERR DB index is out of range
move 命令 移动变量到其他库里
192.168.88.64:6364> keys *
1) "age"
2) "classs"
3) "name"
4) "school"
192.168.88.64:6364> move age 1   把age 变量移动到1 号库里
(integer) 1 
192.168.88.64:6364> keys *
1) "classs"
2) "name"
3) "school"
192.168.88.64:6364> select  1
OK
192.168.88.64:6364[1]> keys *
1) "age"
exists 检查变量是否存储  返回值1  变量存储 返回值是0 变量不存在
192.168.88.64:6364[1]> select 0
OK
192.168.88.64:6364> EXISTS name  检查name变量是否存在
(integer) 1
192.168.88.64:6364> get name
"plj"
192.168.88.64:6364> set name bob
OK
192.168.88.64:6364> get name
"bob"
192.168.88.64:6364>
EXPIRE 命令设置变量的过期时间 不设置变量永不过期
ttl   检查变量可以在内存里存多久
192.168.88.64:6364> set sex girl
OK
192.168.88.64:6364> ttl sex
(integer) -1  表示永不过期
192.168.88.64:6364> EXPIRE sex 15   设置过期时间15 秒
(integer) 1
192.168.88.64:6364> keys sex
1) "sex"
192.168.88.64:6364> ttl sex
(integer) 8  还剩下8秒时间过期
192.168.88.64:6364> ttl sex
(integer) -2  表示已经过期被删除
192.168.88.64:6364> keys  sex
(empty list or set)
192.168.88.64:6364> 
type 命令检查变量存储数据的类型  
使用set  mset命令存储的数据都字符类型。
数据的类型不同 管理的命令也不同 
明天讲数据类型。
192.168.88.64:6364> set x 99
OK
192.168.88.64:6364> mset y 108
OK
192.168.88.64:6364> type x
string
192.168.88.64:6364> type y
string
192.168.88.64:6364> lpush  tea nb  wk  zzg plj lx   定义类别类型的变量tea
192.168.88.64:6364> type tea 查看变量类型  list 列表类型的数据
list  
del 删除内存里的变量
192.168.88.64:6364> keys *
1) "y"
2) "tea"
3) "name"
4) "school"
5) "x"
6) "classs"
192.168.88.64:6364> del tea y school
(integer) 3
192.168.88.64:6364> keys *
1) "name"
2) "x"
3) "classs"
192.168.88.64:6364> 
flushdb  删除当前所在库的所有数据
192.168.88.64:6364> keys *
1) "name"
2) "x"
3) "classs"
192.168.88.64:6364> flushdb
OK
192.168.88.64:6364> keys *
(empty list or set)
192.168.88.64:6364> SELECT 1
OK
192.168.88.64:6364[1]> keys *
1) "age"
192.168.88.64:6364[1]> flushall 删除内存里的所有内存里所有数据 (慎用

3 案例3:部署LNP+Redis

3.1 问题

  1. 在主机192.168.88.64部署LNP 环境
  2. 配置PHP支持redis
  3. 编写网站脚本,把数据存储到本机的内存里

3.2 方案

在redis64主机同时运行nginx 服务,并配置nginx服务可以把数据存储在本机的redis内存服务里。

3.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:在主机192.168.88.64部署LNP 环境

1)安装源码nginx及php

    ]#yum  -y  install  gcc    pcre-devel   zlib-devel  make   安装依赖
    ]#]# tar -xf nginx-1.22.1.tar.gz 解压源码
    ]#cd nginx-1.22.1 进源码目录
    ]#./configure 配置
    ]#make 编译
    ]#make  install 安装
    ]# ls /usr/local/nginx/  查看安装目录
    conf  html  logs  sbin
    ]# yum   -y     install php  php-fpm   php-devel  安装php 软件

2)配置动静分离

    ]# vim +65 /usr/local/nginx/conf/nginx.conf
    location ~ \.php$ {
                root           html;
                fastcgi_pass   127.0.0.1:9000;
                fastcgi_index  index.php;
            #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
                include        fastcgi.conf;
            }
    :wq

3)启动nginx服务

    [root@redis64 ~]# /usr/local/nginx/sbin/nginx  -t  测试配置
    nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
    nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
    [root@redis64 ~]# 
    [root@redis64 ~]# /usr/local/nginx/sbin/nginx  启动服务
    [root@redis64 ~]# netstat  -utnlp  | grep 80
    tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      10469/nginx: master 
    [root@redis64 ~]#

启动php-fpm服务

    ]# vim /etc/php-fpm.d/www.conf
    38 ;listen = /run/php-fpm/www.sock
    39 listen = 127.0.0.1:9000  非sock方式运行 (不是必须的)
    :wq
    [root@redis64 ~]# systemctl  start php-fpm  启动服务
    [root@redis64 ~]# netstat  -utnlp  | grep 9000  查看端口
    tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      10477/php-fpm: mast 
    [root@redis64 ~]#

测试配置

    [root@redis64 ~]# vim /usr/local/nginx/html/test.php  编写php脚本
    <?php
     echo  "hello world!!! \n";
    ?>
    [root@redis64 ~]# curl  http://localhost/test.php  访问php脚本
    hello world!!! 
    [root@redis64 ~]#

步骤二:配置PHP支持redis

1)安装软件提供模块

--with-php-config=/usr/bin/php-config 获取php版本信息

    [root@redis64 pub]# tar -xf redis-cluster-4.3.0.tgz  解压源码
    [root@redis64 pub]# cd redis-4.3.0/ 进源码目录
    [root@redis64 redis-4.3.0]# phpize  获取php版本信息
    Configuring for:
    PHP Api Version:         20170718
    Zend Module Api No:      20170718
    Zend Extension Api No:   320170718
    [root@redis64 redis-4.3.0]# ./configure --with-php-config=/usr/bin/php-config  配置
    [root@redis64 redis-4.3.0]# make && make install 编译并安装
    Build complete.
    Don't forget to run 'make test'.
    Installing shared extensions:     /usr/lib64/php/modules/  提示模块安装的位置
    [root@redis64 redis-4.3.0]# ls /usr/lib64/php/modules/redis.so  查看模块
    /usr/lib64/php/modules/redis.so
    [root@redis64 redis-4.3.0]#

2)调用模块

    [root@redis64 redis-4.3.0]# vim /etc/php.ini  编辑php进程主配置文件
    737 extension_dir = "/usr/lib64/php/modules/"   指定模块所在目录
    739 extension = "redis.so"  指定模块名
    :wq

3)加载模块

    [root@redis64 redis-4.3.0]# systemctl  restart php-fpm

4)查看模块

    [root@redis64 ~]# php -m | grep redis
    redis
    [root@redis64 ~]#

步骤三:编写网站脚本,把数据存储到本机的内存里

1)允许通过lo口连接本机redis服务

    [root@redis64 ~]# systemctl  stop redis
    [root@redis64 ~]# vim /etc/redis.conf
    69 bind 127.0.0.1 192.168.88.64
    :wq
    [root@redis64 ~]# netstat  -utnlp  | grep redis-server
    tcp        0      0 192.168.88.64:6364  0.0.0.0:* LISTEN      12794/redis-server  
    tcp        0      0 127.0.0.1:6364  0.0.0.0:* LISTEN      12794/redis-server  
    [root@redis64 ~]#

2)编写php脚本

    [root@redis64 ~]# vim /usr/local/nginx/html/redis.php
    <?php
    $redis = new redis();
    $redis->connect("127.0.0.1", "6364");
    $redis->auth("tarenaplj");
    $redis->set("class","nsd");
    echo "save ok\n";
    ?>

3)访问脚本

    [root@redis64 ~]# curl  http://localhost/redis.php
    save ok
    [root@redis64 ~]# 

4)连接redis服务查看变量

    [root@redis64 ~]# redis-cli  -h 127.0.0.1 -p 6364 
    127.0.0.1:6364> auth tarenaplj
    OK
    127.0.0.1:6364> keys *
    1) "school"
    2) "class"
    127.0.0.1:6364> get class
    "nsd"
    127.0.0.1:6364>

4 案例4:创建redis集群

4.1 问题

  1. 准备集群环境
  2. 创建集群
  3. 查看集群信息
  4. 访问集群

4.2 方案

创建6台新虚拟机,具体要求如表-2所示。

4.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:准备集群环境

说明:准备做集群的主机,不允许存储数据、不允许设置连接密码

配置服务器192.168.88.51

    ]# yum -y install redis 安装软件
    ]# vim  /etc/redis.conf 修改主配置文件夹
        92 port  6379   //端口号
    69 bind   192.168.88.51  //IP地址
        838 cluster-enabled  yes                                //启用集群功能  
        846 cluster-config-file  nodes-6379.conf         //存储集群信息文件
        852 cluster-node-timeout  5000  //集群中主机通信超时时间
    :wq
    ]# systemctl   start  redis
    ]# netstat -utnlp  | grep redis-serve
    tcp  0  0 192.168.88.51:6379  0.0.0.0:*   LISTEN      21201/redis-serve  
    tcp  0  0 192.168.88.51:16379   0.0.0.0:*   LISTEN   21201/redis-serve   

配置服务器192.168.88.52

    ]# yum -y install redis
    ]# vim  /etc/redis.conf
        92 port  6379
    69 bind   192.168.88.52
        838 cluster-enabled  yes                                 //启用集群功能  
        846 cluster-config-file  nodes-6379.conf         //存储集群信息文件
        852 cluster-node-timeout  5000  //集群中主机通信超时时间
    :wq
    ]# systemctl   start  redis
    ]# netstat -utnlp  | grep redis-serve
    tcp  0  0 192.168.88.52:6379  0.0.0.0:*   LISTEN      21201/redis-serve  
    tcp  0  0 192.168.88.52:16379   0.0.0.0:*   LISTEN   21201/redis-serve

配置服务器192.168.88.53

    ]# yum -y install redis
    ]# vim  /etc/redis.conf
        92 port  6379
    69 bind   192.168.88.53
        838 cluster-enabled  yes                                 //启用集群功能  
        846 cluster-config-file  nodes-6379.conf         //存储集群信息文件
        852 cluster-node-timeout  5000  //集群中主机通信超时时间
    :wq
    ]# systemctl   start  redis
    ]# netstat -utnlp  | grep redis-serve
    tcp  0  0 192.168.88.53:6379  0.0.0.0:*   LISTEN      21201/redis-serve  
    tcp  0  0 192.168.88.53:16379   0.0.0.0:*   LISTEN   21201/redis-serve

配置服务器192.168.88.54

    ]# yum -y install redis
    ]# vim  /etc/redis.conf
        92 port  6379
    69 bind   192.168.88.54
        838 cluster-enabled  yes                                 //启用集群功能  
        846 cluster-config-file  nodes-6379.conf         //存储集群信息文件
        852 cluster-node-timeout  5000  //集群中主机通信超时时间
    :wq
    ]# systemctl   start  redis
    ]# netstat -utnlp  | grep redis-serve
    tcp  0  0 192.168.88.54:6379  0.0.0.0:*   LISTEN      21201/redis-serve  
    tcp  0  0 192.168.88.54:16379   0.0.0.0:*   LISTEN   21201/redis-serve 

配置服务器192.168.88.55

    ]# yum -y install redis
    ]# vim  /etc/redis.conf
        92 port  6379
    69 bind   192.168.88.55
        838 cluster-enabled  yes                                 //启用集群功能  
        846 cluster-config-file  nodes-6379.conf         //存储集群信息文件
        852 cluster-node-timeout  5000  //集群中主机通信超时时间
    :wq
    ]# systemctl   start  redis
    ]# netstat -utnlp  | grep redis-serve
    tcp  0  0 192.168.88.55:6379  0.0.0.0:*   LISTEN      21201/redis-serve  
    tcp  0  0 192.168.88.55:16379   0.0.0.0:*   LISTEN   21201/redis-serve 

配置服务器192.168.88.56

    ]# yum -y install redis
    ]# vim  /etc/redis.conf
        92 port  6379
    69 bind   192.168.88.56
        838 cluster-enabled  yes                                 //启用集群功能  
        846 cluster-config-file  nodes-6379.conf         //存储集群信息文件
        852 cluster-node-timeout  5000  //集群中主机通信超时时间
    :wq
    ]# systemctl   start  redis
    ]# netstat -utnlp  | grep redis-serve
    tcp  0  0 192.168.88.56:6379  0.0.0.0:*   LISTEN      21201/redis-serve  
    tcp  0  0 192.168.88.56:16379   0.0.0.0:*   LISTEN   21201/redis-serve 

步骤二:创建集群

说明:

1、在任意一台redis服务器上都可以执行创建集群的命令。

2、--cluster-replicas 1 给每个master服务器分配一台slave服务器,每个主至少要分配1台slave服务器,不然无法实现redis服务的高可用。

3、创建集群时,会自动创建主从角色,默认把主机列表中的前3台服务器创建为

Master角色的redis服务器,剩下的均配置为slave角色服务器。

4、创建集群时,会自动给master角色的主机分配hash槽 ,通过hash槽实现数据的分布式存储。

    ]# redis-cli  --cluster   create   192.168.88.51:6379  192.168.88.52:6379  192.168.88.53:6379  192.168.88.54:6379 192.168.88.55:6379 192.168.88.56:6379  --cluster-replicas 1
    >>> Creating cluster
    >>> Performing hash slots allocation on 6 nodes...
    Using 3 masters:
    192.168.88.51:6379
    192.168.88.52:6379
    192.168.88.53:6379
    Adding replica 192.168.88.55:6379 to 192.168.88.51:6379
    Adding replica 192.168.88.56:6379 to 192.168.88.52:6379
    Adding replica 192.168.88.54:6379 to 192.168.88.53:6379
    M: 0eb3b7aa0493a19189cba35b0c658202cc20884b 192.168.88.51:6379
       slots:0-5460 (5461 slots) master
    M: a9cb8ccd31bf3eb70433c00906c9f1a99b5e8441 192.168.88.52:6379
       slots:5461-10922 (5462 slots) master
    M: f2c1bdb78d8d224c3666fa6440bdf80ba563c581 192.168.88.53:6379
       slots:10923-16383 (5461 slots) master
    S: bdba77868965371680fa825badff59bf8ef95a81 192.168.88.54:6379
       replicates f2c1bdb78d8d224c3666fa6440bdf80ba563c581
    S: 11510f42bfd9cf667bab5f31c01476d94984200a 192.168.88.55:6379
       replicates 0eb3b7aa0493a19189cba35b0c658202cc20884b
    S: fe572ce003ee634c52adc4b42d92d15f847937d7 192.168.88.56:6379
       replicates a9cb8ccd31bf3eb70433c00906c9f1a99b5e8441
    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.  //创建成功的提示

步骤三:查看集群信息

第一列:主服务器ip地址

第二列:主服务器ID

第三列:存储变量个数

第四列:hash槽个数 (hash槽的作用在集群存储工程过程里讲)

第五列:从服务器数量

    ]# redis-cli --cluster  info  192.168.88.51:6379
    192.168.88.53:6379 (f2c1bdb7...) -> 0 keys | 5461 slots | 1 slaves.
    192.168.88.51:6379 (0eb3b7aa...) -> 0 keys | 5461 slots | 1 slaves.
    192.168.88.52:6379 (a9cb8ccd...) -> 0 keys | 5462 slots | 1 slaves.
    [OK] 0 keys in 3 masters.
    0.00 keys per slot on average.

步骤四:访问集群

    [root@host51 ~]# redis-cli  -c -h 192.168.88.51 -p 6379
    192.168.88.51:6379> set school  tarena
    -> Redirected to slot [8455] located at 192.168.88.52:6379
    OK
    192.168.88.52:6379> set teacher plj
    -> Redirected to slot [12541] located at 192.168.88.53:6379
    OK
    192.168.88.53:6379> set class NSD
    -> Redirected to slot [741] located at 192.168.88.51:6379
    OK
    192.168.88.51:6379> 

会发现3个变量被分别存储到集群中的3台master服务器上,实现了数据的分布式存储。当连接集群中的任意一台redis服务器存储数据时,会调用集群CRC16算法 得出此次

存储变量使用的hash 槽,然后连接hash 槽 所在的master服务器存储变量。

在创建集群时会把默认的16384个槽平均的分配给集群中的3个master服务器。可以通过查看集群信息查看每个master服务器占用hash槽的个数。

    ]# redis-cli  --cluster  info  192.168.88.51:6379
    192.168.88.53:6379 (f2c1bdb7...) -> 0 keys | 5461 slots | 1 slaves.
    192.168.88.51:6379 (0eb3b7aa...) -> 0 keys | 5461 slots | 1 slaves.
    192.168.88.52:6379 (a9cb8ccd...) -> 0 keys | 5462 slots | 1 slaves.
    [OK] 0 keys in 3 masters.
    0.00 keys per slot on average.

集群中slave角色的主机会自动同步master角色主机的数据,实现数据的自动备份,

分别连接集群中的3台slave服务器查看变量

    [root@host54 ~]# redis-cli -c -h 192.168.88.54 -p 6379
    192.168.88.54:6379> keys *
    1) "class"
    [root@host55 ~]# redis-cli -c -h 192.168.88.55 -p 6379
    192.168.88.55:6379> keys *
    1) "school"
    [root@host56 ~]# redis-cli -c -h 192.168.88.56 -p 6379
    192.168.88.56:6379> keys *
    1) "teacher"

当master角色的服务器宕机时,对应的slave服务器会升级为master 并接手对应的hash槽,实现redis服务的高可用,例如停止host53主机的redis服务,对应的从会升级为master 。(当宕机的master恢复后 自动做当前主的从服务器)

    停止redis服务
    [root@host53 ~]# systemctl  stop  reddis  
    查看集群信息
    [root@host51 ~]#]# redis-cli --cluster  info  192.168.88.51:6379
    192.168.88.54:6379 (f2c1bdb7...) -> 1 keys | 5461 slots | 0 slaves.
    192.168.88.51:6379 (0eb3b7aa...) -> 1 keys | 5461 slots | 1 slaves.
    192.168.88.52:6379 (a9cb8ccd...) -> 1 keys | 5462 slots | 1 slaves.
    [OK] 0 keys in 3 masters.
    keys per slot on average.
    启动redis服务
    [root@host53 ~]# systemctl  start  reddis 
    查看集群信息
    [root@host51 ~]#]# redis-cli --cluster  info  192.168.88.51:6379
    192.168.88.54:6379 (f2c1bdb7...) -> 1 keys | 5461 slots | 1 slaves.
    192.168.88.51:6379 (0eb3b7aa...) -> 1 keys | 5461 slots | 1 slaves.
    192.168.88.52:6379 (a9cb8ccd...) -> 1 keys | 5462 slots | 1 slaves.
    [OK] 0 keys in 3 masters.
    keys per slot on average.
    存储数据脚本
    [root@redis64 ~]# vim /usr/local/nginx/html/set.php
    <?php
    $redis_list = ['192.168.88.51:6379','192.168.88.52:6379','192.168.88.53:6379','192.168.88.54:6379','192.168.88.55:6379','192.168.88.56:6379'];
    $client = new RedisCluster(NUll,$redis_list);
    $client->set("i","tarenaA ");
    $client->set("j","tarenaB ");
    $client->set("k","tarenaC ");
    echo "save ok\n";
    ?>
    :wq
    查看数据脚本
    [root@ redis64 ~]# vim  /usr/local/nginx/html/get_data.php 
    <?php
    $redis_list = ['192.168.88.51:6379','192.168.88.52:6379','192.168.88.53:6379','192.168.88.54:6379','192.168.88.55:6379','192.168.88.56:6379'];  //定义redis服务器列表
    $client = new RedisCluster(NUll,$redis_list); //定义连接redis服务命令
    echo $client->get("i");  //获取变量i 的数据
    echo $client->get("j");  //获取变量j 的数据
    echo $client->get("k");  //获取变量k 的数据
    ?>
    :wq

3)访问脚本

    ]# curl http://192.168.88.64/set_data.php
    save ok 
    ]# curl http://192.168.88.64/get_data.php
    tarenaA tarenaB tarenaC 

4)命令行连接redis集群主机查看数据

    [root@host51 ~]# redis-cli -c -h 192.168.88.51 -p 6379
    192.168.88.51:6379> keys *
    1) "j"
    [root@host52 ~]# redis-cli -c -h 192.168.88.52 -p 6379
    192.168.88.52:6379> keys *
    1) "k"
    [root@host53 ~]# redis-cli -c -h 192.168.88.53 -p 6379
    192.168.88.53:6379> keys *
    1) "i"

文章来源:https://blog.csdn.net/fmj121030/article/details/135742014
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。