自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

原创 10-千奇百怪的排序算法

每天晚上给室友手撕代码的笔记

2022-08-08 16:25:47 21

原创 Redis 的网络框架是实现了 Reactor 模型吗?

事件驱动框架的基本运行流程,并以客户端连接事件为例,将框架主循环、事件捕获分发和事件注册的关键步骤串起来,给你做了介绍

2022-07-31 20:40:28 165

原创 Redis server启动后会做哪些操作?

平常在设计或实现一个网络服务器程序时,可能会遇到一个问题,那就是服务器启动时,应该做哪些操作、有没有一个典型的参考实现。Redis server 设计和实现的启动过程也具有一定的代表性,你在学习后,就可以把其中的关键操作推而广之,用在自己的网络服务器实现中。...

2022-07-28 15:36:46 210

原创 redis分布式锁的原子保证

redis分布式锁的原子保证,是什么为什么怎么样

2022-07-27 16:44:39 165

原创 锁与原子操作CAS的底层实现

这里写自定义目录标题先思考为什么要有锁的概念,为什么要有锁呢?主要讲posix api的锁,主要互斥锁,自旋锁,读写锁,原子操作再是在多进程的情况下面的共享内存还有比如说分布式锁,那个乐观锁,悲观锁,公平锁这些分布式的锁,在后面中间件讲主要核心先把这些posix API里面这些底层的锁解释清楚,后面再讲一个自己实现一个try-catch怎么做,原理又怎么样,抛异常,捕获异常以及在finaly里面处理时这三个怎么去实现,这个异常是怎么抛的?先思考为什么要有锁的概念,为什么要有锁呢?因为随着

2022-05-12 18:58:41 72

原创 手写线程池与性能分析

这里写自定义目录标题作为一款服务器而言,很多服务器的源码,最底层最底层这些东西,是很通用的比如我们之前讲过的网络,以及池式结构,最底层的这些组件是提供给我们应用层写业务逻辑的在工作中接触的并不是很多,但是在面试的时候会问很多,工作中是以写业务为主,比如说工作中要你写个线程池这种可能性不大,比如说要你写一个连接池的可能性也不大,大量的时间可能是在写业务为主,那但是这个东西了,他在面试的时候,又是非常非常管用的东西。简历里面肯定写一些通用的组件为主。4个池式结构先跟大家解释一下就是这些东西到底是用

2022-05-03 12:17:51 251

原创 虚拟网络适配器的实现

虚拟网络适配器的实现什么是服务器?关于服务器,有这么三层概念都被称为是对的,在不同的场景里面说,第一种被称为服务器,就是说的物理硬件机房,服务器物理硬件这是第一种。第二层在服务器中除了这个概念之外,还有大家比如说像windows做桌面,然后linux做服务器,那其实这个服务器另一层意思是一定意义上操作系统第三个在操作系统里面提供一个应用程序,对外提供网络服务,对外提供网络应用服务那现在这三层的概念又会慢慢的衍生出来了,对外提供服务可能有些机房对外提供服务,云计算这个概念,那对外提供物理硬件这

2022-04-14 21:49:33 610

原创 posix API与网络协议栈的实现原理

推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习posix API与网络协议栈的实现原理网络一共有8类技术文章:本文是这系列文章最后一篇下一专题写池式结构:写完池式结构就写底层组件是怎么做的,比如libevent做网络编程的时候,所接触到所有的网络编程,往底层走,往底层去看一看的时候,

2022-04-09 12:30:24 2146

原创 进程原理及系统调用

推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习进程原理及系统调用进程概念 进程四要素与线程区别进程生命周期task_struct数据结构进程优先级进程系统调用进程复制内核线程退出进程进程概念操作系统作为硬件的使用层,提供使用硬件资源的能力,进程作为操作系统使用层, 提供使用操作系统抽象出的资源

2022-04-05 16:34:45 1041

原创 Linux内核源码的组织结构

推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习Linux内核源码的组织结构为什么要学习Linux内核Linux操作系统结构Linux内核源码组织Linux内核的特征为什么要学习Linux内核提高研发出高水平的软件开发自己的操作系统有助于计算机科学领域研究Linux系统性能优化Lin

2022-04-05 10:05:23 1290

原创 实现高并发http 服务器

推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习实现高并发http 服务器需求分析需求分析实现一个http 服务器项目,服务器启动后监听80端口的tcp 连接,当用户通过任意一款浏览器(IE、火狐和腾讯浏览器等)访问我们的http服务器,http服务器会查找用户访问的html页面是否存在,如果存

2022-04-04 19:54:50 207

原创 Linux系统中的文件操作

推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习Linux系统中的文件操作文件的作用Linux的文件结构文件操作方式底层文件操作(关于文件的系统调用)系统调用标准I/O库proc文件系统文件锁文件的作用 linux中,一切皆文件(网络设备除外)硬件设备也“是”文件,通过文件来使用设备目录(文

2022-04-03 10:35:22 70

原创 基础的网络服务器开发

推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习基础的网络服务器开发需求分析项目实现网络通信与SocketSocket 编程详解套接字概念Socket编程基础网络字节序sockaddr数据结构IP地址转换函数Socket编程函数socket 函数bind 函数listen 函数accept 函数

2022-04-03 09:53:13 147

原创 skynet设计原理

第一个主要是skynet设计原理,skynet主要是一个actor模型的一个封装,详细的介绍actor是什么,actor之间的一个消息是怎样来进行通讯的以及如何来调度的第二个讲解一些lua原理,以及我们的这个网络封装相关第三节会讲解具体的实际应用,实际应用主要从这三个方面来讲解,第一个网关的封装,第二个实际项目当中的热更新到底怎么做,第三个会跟大家讲解比较常用的一个技术,就是我们的监听发布skynet它是属于一个多核并发编程的模型多核并发编程的模型网络编程当中memcached是多线程,多线程的数

2022-03-17 17:36:14 904

原创 nginx过滤器模块

推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习从http的初始化到它的整个流程是怎么形成的?第二个就是我们实现一个过滤器的模块什么是过滤器呢?你在申请网页的时候,打开浏览器可以看到这里有两个字叫做广告,在我们申请网页的过程,这个广告是怎么做的?我们去申请这个网页的时候,请注意广告的显

2022-03-12 14:56:22 4449

原创 Nginx数据结构

Nginx数据结构【人物1】避免的一些葡萄冰糖分2节两地方,我们课时分几次排5次课已经够了,排5次课已经够了,那现在这里面分2个电话,等下又出现这种课安排不是很紧凑,所以呢这次呢我们就跟大家核心的就跟大家讲讲这个恩吉斯的数据结构,首先我们来问一下,我想问一下各位,我们如果尽管上面几个大家有下载恩吉斯原貌的朋友可以看老师也双肩老板,他说你没有自己去看过恩迪斯原貌的朋友。那我们再来问大家一个问题,就是历史原法里面该怎么去看里面有哪些东西?首先解释一下,在温恩吉斯这个代码的话,他在面试的过程中间被问到的

2022-03-10 20:30:21 2870

原创 tcp支持浏览器websocket协议

推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习tcp支持浏览器websocket协议一个io它是怎么一种情况,一个客户端连接一个服务器,一个客户端一个连接,大家时刻在做服务器,都是时刻抓住这样一个点,就是说一个客户端在服务端会有一个网络io,一个客户端在服务端会有一个网络io,之前用epoll

2022-03-09 18:37:30 3463

原创 Mybatis学习文章

Mybatis环境:JDK1.8;IDEA;Mysql5.7;maven3.6.1;1、简介1.1、什么是MybatisMyBatis 是一款优秀的持久层框架MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的过程MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 实体类 【Plain Old Java Objects,普通的 Java对象】映射成数据库中的记录。MyBatis 本是apache的一个开源项目iba

2022-03-08 17:37:41 296

原创 tcp服务器epoll的多种实现

这里写自定义目录标题我们在读写文件的时候,这是一款服务器,CS,这是一个服务器,这个客户端去连接服务器的时候,中间大家知道从连接的这个过程中间产生通过三次握手连接,服务器先进行监听一个端口,监听的时候是用调用listen进行监听,TCP网络编程模型就好比这样一个模型,大家去酒店吃饭,走到那个饭店的门口门口有一个迎宾的人,有迎宾的小姐姐,然后你跟她说吃饭,她把你带进餐馆里面,然后给你介绍一个真正的服务员,后面你点菜买单,然后包括像夹菜点酒都是由这个服务员为你去服务。这里面这个酒店出现两个人,一个是对你

2022-03-06 11:04:43 776 1

原创 协程的调度实现与性能测试

协程的调度实现与性能测试那我怎么在简历里面写协程,协程这个东西实在真的太好用了,你可以跟很多东西结合到一起,比如说你们对文件,做文件操作可不可以用?好对文件操作,比如说你做日志落盘的时候,可不可以用协程来操作它也是可以的,比如说你对数据库的操作,对数据库的操作,还有包括像一些网络io的处理,这个文件的操作和网络io都是针对文件io来处理。然后我们尽量知道他用到哪里,协程怎么用到数据库?这是我们今天等一下跟大家讲到的讲到的就是关于携程的API的封装。一个线程里面多个协程是怎么运行的?好比多个线程在一

2022-03-04 00:35:28 172

原创 协程的设计原理与汇编实现

第一个问题,为什么会协程?以及协程到底解决了什么问题?第一个同步的方式实现异步的效率同步为什么效率低,而异步的为什么效率高?等待没错,他需要等待,那这个等待是什么意思?第一个案例之前跟大家讲的100万并发的案例第二个案例异步请求的案例现象区别:if 1 用了 workqueue,每1000个耗时 1400对fd直接进行写,每秒接入量5600那现在这个工作队列他为什么在这个过程引入工作队列,他就能够提升性能呢?,他是从哪些方面原因那这个要跟他分析这个要跟大家分析,直接进行读写工作队

2022-03-03 12:46:11 136

原创 用户态协议栈

那我们先呢跟大家解释这个协议栈这个东西啊协议栈这个东西呢或多或少啊各个朋友应该都听过,就是关于网络协议栈或多或少都听过,那我们今天来跟大家讲,啊就是我们站在一个设计者的角度,站在一个设计者的角度,站在tcpip的个人的角度,我们怎么去设计这个协议的?设计队的角度来设计这个网络协议战。就是各位朋友们你想一下这个网络协议战,有很多朋友就会想到一个点,那为什么我们还需要去设计一个网络系统,我们不是去学这个东西就可以吗?其实我也跟大家解释一下,其实你在那把网络协议上理解的很透彻的话,你一定要站在一个设

2022-03-02 00:56:33 954

原创 海量数据去重hash与布隆过滤器

海量数据去重hash与布隆过滤器背景缓存穿透需求set和mapunordered_map总结布隆过滤器代码背景在使⽤word⽂档时,word如何判断某个单词是否拼写正确?⽹络爬⾍程序,怎么让它不去爬相同的url⻚⾯?允许有误差垃圾邮件(短信)过滤算法如何设计?允许有误差公安办案时,如何判断某嫌疑⼈是否在⽹逃名单中?控制误差 假阳率缓存穿透问题如何解决?允许有误差缓存穿透描述缓存场景,为了减轻落盘数据库(mysql)的访问压⼒,在server端与mysql之间加⼊⼀层缓冲数据层(⽤来存

2022-02-26 21:41:37 609 1

原创 磁盘存储链式的 B 树与 B+树

推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习磁盘存储链式的 B 树与 B+树B树的介绍B树的组成B树的实现B树的介绍在讲B树之前我们先讨论一下内存与磁盘有什么区别?对于这个问题很多朋友或多或少可以说点出来可能很多朋友答的第一点就是1.内存快磁盘慢2.断电以后数据消失,磁盘持久存储

2022-02-25 21:48:17 356

原创 随处可见的红黑树

推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习随处可见的红黑树红黑树为什么常用那么红黑树怎么实现?红黑树的定义红黑树节点旋转红黑树的添加问题红黑树为什么常用1.当做查找以key-value通过key去查找value,查找性能比较快比如通过socket去查找客户端id,还有内核内存怎么使用?

2022-02-22 15:43:14 462 4

原创 IM登录服务器和消息服务器设计

推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习《C/C++Linux服务器开发/后台架构师》讲师:darren/班主任:柚子/讲师介绍 --专业来自专注和实力Darren老师曾供职于国内知名半导体公司(珠海扬智/深圳联发科),曾在某互联网公司担任音视频通话项目经理。主要从事音视频

2022-02-19 01:11:54 955

原创 IM即时通讯项目框架分析

推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习1 IM即时通讯项目框架分析和部署1. 即时通讯框架分析和部署2. 登录服务器和消息服务器设计3. 路由服务器设计4. 数据库代理服务器设计5. 文件服务器和docker部署6. 性能测试和k8s上云发布1.1 即时通讯应用场景即时通讯

2022-02-19 00:26:58 2615 1

原创 即时通讯项目(一)

推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习1. 简介即时通讯项目,基于开源项目TeamTalk二次开发。整个系统的架构设计如下:TeamTalk目前的开源版本有较多的bug,功能也不够完善,始于TeamTalk但不止于TeamTalk,将会持续迭代改进该项目,最终开发成可以商业使

2022-02-18 23:35:45 2429

原创 K8S核心组件介绍

一:pod核心原理1:pod是什么Pod 是一组容器和卷(目录和文件)的集合,同一个Pod里的容器共享同一个网络命名空间,可以使用 localhost 互相通信pod是k8s管理的最小的单位pod也是一个容器,这个容器装的是docker创建的容器容器本质是进程,K8S是操作系统,pod就是类似进程组pod有自己的ip地址,主机名,pod相当于独立主机,可以封装一个容器或者多个容器2:pod是用来干什么通常相关情况下,在服务部署得时候,使用pod来管理一组相关的服务(一个pod中要么部.

2022-01-30 11:06:11 1528

原创 DPDK 的虚拟交换机框架 OvS 的基础知识

DPDK 的虚拟交换机框架 OvS 的基础知识多队列网卡多队列网卡硬件实现内核对多队列网卡的支持多队列网卡的结构DPDK 与多队列网卡虚拟化CPU 虚拟化内存虚拟化学习产出:多队列网卡多队列网卡硬件实现有四个硬件队列(Queue0, Queue1, Queue2, Queue3),当收到报文时,通过 hash 包头的(sip, sport, dip, dport)四元组,将一条流总是收到相同队列,同时触发与该队列绑定的中断。内核对多队列网卡的支持Linux 内核中, RPS ( Rece.

2022-01-30 11:03:03 2077

原创 Docker镜像编译与Docker-Compose部署与编排

文章目录docker是什么以及为什么用dockerdocker是什么Docker的好处容器和虚拟机的区别Docker基本概念docker安装和测试ubuntu安装方法准备工作使用 apt安装卸载docker启动 Docker CE建立 docker 用户组Docker 常用命令与操作基础类日志类容器类查看容器信息容器同步命令容器操作命令查看容器的root用户密码容器于宿主拷贝文件运行一个新容器,同时为它命名、端口映射、文件夹映射一个容器连接到另一个容器导入导出容器镜像操作远程镜像本地镜像docker ru.

2022-01-28 17:29:39 631

原创 redis源码学习

文章目录redis源码学习wsl2安装vscodec/c++基本配置建议学习方法字典实现数据结构:冲突负载因子扩容写时复制缩容渐进式rehashscan(间断)expire机制惰性删除定时删除大KEY跳表实现理想跳表redis跳表数据结构结构图应用延时队列优化思路参考redis源码学习wsl2安装https://docs.microsoft.com/zh-cn/windows/wsl/install-win10vscodehttps://docs.microsoft.com/zh-cn/win

2022-01-14 16:37:02 384

原创 Redis

RedisRedis应用安装编译启动认识Redisredis存储结构redis中value编码功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入RedisRedis 是Remote Dictionary Service 的简称;

2022-01-14 15:07:25 316

原创 Kafka开发环境搭建及应用

这里写自定义目录标题kafka开发环境安装Java环境下载linux下的安装包解压安装包jdk-8u202-linux-x64.tar.gz将解压后的文件移到/usr/lib目录下配置java环境变量执行命令使修改立即生效Kafka的安装部署下载kafka安装kafka配置和启动zookeeper启动和停止kafkakafka的基本操作创建topic查看topic查看topic属性消费消息发送消息kafka-topics.sh 使用方式查看帮助--help副本数量不能大于broker的数量创建一个自定义列表

2022-01-12 22:52:06 1405

原创 设计模式类图复习

设计模式类图复习目录设计模式类图复习抽象工厂模式抽象工厂模式的结构图装饰模式装饰模式结构图组合模式组合模式的结构图适配器模式类适配器模式结构图对象适配器类图观察者模式观察者模式结构图原型模式原型模式结构图建造者模式建造者模式结构图抽象工厂模式抽象工厂模式( Abstract Factory Patter):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式的结构图装饰模式装饰模式( Decorator Pattern):动态地给一个对象增加一些额外的职责。就扩

2021-12-30 16:03:21 503

原创 队列及其企业级应用

队列及其企业级应用队列的故事导入队列的原理精讲队列的算法实现队列的企业级应用案例队列的故事导入Jack 在一个著名软件外包公司上班,公司每年要接很多的外包项目给各个开发团队开发,现在刚刚接到一个项目,要实现银行排队叫号系统, 基本需求是:取号 :银行用户进入银行大厅办理业务用户从自动排号机上取号自动取号机生成号码以及当前等待人数信息给用户叫号:当银行业务员(1 位或多位)处理完业务以后,会指示叫号系统呼叫下一位(按排队次序)正在等待的用户,用户达到窗口以后,银行业务员会将用户的号码从叫

2021-07-29 16:37:19 70

原创 KMP算法

KMP算法KMP算法KMP算法题目描述判断一个字符串是不是另一个字符串的子字符串,并返回其位置。输入输出样例输入一个母字符串和一个子字符串,输出一个整数,表示子字符串在母字符串的位置,若不存在则返回-1。Input: haystack = "hello", needle = "ll"Output: 2题解使用著名的Knuth-Morris-Pratt(KMP)算法,可以在 O(m + n) 时间利用动态规划完成匹配。// 主函数int strStr(string haystack,

2021-07-29 11:32:36 38

原创 排序算法(C/C++)

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

2021-07-26 19:21:39 48

原创 设计模式之代理模式

设计模式之代理模式代理模式定义背景代码要点本质结构图代理模式定义为其他对象提供一种代理以控制对这对象的访问。 ——《设计模式》GoF背景在有些系统中,为了某些对象的纯粹性,只进行了功能相关封装(稳定点),后期添加了其他功能需要对该对象进行额外操作(变化点),为了隔离变化点(也就是不直接在稳定点进行修改,这样会让稳定点也变得不稳定),可以抽象一层代理层;代码class ISubject {public: virtual void Handle() = 0; virtual ~

2021-06-06 14:43:26 22

原创 设计模式之适配器模式

设计模式之适配器模式适配器模式定义背景代码要点本质结构图适配器模式定义将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 ——《设计模式》GoF背景日志系统,原来是通过写磁盘的方式进行存储,后来因为查询不便,需要额外添加往数据库写日志的功能(写文件和数据库并存);代码#include <string>#include <vector>using namespace std;class LogSy

2021-06-06 14:17:30 24

提示
确定要删除当前文章?
取消 删除