Memcached客户端

LNMP快速部署

Nginx (nginx 的解压缩包所在目录不能和nginx编译指定的prefix在同一目录)

yum install pcre pcre-devel  openssl openssl-devel -y 
wget http://nginx.org/download/nginx-1.16.0.tar.gz
useradd nginx -u 1111 -s /sbin/nologin -M
tar -zxf nginx-1.16.0.tar.gz
cd nginx-1.16.0/
./configure --user=nginx --group=nginx --prefix=/opt/nginx-1.16.0 --with-http_stub_status_module --with-http_ssl_module
make && make install

# 启动
[root@memcached01 nginx-1.16.0]# /opt/nginx-1.16.0/sbin/nginx

  mysql

1.创建mysql用户
[root@web01 ~]# useradd -s /sbin/nologin mysql
[root@web01 ~]# id mysql
uid=1000(mysql) gid=1000(mysql) 组=1000(mysql)
 
2.下载mysql二进制软件包,提前配置好yum源,下载wget命令
[root@web01 ~]# yum install wget -y
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.re
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
 
[root@web01 ~]# mkdir -p /home/mysql/tools
[root@web01 ~]# cd /home/mysql/tools/
# 该mysql文件600M左右,下载时间看网速
[root@web01 tools]# wget  http://mirrors.163.com/mysql/Downloads/MySQL-5.7/mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz


## 二进制方式安装mysql


1.解压并且移动mysql二进制软件包路径
[root@web01 tools]# tar -zvxf mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz
[root@web01 tools]# mv mysql-5.7.26-linux-glibc2.12-x86_64 /opt/mysql-5.7.26
 
2.生成软连接
[root@web01 opt]# ln -s /opt/mysql-5.7.26/ /opt/mysql
[root@web01 opt]# ls -l /opt/
总用量 0
lrwxrwxrwx 1 root root  18 3月  18 10:15 mysql -> /opt/mysql-5.7.26/
drwxr-xr-x 9 root root 129 3月  18 10:13 mysql-5.7.26
 
3.卸载centos7自带的mariadb库,防止冲突
[root@web01 mysql]# rpm -e --nodeps mariadb-libs
 
 
4.手动创建mysql配置文件 vim /etc/my.cnf
[root@web01 mysql]# cat /etc/my.cnf
[mysqld]
basedir=/opt/mysql/
datadir=/opt/mysql/data
socket=/tmp/mysql.sock
server_id=1
port=3306
log_error=/opt/mysql/data/mysql_err.log
 
[mysql]
socket=/tmp/mysql.sock


## 初始化mysql
1.卸载系统自带的centos7 mariadb-libs,且安装mysql的依赖环境
rpm -qa mariadb-libs #检查是否存在
[root@web01 mysql]# yum install libaio-devel -y
 
2.创建mysql数据文件夹且授权
[root@web01 mysql]# mkdir -p /opt/mysql/data
[root@web01 mysql]# chown -R mysql.mysql /opt/mysql/
 
3.初始化数据库
[root@web01 mysql]# /opt/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/opt/mysql/ --datadir=/opt/mysql/data/
 
# 参数解释
--user=mysql 指定用户
--basedir 指定mysql安装目录
--datadir=/opt/mysql/data 指定数据文件夹
--initialize-insecure 关闭mysql安全策略
--initialize 开启mysql安全模式

## 配置mysql客户端
1.配置mysql启动脚本,定义mysqld.service,脚本如下
[root@web01 mysql]# cat /etc/systemd/system/mysqld.service
[Unit]
Description=MySQL server by chaoge
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/opt/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE=5000

## 启动mysql
[root@web01 mysql]# systemctl start mysqld
[root@web01 mysql]# systemctl enable mysqld
Created symlink from /etc/systemd/system/multi-user.target.wants/mysqld.service to /etc/systemd/system/mysqld.service.
[root@web01 mysql]# systemctl status mysqld
● mysqld.service - MySQL server by chaoge
   Loaded: loaded (/etc/systemd/system/mysqld.service; disabled; vendor preset: disabled)
   Active: active (running) since 三 2020-03-18 11:30:01 EDT; 6s ago
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html
 Main PID: 5315 (mysqld)
   CGroup: /system.slice/mysqld.service
           └─5315 /opt/mysql/bin/mysqld --defaults-file=/etc/my.cnf
 
3月 18 11:30:01 web01 systemd[1]: Started MySQL server by chaoge.
3月 18 11:30:01 web01 systemd[1]: Starting MySQL server by chaoge...

## 修改mysql密码
[root@web01 ~]# mysqladmin -uroot password 'chaoge666'
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
Warning: Since password will be sent to server in plain text, use ssl connection to ensure password safety.
 
# 再次登录,输入密码
[root@web01 ~]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.7.26 MySQL Community Server (GPL)
 
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
 
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
mysql>

  php

yum install  gcc gcc-c++ make zlib-devel libxml2-devel libjpeg-devel libjpeg-turbo-devel libiconv-devel \
freetype-devel libpng-devel gd-devel libcurl-devel libxslt-devel libxslt-devel -y

[root@memcached01 nginx-1.16.0]# cd /opt/lnmp/
[root@memcached01 lnmp]# ls
nginx-1.16.0  nginx-1.16.0.tar.gz
[root@memcached01 lnmp]#
[root@memcached01 lnmp]# wget http://mirrors.sohu.com/php/php-7.3.5.tar.gz
tar -zxvf php-7.3.5.tar.gz
cd php-7.3.5

./configure --prefix=/opt/php7.3.5 \
--enable-mysqlnd \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-freetype-dir \
--with-jpeg-dir \
--with-png-dir \
--with-zlib \
--with-libxml-dir=/usr \
--enable-xml \
--disable-rpath \
--enable-bcmath \
--enable-shmop \
--enable-sysvsem \
--enable-inline-optimization \
--with-curl \
--enable-mbregex \
--enable-fpm \
--enable-mbstring \
--with-gd \
--with-openssl \
--with-mhash \
--enable-pcntl \
--enable-sockets \
--with-xmlrpc \
--enable-soap \
--enable-short-tags \
--enable-static \
--with-xsl \
--with-fpm-user=nginx \
--with-fpm-group=nginx \
--enable-ftp \
--enable-opcache=no

make && make install


# 配置文件
[root@memcached01 php-7.3.5]# pwd
/opt/lnmp/php-7.3.5
[root@memcached01 php-7.3.5]# cp php.ini-development /opt/php7.3.5/lib/php.ini


[root@memcached01 php-7.3.5]# cd /opt/php7.3.5/etc/
[root@memcached01 etc]# ls
pear.conf  php-fpm.conf.default  php-fpm.d
[root@memcached01 etc]# cp php-fpm.conf.default php-fpm.conf
[root@memcached01 etc]#
[root@memcached01 etc]#
[root@memcached01 etc]#  cp php-fpm.d/www.conf.default php-fpm.d/www.conf

# 启动
[root@memcached01 etc]# /opt/php7.3.5/sbin/php-fpm
[root@memcached01 etc]# ps -ef|grep php
root      14782      1  0 04:48 ?        00:00:00 php-fpm: master process (/opt/php7.3.5/etc/php-fpm.conf)
nginx     14783  14782  0 04:48 ?        00:00:00 php-fpm: pool www
nginx     14784  14782  0 04:48 ?        00:00:00 php-fpm: pool www

  nginx结合php

[root@memcached01 etc]# cat /opt/nginx-1.16.0/conf/nginx.conf

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    gzip  on;
include extra/03_blog.conf;
}

[root@memcached01 etc]# mkdir /opt/nginx-1.16.0/conf/extra
[root@memcached01 etc]# cat /opt/nginx-1.16.0/conf/extra/03_blog.conf

server {
listen 80;
server_name _;
location / {
    root html/blog;
    index index.html;
}

#添加有关php程序的解析
location ~ .*\.(php|php5)?$ {
    root html/blog;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    include fastcgi.conf;
}


}

# 重启
[root@memcached01 etc]# /opt/nginx-1.16.0/sbin/nginx -s reload

  测试lnmp

[root@memcached01 extra]# mkdir /opt/nginx-1.16.0/html/blog
[root@memcached01 etc]# echo "<?php phpinfo(); ?>"  > /opt/nginx-1.16.0/html/blog/index.php

  

部署memcached支持php插件

memcached是分为服务端和客户端的。服务端我们已经启动,这里为lnmp连接memcached属于客户端的插件配置。

这里要注意的是,新版php7对于memcached的支持还需要手动装插件,这里是一个坑,遇见坑不怕,咱可以看报错,上google。。

安装依赖环境

# 安装依赖环境
cd /opt && \
wget https://launchpad.net/libmemcached/1.0/1.0.18/+download/libmemcached-1.0.18.tar.gz
[root@memcached01 opt]# tar -zxf libmemcached-1.0.18.tar.gz
[root@memcached01 opt]# cd libmemcached-1.0.18/
[root@memcached01 libmemcached-1.0.18]# ./configure --prefix=/opt/libmemcached
[root@memcached01 libmemcached-1.0.18]# make && make install

  【安装memcached扩展】

# 然后
cd /opt && \
git clone https://github.com/php-memcached-dev/php-memcached.git
[root@memcached01 opt]# cd php-memcached/
[root@memcached01 php-memcached]# /opt/php7.3.5/bin/phpize
Configuring for:
PHP Api Version:         20180731
Zend Module Api No:      20180731
Zend Extension Api No:   320180731

[root@memcached01 php-memcached]# ./configure --with-libmemcached-dir=/opt/libmemcached/   --with-php-config=/opt/php7.3.5/bin/php-config
[root@memcached01 php-memcached]# make && make install

# 最后检查php的插件目录,是否出现了mencached
[root@memcached01 opt]# ls /opt/php7.3.5/lib/php/extensions/no-debug-non-zts-20180731/
memcached.so  # 看到该模块才是正确

  【安装memcache扩展】

1.下载
cd /opt && \
git clone https://github.com/websupport-sk/pecl-memcache

2.安装
[root@memcached01 opt]# cd pecl-memcache/
[root@memcached01 pecl-memcache]# /opt/php7.3.5/bin/phpize
Configuring for:
PHP Api Version:         20180731
Zend Module Api No:      20180731
Zend Extension Api No:   320180731

[root@memcached01 pecl-memcache]# ./configure  --with-php-config=/opt/php7.3.5/bin/php-config
[root@memcached01 pecl-memcache]# make && make install

# 检查扩展文件,看到这俩才是正确
[root@memcached01 pecl-memcache]# ls /opt/php7.3.5/lib/php/extensions/no-debug-non-zts-20180731/
memcached.so  memcache.so

  【验证phpinfo】

修改/opt/php7.3.5/lib/php.ini

# 修改如下3行信息
 751 extension_dir = "/opt/php7.3.5/lib/php/extensions/no-debug-non-zts-20180731/"
 752 extension = memcached.so
 753 extension = memcache.so

# 重新加载php-fpm服务,检验配置文件语法,正确才行
[root@memcached01 opt]# /opt/php7.3.5/sbin/php-fpm -t
[07-Aug-2020 05:31:38] NOTICE: configuration file /opt/php7.3.5/etc/php-fpm.conf test is successful






# 重启
[root@memcached01 opt]# pkill php-fpm
[root@memcached01 opt]# ps -ef|grep php-fpm
root      43691  11317  0 05:32 pts/0    00:00:00 grep --color=auto php-fpm
[root@memcached01 opt]# /opt/php7.3.5/sbin/php-fpm
[root@memcached01 opt]# ps -ef|grep php-fpm
root      43693      1  0 05:32 ?        00:00:00 php-fpm: master process (/opt/php7.3.5/etc/php-fpm.conf)
nginx     43694  43693  0 05:32 ?        00:00:00 php-fpm: pool www
nginx     43695  43693  0 05:32 ?        00:00:00 php-fpm: pool www
root      43697  11317  0 05:32 pts/0    00:00:00 grep --color=auto php-fpm

  

 

 

 【验证php操作memcached】

[root@memcached01 blog]# pwd
/opt/nginx-1.16.0/html/blog
[root@memcached01 blog]# cat test_memcached.php


<?php                               #PHP开始标识
$memcache = new Memcache;           #创建一个Memcache对象
$memcache->connect('10.0.1.40','11211') or die ("Could not connect Mc server");                               #连接Memcached服务器
$memcache->set('name01','chaoge nb');         #设置一个变量到内存中
$get=$memcache->get('name01');                 #从内存中取出key
echo $get;                              #输出key值到屏幕
?>                                      #PHP结束标识

  【测试脚本】

[root@memcached01 blog]# /opt/php7.3.5/bin/php test_memcached.php

chaoge nb                                      #PHP结束标识

  

 

 

 

Memadmin工具

在工作里,我们经常会去寻找一些强大的第三方工具,去帮助我们更方便的管理系统。

运维人员除了通过命令行的形式,去管理memcached,还可以使用一些很好用的第三方工具。例如memadmin工具,该软件依赖于PHP环境,且功能强大。

 

部署环境

该工具是基于PHP开发的,因此得部署好PHP环境,前面已经部署了LNMP环境,因此直接进行操作即可。

1.获取软件包,官网http://www.junopen.com/memadmin/
下载地址:http://www.junopen.com/memadmin/memadmin-1.0.12.tar.gz
wget http://www.junopen.com/memadmin/memadmin-1.0.12.tar.gz

2.解压缩
[root@memcached01 opt]# tar -zxf memadmin-1.0.12.tar.gz

3.移动该程序,到lnmp站点下即可,此时去了解下nginx的配置
[root@memcached01 opt]# mv memadmin /opt/nginx-1.16.0/html/blog/

4.此时已经可以直接访问该程序
http://10.0.1.40/memadmin/index.php
默认的账号密码是 admin

  

新建连接

这样的数据库管理界面,最好是通过nginx进行访问限制,只能内网访问。

 

 

 

开始管理

只要memcached正确启动,连接的ip+port正确,即可进入管理

【基本界面】

 

 

【数据统计信息】

常见数据库的key信息如下,主要统计memcached的读写次数,总key等。

 

 

通过这样的页面,可以更为直观清晰的掌握数据库信息,这也是运维开发人员的重要技能。

【统计get次数】

 

 

 设置刷新频率

 

 

[root@memcached01 blog]# printf "get chaoge01\r\n"|nc 10.0.1.40 11211
END
[root@memcached01 blog]# printf "get chaoge01\r\n"|nc 10.0.1.40 11211
END
[root@memcached01 blog]# printf "get chaoge01\r\n"|nc 10.0.1.40 11211
END
[root@memcached01 blog]# printf "get chaoge01\r\n"|nc 10.0.1.40 11211
END

  

 

 

 【统计多个指标】

 

 

 【统计命中率】

命中率就表示用户get查找数据,在memcached缓存中成功找到了。

 

 

多次未找到数据,命中率越来越低

[root@memcached01 blog]# printf "get chaoge01\r\n"|nc 10.0.1.40 11211
END
[root@memcached01 blog]# printf "get chaoge01\r\n"|nc 10.0.1.40 11211
END
[root@memcached01 blog]# printf "get chaoge01\r\n"|nc 10.0.1.40 11211
END
[root@memcached01 blog]# printf "get chaoge01\r\n"|nc 10.0.1.40 11211
END

 成功找到数据,命中率变高,运维同学可以根据此命中率,来判断,用户获取数据是否有缓存失效等问题

[root@memcached01 blog]# printf "get name01\r\n"|nc 10.0.1.40 11211
VALUE name01 0 8
chaoge66
END
[root@memcached01 blog]# printf "get name01\r\n"|nc 10.0.1.40 11211
VALUE name01 0 8
chaoge66
END
[root@memcached01 blog]# printf "get name01\r\n"|nc 10.0.1.40 11211
VALUE name01 0 8
chaoge66
END
[root@memcached01 blog]# printf "get name01\r\n"|nc 10.0.1.40 11211
VALUE name01 0 8
chaoge66
END
[root@memcached01 blog]# printf "get name01\r\n"|nc 10.0.1.40 11211
VALUE name01 0 8
chaoge66
END

  

 

 

 【读写数据】

 

 

 

 

 部署wordpress

https://www.cnblogs.com/abc1234567/p/14186665.html#_label15

 注意严格按照笔记来操作,使用mysql,而不是mariadb数据库wordpress只能用mysql,而不是mariadb。且虚拟机的内存给大一点

部署memcached来缓存wordpress数据

wordpress缓存数据缓存到memcached中
https://cn.wordpress.org/plugins/memcached/
下载链接
wget https://downloads.wordpress.org/plugin/memcached.3.2.2.zip

#解压缩
unzip memcached.3.2.2.zip

# 得到配置文件
[root@memcached01 memcached]# pwd
/opt/memcached
[root@memcached01 memcached]# ls
object-cache.php  readme.txt
# 需要做做如下的事情
# 吧object-cache.php文件,移动到nginx站点下,也就是wordpress站点下
Install this file to wp-content/object-cache.php

# 操作如下
[root@memcached01 wp-content]# cd /opt/memcached
[root@memcached01 memcached]# ls
object-cache.php  readme.txt
[root@memcached01 memcached]#
[root@memcached01 memcached]# cp object-cache.php /opt/nginx-1.16.0/html/blog/wp-content/

# 修改该配置文件,修改wordpress的缓存放入memcached地址
[roo t@memcached01 wp-content]# grep 10.0.1.40 object-cache.php  -n
745:            $buckets = array( '10.0.1.40:11211' );

# 此时可以访问博客站点,,可以打开memadmin检测

  

此时使用memadmin来统计get命中率

其实在登录的时候,wordpress的数据以及缓存到memached里了

 

 

用wordpress来写一篇文章

 

 

此时可以查看memcached的数据到底存了些什么

 

 

也可以在命令行中,登录查看wordpress数据

1.wordpress数据是存在mysql数据库的,且缓存到memcached里,加快访问,可以在mysql里找数据
大致SQL如下
mysql> show databases;
mysql> use wordpress;
mysql> shwo tables;
mysql> desc wp_posts;

select * from wp_posts where ID=6\G;

  

memcached案例二(会话共享)

session的作用

session主要是web开发中设置,服务器会为每个用户创建一个会话(session),存储用户的相关信息,便于再后续的请求中,都能够定位同一个上下文。

例如你在登录了淘宝网之后,又继续点击淘宝网的其他页面进行了跳转,淘宝网是怎么知道,你还是你?这就是因为session的作用,服务器通过你的session记录,知道了你,还是你。
如果用户没有session,服务器会创建一个session独享,直到会话过期或者主动释放(用户退出登录),服务器才会终止session。

  

 

 

 分布式架构的session

【单体服务器架构】

在单体服务器的年代,session直接保存在单台机器,完全没有任何问题,也就是我们学习的LNMP架构。

【分布式架构】

这就涉及到我们所学的web集群,lnmp集群了

 

 

随着分布式架构的流行,单个服务器已经不能满足系统的需要了,通常都会把系统部署在多台服务器上,通过负载均衡把请求分发到其中的一台服务器上;

那么很有可能第一次请求访问的 A 服务器,创建了 Session ,但是第二次访问到了 B 服务器,这时就会出现取不到 Session 的情况;

于是,分布式架构中,Session 共享就成了一个很大的问题。

分布式架构session解决方案

  1. 禁用session

  这种场景是存在的,当然不会用于普通的web站点,而是在一些【无状态服务】下进行的接口开发,每一次的接口访问,是不依赖于上一次的session的。这个我们了解即可。

  2. 存入cookie

  cookie是存在用户浏览器本地的,如果我们把session也存入用户本地,这可以解决session分布式的问题,但是缺点也很大,就是信息不安全,如果黑客在你本地盗取了cookie,你的账户就有危险了。

  3. ip绑定策略

  这种方案是利用负载均衡的IP绑定策略,例如超哥交给大家的Nginx负载均衡的算法,ip_hash,能够保证用户请求只发往一个后台机器,但是这种也有缺点,就是当后端对应的单台服务器如果挂掉,则会影响一大批用户,风险也很大。

  4. 服务器session同步

  在服务器之间进行对session文件同步,可以保证每台服务器上都有有效的session信息,但是缺点是服务器规模如果较大,效率会很低,且有延迟。

  5. 使用缓存数据库

  最优的方案是将用户session信息存入redis,memcached这样的数据库中,这的优点是

    1. 使用memcached进行session共享

    2. 可以水平扩展,增加memcached服务器

    3. 可以跨服务器进行session共享,甚至跨平台,如网页和app端

    4. 服务器重启数据也不丢失,这个得依赖于redis的持久化功能,memcached无法实现

部署memcached会话共享

完成session共享有如下2个方案:

1.通过程序实现,web01只需要向memcached里写入session,web01向memcached读取session,当做普通数据来读写

2.通过php的配置修改,php默认是将用户session存储在文件里,改为Memcached存储

  

修改php配置文件

有关session设置的,php配置文件,有如下
[root@memcached01 php7.3.5]# grep '^session'  lib/php.ini
session.save_handler = files
session.use_strict_mode = 0
session.use_cookies = 1
session.use_only_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.cookie_path = /
session.cookie_domain =
session.cookie_httponly =
session.cookie_samesite =
session.serialize_handler = php
session.gc_probability = 1
session.gc_divisor = 1000
session.gc_maxlifetime = 1440
session.referer_check =
session.cache_limiter = nocache
session.cache_expire = 180
session.use_trans_sid = 0
session.sid_length = 26
session.trans_sid_tags = "a=href,area=href,frame=src,form="
session.sid_bits_per_character = 5

  【操作如下】

 修改两行有关会话数据的配置

[root@memcached01 php7.3.5]# grep 'session.save' lib/php.ini  -n
1337:; http://php.net/session.save-handler
1338:session.save_handler = files
1346:;     session.save_path = "N;/path"
1362:;     session.save_path = "N;MODE;/path"
1366:; http://php.net/session.save-path
1367:;session.save_path = "/tmp"
1458:;       (see session.save_path above), then garbage collection does *not*

  修改命令

# 替换一行配置,并且在最底行加上一行配置
[root@memcached01 php7.3.5]# sed -i 's#session.save_handler = files#session.save_handler = memcache#;$a session.save_path = "tcp://10.0.1.40:11211"'  /opt/php7.3.5/lib/php.ini


# 检查替换结果
[root@memcached01 php7.3.5]# grep '^session.save' lib/php.ini  -n
1338:session.save_handler = memcache
1948:session.save_path = "tcp://10.0.1.40:11211"

  再来检查php的配置,因为需要php能够支持session的处理,通过phpinfo检查,或者命令

[root@memcached01 php7.3.5]# /opt/php7.3.5/bin/php -i |grep session

# 或者添加phpinfo文件,在lnmp站点下

cat test_info.php
<?php
phpinfo();
?>

  

 

 这里是告诉大家,如果你公司用的是php进行开发,那么php保存会话,写入到memcached的配置就是这样,改如上两行配置即可。当你公司用php开发的网站,用户登录后,php就会将用户的session信息,存入到memcached里,这就是我们运维人员所需要学会,以及执行的任务。 

 

posted @ 2021-01-22 22:09  时间的侵蚀  阅读(434)  评论(0编辑  收藏  举报