自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(38)
  • 资源 (1)
  • 收藏
  • 关注

原创 远程服务器安装docker和docker-compose

最近在使用docker搭建项目,所以在搭建之前需要配置好docke环境,另外需要用docker-compose实现微服务的多个服务的自动化部署,所以也需要安装好docker-compose环境。接下来记录配置的过程,这些都是本人亲测的方法,真实有效,希望对大家也有帮助。这里只针对linux进行安装,window请自行自行百度呦~docker安装如果你使用本地的虚拟机或者使用购买的服务器,这里过程都一样,本人是在腾讯云购买的服务器,所以以服务器上安装为例子,真心安利大家有想用服务器搭建自己项目玩一玩的可以

2021-06-28 15:50:58 643

原创 JVM监控及诊断工具-命令行篇一

1.jps基本概述jps(java process status),用于查看正在运行的java虚拟机进程,会显示指定系统内所有的HotSpot虚拟机进程(查看虚拟机进程信息)。这里说明一下,对于本地虚拟机进程来说,进程的本地虚拟机ID与操作系统的进程ID是一致的且是唯一的。初步测试例如简单写一段程序:public class ScannerTest { public static void main(String[] args) { Scanner scanner = ne

2021-06-08 19:16:09 271 1

原创 你知道Integer和int的区别吗

最近小康面试,突然被面试官问道,说一下Integer和int的区别。额…可能平时就知道写一些业务代码以及看一些自己觉得比较高大上的东西,包括面试也看的一些Spring源码等,对于这种java特别基础的东西反而忽略了,导致在面试的时候突然被问到这种基础类的题目反而不知道怎么回答了。哎,还是乖乖再看看底层基础,顺带记录一下把。基本概念(重要)Integer 是 int 的包装类,int 则是 java 的一种基本数据类型;Integer 变量必须实例化后才能使用,而int变量不需要;Integer 实

2021-06-08 19:13:01 532 2

原创 LFU缓存策略算法

在之前的文章中,我们介绍了如何设计一个LRU算法–如何设计LRU Cache算法,今天我们再聊一聊另一种缓存策略LFU。1 LFU基本介绍LFU,全称是Least Frequently Used,最不经常使用策略,在一段时间内,数据被使用频次最少的,优先被淘汰。维基百科中这样介绍:最少使用(LFU)是一种用于管理计算机内存的缓存算法,主要是记录和追踪内存块的使用次数,当缓存已满并且需要更多空间时,系统将以最低内存块使用频率清除内存。采用LFU算法的最简单方法是为每个加载到缓存的块分配一个计数器,每次引用

2021-03-24 17:00:12 1281 1

原创 分步图解分析排序方法-冒泡排序

本文为排序方法分析与代码实现第二篇,主要对于比较常用的排序算法进行分析,然后利用具体代码对对应的代码进行实现,并对各方法的执行效率进行了比较。接下来主要介绍八种排序算法冒泡排序...

2021-03-22 11:45:12 890

原创 如何设计LRU Cache算法

前言相信有的伙伴在面试的过程中,或多或少的会被问到redis的内存淘汰策略,可能大部分人都知道都有哪些对应的策略,毕竟对于八股文的套路大家肯定早已铭记于心。但是当面试官问你如何实现或者让你去写一个对应策略的算法时,可能就顿时一脸蒙蔽了:不对啊,套路不是这样的啊!!如果单纯的让你直接写对应的算法还好,要是再更深入一点让你说一下你的思考过程或者说如果让你来设计你会怎么去做,这个可能就上升到了一个架构的思维(如果你打算面试架构死,不妨提前锻炼一下这样的思维),对于平时没有这方面准备的伙伴来讲,那无疑就是当头一

2021-03-05 17:09:54 471

原创 JVM专题(2)-类加载器子系统

1.内存结构概述假设我们想自己手写一个Java虚拟机的话,必须考虑以下结构:类加载器执行引擎2.类加载子系统2.1 类加载器子系统的作用类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识。ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定。加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量

2021-03-03 19:23:22 99

原创 ZooKeeper概述与原理

1.ZooKeeper简介ZooKeeper 是一个开源的分布式协调框架,它的定位是为分布式应用提供一致性服务,是整个大数据体系的管理员,它会封装好复杂易出错的关键服务,将高效、稳定、易用的服务提供给用户使用,为分布式应用提供协调服务的Apache项目,通俗点可以认为 ZooKeeper = 文件系统 + 监听通知机制。1.1 文件系统Zookeeper维护一个类似文件系统的树状数据结构,这种特性使得 Zookeeper 不能用于存放大量的数据,每个节点的存放数据上限为1M。每个子目录项如 Name

2021-02-23 10:55:48 321 3

原创 Netty专题-(3)NIO网络编程

之前在上一章中介绍了NIO的三大核心类Selector 、 Channel 和 Buffer,这一章我们将利用这些核心进行编程实现相关的一些功能。在正式进入编程之前我们还需要介绍一些概念。1 NIO网络编程关系图(1)当客户端连接时,会通过 ServerSocketChannel 得到 SocketChannel(2)Selector 进行监听 select 方法, 返回有事件发生的通道的个数(3)将 socketChannel 注册到 Selector 上, register(Selector

2021-01-28 17:39:55 251 2

原创 Netty专题-(2)NIO三大核心

在之前的文章中提到了NIO三大核心Selector 、 Channel 和 Buffer,所以在这一章重点会是介绍这三个核心。1 缓冲区(Buffer)1.1 基本介绍(1)缓冲区本质上是一个可以读写数据的内存块,可以理解成是一个容器对象(含数组);(2)该对象提供了一组方法,可以更轻松地使用内存块;(3)缓冲区对象内置了一些机制,能够跟踪和记录缓冲区的状态变化情况;(4)Channel 提供从文件、网络读取数据的渠道,但是读取或写入的数据都必须经由 Buffer,如图:1.2 Buffer

2021-01-28 17:39:27 313 1

原创 Netty专题-(1)初识Netty

写在前面最近对Netty这一块进行了一下学习,因为之前不是很了解。这里在学习的过程中也跟着做了一些笔记,特意整理在这里,希望对想学习的小伙伴有一定的帮助。这里是从最开始的基础进行学习,所以对于想入门学习Netty的伙伴算是一个不错的参考,因为笔者自己也差不多是从零基础开始。当然,学习这些要求已经掌握了 Java 编程等相关的技术栈,比如Java OOP 编程、Java 多线程编程、Java IO 编程 、Java 网 络编程、常用的 Java 设计模式(比如 观察者模式 ,命令模式,职责链模式 )、常用的

2021-01-28 17:38:41 232

原创 MYSQL专题-由简到繁理解索引结构

大家可能都听过数据库索引,当然作为开发者来说其实大部分时间也用过索引。但是可能有的人知道索引是干什么的,但是对于索引的结构却不是很了解。所以这篇博客我会谈谈对索引结构的一些知识以及分享如何从零开始一层一层向上最终理解索引结构。我们从一个简单的表开始,建表语句如下:CREATE TABLE `user` ( `id` INT NOT NULL, `age` INT NULL, `height` INT NULL, `weight` INT NULL, `name` VARCHAR(45

2021-01-27 18:49:05 120

原创 Redis专题-缓存穿透、缓存雪崩、缓存击穿

缓存穿透缓存穿透概念缓存穿透是指查询一个一定不存在的数据,在数据库没有,自然在缓存中也不会有。导致用户查询的时候,在缓存中找不到对应key的value,每次都要去数据库再查询一遍,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。缓存穿透解决方案有很多种方法可以有效地解决缓存穿透问题。缓存雪崩缓存击穿...

2020-12-23 19:11:01 121

原创 谈谈InnoDB下的记录锁,间隙锁,next-key锁

innodb下的记录锁(也叫行锁),间隙锁,next-key锁统统属于排他锁。行锁,即记录锁,其实很好理解,对表中的记录加锁,叫做记录锁,简称行锁。就不多做介绍,主要介绍间隙锁,next-key锁。间隙锁间隙锁,顾名思义就是存在间隙,在间隙之间上锁保证在间隙间不可以进行操作。举一个生活中比较好理解得例子,A,B,C依次排成一排,为了让新来的D不能插在B的旁边,只要将B和A之间的空隙封锁,将B和C之间的空隙封锁,那么D就不能插在B的旁边了。他们之间的空隙也就是间隙,而封锁他们之间距离的锁,叫做间隙锁。这里

2020-12-23 19:10:37 667

原创 教你从0到1搭建秒杀系统-订单异步处理

前面几篇我们从限流角度,缓存角度来优化了用户下单的速度,减少了服务器和数据库的压力。这些处理对于一个秒杀系统都是非常重要的,并且效果立竿见影,那还有什么操作也能有立竿见影的效果呢?答案是下单的异步处理。前期概述在秒杀系统用户进行抢购的过程中,由于在同一时间会有大量请求涌入服务器,如果每个请求都立即访问数据库进行扣减库存和写入订单的操作,对数据库的压力是巨大的。我们可以将每一条秒杀的请求存入消息队列(例如RabbitMQ)中,放入消息队列后,给用户返回类似“抢购请求发送成功”的结果。而在消息队列中,我们将

2020-12-18 18:57:10 792 1

原创 教你从0到1搭建秒杀系统-Canal快速入门(番外篇)

Canal用途很广,并且上手非常简单,小伙伴们在平时完成公司的需求时,很有可能会用到。本篇介绍一下数据库中间件Canal的使用。很多时候为了缩短调用延时,我们会对部分接口数据加入了缓存。一旦这些数据在数据库中进行了更新操作,缓存就成了旧数据,必须及时删除。删除缓存的代码「理所当然可以写在更新数据的业务代码里」,但有时候写操作是在别的项目代码里,你可能无权修改,亦或者别人不愿你在他代码里写这种业务之外的代码。(毕竟多人协作中间会产生各种配合问题)。又或者就是单纯的删除缓存的操作失败了,缓存依然是旧数据。这个

2020-12-18 18:56:49 464 3

原创 教你从0到1搭建秒杀系统-缓存与数据库双写一致

本文是秒杀系统的第四篇,我们来讨论秒杀系统中缓存热点数据的问题,进一步延伸到数据库和缓存的双写一致性问题。在秒杀实际的业务中,一定有很多需要做缓存的场景,比如售卖的商品,包括名称,详情等。访问量很大的数据,可以算是“热点”数据了,尤其是一些读取量远大于写入量的数据,更应该被缓存,而不应该让请求打到数据库上。当然并不是所有的数据都需要进行缓存,那么一般哪些数据适合缓存呢?缓存量大但又不常变化的数据,比如详情,评论等适合缓存。对于那些经常变化的数据,其实并不适合缓存,一方面会增加系统的复杂性(缓存的更新,缓

2020-12-18 18:56:26 723 1

原创 教你从0到1搭建秒杀系统-抢购接口隐藏与单用户限制频率

在前两篇文章的介绍下,我们完成了防止超卖商品和抢购接口的限流,已经能够防止大流量把我们的服务器直接搞炸,这篇文章中,我们要开始关心一些细节问题。对于稍微懂点电脑的,点击F12打开浏览器的控制台,就能在点击抢购按钮后,获取我们抢购接口的链接(手机APP等其他客户端可以抓包来拿到)。一旦拿到了抢购的链接,只要稍微写点爬虫代码,模拟一个抢购请求,就可以不通过点击下单按钮,直接在代码中请求我们的接口,完成下单。他们只需要在抢购时刻的0毫秒,开始不间断发起大量请求,绝对比大家在APP上点抢购按钮要快,毕竟人的速度有限

2020-12-18 18:56:00 2007 6

原创 教你从0到1搭建秒杀系统-限流

本文是秒杀系统的第二篇,主要讲解接口限流措施。接口限流其实定义也非常广,接口限流本身也是系统安全防护的一种措施,在面临高并发的请购请求时,我们如果不对接口进行限流,可能会对后台系统造成极大的压力,尤其是对于下单的接口,过多的请求打到数据库会对系统的稳定性造成影响。所以对于秒杀系统:会尽量选择独立于公司其他后端系统之外进行单独部署,以免秒杀业务崩溃影响到其他系统除了独立部署秒杀业务之外,我们能够做的就是尽量让后台系统稳定优雅的处理大量请求。列举几种容易理解的接口限流的措施:令牌桶限流单用户访问

2020-12-18 18:55:31 470

原创 教你从0到1搭建秒杀系统-防超卖

各位读者好,最近笔者学了很多东西,其实都想跟大家进行分享,奈何需要将所学习的只是整体出来需要耗费大量的时间,包括总结,或各种图形以及写代码示例,所以可能更新的速度会比较慢。但大家放心,只要有时间我就会将自己学习的内容总结出来供大家一起学习讨论,有总结的不对的地方大家随时都可以批评指正,毕竟我说的也不全都是对的,希望大家耐心等待。如果你喜欢读者的内容,可以点个关注时刻了解我的动态,同时也欢迎各位小伙伴转发和分享。最近想就秒杀系统做一个梳理和总结,从0到1搭建一个简易的秒杀系统,说是在的,也就经常会听到过秒杀

2020-12-18 18:54:57 626

原创 MYSQL专题-使用Binlog日志恢复MySQL数据

大家有没有碰到过由于误操作把测试数据库的一张表给删除了,导致测试的数据都被删除了,然后手足无措,测试把你一定数落,顿时感觉自己要死了?今天就教你即使误删了也可以将删除的数据恢复,以后误删再也不用惊吓了。当然,实际操作中最好还是认真对待,小心操作。还有就是在大公司内,数据也不是你想删就能删掉的,有无数权限/备份阻拦着你,所以通常情况下你都不会有机会,但还是备着以防万一。Binlog简述MySql数据恢复主要依赖的是Binlog日志,在之前的文章中也有讲过,大家有兴趣可以去看看,这里简单介绍一下:bin

2020-12-18 13:34:50 353

原创 教你用BitMap排序、查找和存储大量数据

Bit-map的基本思想就是用一个bit位来标记某个元素对应的Value,而Key即是该元素。由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省。假设现在有这样一个需求:在20亿个随机整数中找出某个数是否存在其中,并假设32位操作系统,4G内存,你会怎么做?我们知道在java中,一个int占4字节,1字节=8位(1 byte = 8 bit),如果每个数字用int存储,那就是20亿个int,因而占用的空间约为:2000000000*4/1024/1024/1024≈7.45 G显然消

2020-12-14 16:43:28 4330 2

原创 带你玩转关键字Synchronized

synchronized关键字是Java并发编程中线程同步的常用手段之一。

2020-12-11 16:30:16 129

原创 Java的TheadLocal使用

很多时候,当我们需要存储线程私有变量或者要实现线程安全的变量时或者想减少线程资源竞争的时候,可以使用ThreadLocal来为每个线程存储对应的私有变量。但是,如果你使用不当,会有可能造成严重的问题,最容易出现的就是内存泄漏。今天以一个案例分析出发,给大家介绍一下TheadLocal的原理及使用TheadLocal时注意的事项。案例介绍出于公司代码的隐私,这里将相关的地方简单写成一个demo作为实际场景的还原。相关代码如下:public class ThreadPoolDemo { priva

2020-12-11 11:46:59 456

原创 MYSQL专题-MVCC多版本并发控制

MVCC,全称Multi-Version Concurrency Control,即多版本并发控制。MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。MVCC在MySQL InnoDB中的实现主要是为了提高数据库并发性能,用更好的方式去处理读-写冲突,做到即使有读写冲突时,也能做到不加锁,非阻塞并发读。基础概述数据库并发场景大致分为三种:读-读:不存在任何问题,也不需要并发控制读-写:有线程安全问题,可能会造成事务隔离性问题,可能遇到脏读,幻读

2020-12-09 15:21:27 281

原创 MYSQL专题-MySQL事务实现原理

用过事务的伙伴大概都知道它的相关特性主要有四个:原子性(Atomicity),一致性(Consistency),隔离型(Isolation)以及持久性(Durability)。今天想跟大家一起研究下事务内部到底是怎么实现的。首先大家想一想,为什么需要事务?其实使用事务一方面为了保证数据的可靠性,另一方面是对于并发处理提供了很好的解决方案:可靠性:数据库要保证当insert或update操作时抛异常或者数据库crash的时候需要保障数据的操作前后的一致,想要做到这个,我需要知道我修改之前和修改之后的状态,

2020-12-08 16:16:54 204

原创 MYSQL专题-MySQL三大日志binlog、redo log和undo log

日志是mysql数据库的重要组成部分,记录着数据库运行期间各种状态信息。mysql日志主要包括重做日志(redo log)、回滚日志(undo log)、二进制日志(bin log)、错误日志(error log)、慢查询日志(slow query log)、一般查询日志(general log),中继日志(relay log)。作为开发,我们重点需要关注的是二进制日志(binlog)和事务日志(包括redo log和undo log),因为他们都与事务操作息息相关。今天跟大家介绍这三种日志。二进制日志(

2020-12-08 16:04:29 233

原创 MYSQL专题-绝对实用的MYSQL优化总结

优化

2020-12-07 10:45:16 179

原创 记一次fastjson转jackson的生产事故

之前暴露出fastjson存在漏洞,虽然后期fastjson团队对于相关漏洞有修复,但是为了确保服务和数据的安全性,公司还是决定所有项目弃用fastjson,改用jackson。因为之前项目很多地方都运用了fastjson,改起来算是一个大工程了,有些地方没注意可能就会导致出错,这不,在换了以后的确遇到了问题。客户需要下单,棘突逻辑我就不讲了,里面有一个json字符串转对象的操作,然后获取对象中的data属性用于后续操作。用过fastjson的伙伴都知道可以使用JSON.parseObject(Strin

2020-12-03 13:55:27 703

原创 常用 IO 模型图解介绍

很多时候对于不同的IO模型的概念和原理我们可能不是很清楚,有时候可能也会在不同的IO间迷糊,笔者也是有同样的问题。所以经过系统的学习以后将我们常见的五种IO模型在这里做一下总结,以供大家参考和学习。1.基本概念五种IO模型包括:阻塞IO、非阻塞IO、IO多路复用、信号驱动IO、异步IO。为了对后面的内容的一些西域不混淆,首先给大家介绍一下系统调用常用的几个函数和基本概念。1.1 系统调用函数以下几个系统函数参考了一些书籍和文章,如果有不正确的地方还请大家指出。函数名称函数作用r

2020-12-02 19:44:51 620

原创 Redis专题-集群模式

在redis持久化方式一文中,我们已经提到为了防止数据丢失,redis提供了RDB和AOF两种方式持久化数据,将内存的数据持久化到磁盘上。但是当出现服务器出现故障,比如服务磁盘坏掉导致数据不可恢复时。那又该怎么办呢?这时候就需要进行数据备份,将数据存储在多台服务器上。我们在面试的时候也经常会遇到redis的相关面试题,对于redis有几种集群模式这个问题在面试中出现的频率还是很高的,或者会问你在你的项目中使用redis的部署方式是什么,这些都是在考察你对redis的集群模式的了解。可能有的伙伴还不是很清楚,

2020-12-02 11:37:42 144

原创 Redis专题-持久化方式

很多时候我们为了缓解数据库的压力,都会使用缓存来作为数据的存储方式,最常用的就是使用redis。将热点数据缓存在redis中可以有效缓解数据库的压力。但是如果redis挂了那些重要的数据怎么办?redis为我们持久化的机制,它可以保证数据不会丢失。接下来我们就来聊聊redis的这一特性。...

2020-11-30 19:12:22 117

原创 Redis专题-底层数据结构与使用场景

Redis默认支持16个数据库,可以通过调整Redis的配置文件redis/redis.conf中的databases来修改这一个值,设置完毕后重启Redis便完成配置:# 切库redis> SELECT 1 # 默认0号db,切换为1号dbOKredis [1] > GET username # 从1号库中获取 username (nil)需要注意的是,Redis集群下只有db0,不支持多db。...

2020-11-27 16:13:42 278

原创 SpringBoot-切面AOP实现统一逻辑处理

最近在做接口的统一逻辑处理问题的时候学习了一下AOP,觉得很有帮助,故在此整理总结一下,希望对大家有所帮助。AOP概述AOP(Aspect Oriented Programming),面向切面思想,与IOC(控制反转)、DI(依赖注入)组成Spring的三大核心思想。既然是核心,那肯定是重要的。那么他为什么重要,以及在实际应用场景中我们可以用它来做什么呢?不知道大家在开发过程中有没有遇到过这样的系统性需求:统计,权限检验,日志记录等等。可能很多人想到的就是在每一个调用方法的业务逻辑中都写一遍检验或者

2020-11-25 15:14:30 1258

原创 解决SQL注入与XSS攻击

最近接手之前同事的几个项目,公司利用扫描工具进行全项目扫描,发现了部分项目代码存在安全漏洞,所以需要进行项目代码修复以避免有人恶意攻击。这个任务自然而然的就落到我手上。在这里记录一下操作的过程。扫描出来的漏洞主要有两种,一种是SQL注入,一种是XSS攻击。以下就是我的一个解决过程。SQL注入什么是SQL注入,百度百科这样定义的:SQL注入是将Web页面的原URL、表单域或数据包输入的参数,修改拼接成SQL语句,传递给Web服务器,进而传给数据库服务器以执行数据库命令。如Web应用程序的开发人员对用户所

2020-11-23 19:05:51 1258 1

原创 算法分析股票类型的相关题型

最近在看算法时看到股票类的题目觉得很有意思,在这里对于比较好的方法做一下总结,尽量让大家看一遍就可以记住这个问题该怎么解决。其实学习算法是一个痛苦的过程,但不管怎样最终提升的是自己的能力,所以希望读到文章的小伙伴如果也是同样对算法感兴趣或者没有兴趣但想学习算法的同学,努力坚持,在某一天你就会突然发现,我怎么这么牛哈哈!不扯闲话了。最近看到有股票相关的算法题目,于是把相关类型的题目做了总结记录在这里,大家在看到一个问题的同时也可以看一下其他的类型的题目。大家可以先不要看后面的解析自己做一下,我在这里的解法也

2020-11-12 15:46:17 878

原创 修路问题算法的总结

十一期间看到了以下几个类似的问题,最开始也是有点混淆的状态,这里做一下简单的学习记录,希望可以为有同样问题的小伙伴提供帮助,篇幅比较长,建议收藏后再阅读。问题描述如下(这里以简单得连接图表示各个连接信息):1.有7个村庄(A, B, C, D, E, F, G) ,现在需要修路把7个村庄连通,各个村庄的距离用边线表示(权) ,比如 A – B 距离 5公里,问:如何修路保证各个村庄都能连通,并且总的修建公路总里程最短?2.与1的问题是一样的,某城市新增7个站点(A, B, C, D, E, F, G

2020-10-10 11:19:07 3040

原创 排序方法分析与代码实现

排序也称排序算法(Sort Algorithm),排序是将一组数据,依指定的顺序进行排列的过程。鉴于经常面试中需要考察本方面的内容,也为了后期及时复习相关知识,故在此将算法相关知识系列进行总结记录,以便学习使用,希望对看到这些文章的你有所帮助。本系列将从以下两个方面对排序相关知识进行总结整理:排序的相关概念理解排序各类算法的分析和代码实现所以会分为两篇文章进行整理。这里是第一篇,也就是第一部分排序的相关概念理解,废话不多说,咱们直接进入正题。排序的分类内部排序:指将需要处理的所有数据都加载到

2020-09-28 11:14:12 148

软件工具jclasslib.zip

软件工具jclasslib,用于查看编译后的文件,里面包括32位和64位,大家依据自己系统所需版本进行下载安装即可

2021-02-24

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

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