- 博客(58)
- 收藏
- 关注
原创 如何快速安装zookeeper
单机版第一步cd /opt/moduletar -zxvf /opt/module/apache-zookeeper-3.5.7-bin.tar.gz -C /opt/module/mv apache-zookeeper-3.5.7-bin zookeeper-3.5.7mv /opt/module/zookeeper-3.5.7/conf/zoo_sample.cfg /opt/module/zookeeper-3.5.7/conf/zoo.cfgmkdir -p /opt/module/z
2021-12-26 15:06:49
200
原创 如何在Linux上快速安装Java
步骤一:cd /usr/local上传jdk包tar -zxvf /usr/local/jdk-8u291-linux-x64.tar.gzmv jdk1.8.0_291 javavi /etc/profile步骤二:在profile中添加export JAVA_HOME=/usr/local/javaexport PATH=$PATH:$JAVA_HOME/binexport CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools
2021-07-27 19:23:45
174
原创 汪文君高并发编程总结-第一阶段
汪文君多线程课程总结-第一阶段例子1-线程的创建public class TryConcurrency { public static void main(String[] args) { Thread t = new Thread("READ-Thread") { @Override public void run() { println(Thread.currentThread().getNam
2021-01-18 17:04:27
564
1
原创 Redis数据类型+分布式锁+缓存过期淘汰策略
官网命令地址http://www.redis.cn/commands.html8种数据类型string类型应用场景商品编号、订单编号采用INCR命令生成是否喜欢的文章hash应用场景购物车早期,当前小中厂可用list应用场景微信文章订阅公众号setzset应用场景根据商品销售对商品进行排序显示思路:定义商品销售排行榜(sorted set集合),key为goods:sellsort,分数为商品销售数量。需求代码商品
2020-11-25 21:45:15
382
原创 Spring的循环依赖
什么是循环依赖?循环依赖官网说明If you use predominantly constructor injection, it is possible to create an unresolvable circular dependency scenario.For example: Class A requires an instance of class B through constructor injection, and class B requires an instan.
2020-11-21 22:08:24
121
原创 JUC_可重入锁+LockSpport+AQS源码
可重入锁①. 指的是同一线程外层函数获得锁后,再进入该线程的内层方法会自动获取锁 (前提,锁对象是同一个对象)类似于家里面的大门,进入之后可以进入厕所、厨房等②. Java中ReentranLock(显示锁)和synchronized(隐式锁)都是可重入锁,可重入锁的一个优点是可在一定程度避免死锁③. 隐式锁:(即synchronized关键字使用的锁)默认是可重入锁(同步块、同步方法)原理如下:掌握每个锁对象拥有一个锁计数器和一个指向持有该锁的线程的指针当执行monitorenter时,如
2020-11-21 14:39:21
343
原创 Java23种设计模式
设计模式一、单例设计模式单例设计模式介绍 所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例, 并且该类只提供一个取得其对象实例的方法(静态方法)。 比如 Hibernate 的 SessionFactory,它充当数据存储源的代理,并负责创建 Session 对象。SessionFactory 并不是轻量级的,一般情况下,一个项目通常只需要一个 SessionFactory 就够,这是就会使用到单例模式。单例设计模式8种方式单例模式有八种方式:
2020-11-20 20:59:41
486
1
原创 LocalDate序列化和反序列化
LocalDate序列化和反序列化import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.core.convert.converter.Converter;import java.time.LocalDate;import java.time.format.DateTimeFor
2020-11-18 10:03:05
1102
原创 MySQL是怎么保证高可用的
在上一篇文章中,我和你介绍了binlog的基本内容,在一个主备关系中,每个备库接收主库的binlog并执行。正常情况下,只要主库执行更新生成的所有binlog,都可以传到备库并被正确地执行,备库就能达到跟主库一致的状态,这就是最终一致性。但是,MySQL要提供高可用能力,只有最终一致性是不够的。为什么这么说呢?今天我就着重和你分析一下。这里,我再放一次上一篇文章中讲到的双M结构的主备切换流程图。图 1 MySQL主备切换流程–双M结构主备延迟主备切换可能是一个主动运维动作,比如软件升级、主库所
2020-09-04 17:19:24
138
原创 MySQL是怎么保证主备一致的
在前面的文章中,我不止一次地和你提到了binlog,大家知道binlog可以用来归档,也可以用来做主备同步,但它的内容是什么样的呢?为什么备库执行了binlog就可以跟主库保持一致了呢?今天我就正式地和你介绍一下它。毫不夸张地说,MySQL能够成为现下最流行的开源数据库,binlog功不可没。在最开始,MySQL是以容易学习和方便的高可用架构,被开发人员青睐的。而它的几乎所有的高可用架构,都直接依赖于binlog。虽然这些高可用架构已经呈现出越来越复杂的趋势,但都是从最基本的一主一备演化过来的。今天这
2020-09-04 17:17:19
223
原创 bin log和redo log是如何工作的?
binlog的写入机制其实,binlog的写入逻辑比较简单:事务执行过程中,先把日志写到binlog cache,事务提交的时候,再把binlog cache写到binlog文件中。一个事务的binlog是不能被拆开的,因此不论这个事务多大,也要确保一次性写入。这就涉及到了binlog cache的保存问题。系统给binlog cache分配了一片内存,每个线程一个,参数 binlog_cache_size用于控制单个线程内binlog cache所占内存的大小。如果超过了这个参数规定的大小,就要暂存
2020-09-04 16:52:36
182
原创 Spring学习笔记
Spring组件注册/** * 给容器中中注册组件 * 1、包扫描+组件标注注解(@Component、@Service、@Controller、@Repository,主要是自己写的类 * 2、@Bean[导入的第三方包里面的组件] * 3、@Import[快速给容器中导入一个组件] * 1、Import(类名),容器中就会自动注册这个组件,id默认是组件的全名 * 2、ImportSelector:返回需要导入的组件的全类名的数组 *
2020-07-12 21:29:55
190
原创 Spring Boot学习笔记
**一、**Spring Boot 入门1、Spring Boot 简介简化Spring应用开发的一个框架;整个Spring技术栈的一个大整合;J2EE开发的一站式解决方案;2、微服务2014,martin fowler微服务:架构风格(服务微化)一个应用应该是一组小型服务;可以通过HTTP的方式进行互通;单体应用:ALL IN ONE微服务:每一个功能元素最终都是一个可独立替换和独立升级的软件单元;详细参照微服务文档3、环境准备http://www.gulixueyuan.c
2020-07-10 16:34:55
368
原创 2-Java语言特性与设计模式
设计模式知识点前面说了操作系统和网络知识,接下来是设计模式的考察点,一般有两个:常用设计模式的实现;设计模式的使用场景。设计模式分为 3 大类型共 23 种:创建型:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。结构型:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。行为型:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。最常见的设计模式有:单例模式、工厂模式、代理
2020-06-27 16:43:03
122
原创 1-操作系统与计算机网络
本课时主要介绍面试中经常考察的计算机基础知识以及 Java 语言特性。其中,计算机的基础知识是工程师基本能力的体现,也是面试前必须要牢牢掌握的部分。本课时结构如下:面试中经常考察的知识点汇总,方便系统化复习;对 TCP 协议、设计模式、Java 基础知识进行详细讲解;从面试官角度,总结上述部分内容在面试时的考察点;提供一些面试真题及重点题目解题思路。操作系统知识点先看操作系统相关知识的汇总,如下图所示。操作系统知识对于服务问题的排查定位十分重要,在面试时一般以了解和应用考察为主,面试题目占
2020-06-27 16:03:00
156
原创 30-你知道哪些算法?讲一下它的内部实现过程?
上一课时我们介绍了数据结构的知识,数据结构属于计算机存储的基础,有了它才能更好地将数据进行存储。而算法可以这样理解:它是为数据结构服务的,使用合适的算法可以更快地操作和查询这些数据。算法的内容有很多,随随便便一本算法书有个 700 页到 1500 页也是很平常的事,因此我们在这里不能把所有的算法问题全部讲到,即使专门再开设一个算法专栏,也只能挑重点的讲。那么我们好钢就要用在刀刃上,本课时会把面试中经常出现的和平常工作中使用频率最高的算法,拿出来给大家分享。我们本课时的面试题是,你知道哪些算法?讲一下它的
2020-06-23 16:20:51
315
原创 29-红黑树和平衡二叉树有什么区别?
数据结构属于理解一些源码和技术所必备的知识,比如要读懂 Java 语言中 TreeMap 和 TreeSet 的源码就要懂红黑树的数据结构,不然是无法理解源码中关于红黑树数据的操作代码的,比如左旋、右旋、添加和删除操作等。因此本课时我们就来学习一下数据结构的基础知识,方便看懂源码或者是防止面试中被问到。我们本课时的面试题是,红黑树和二叉树有什么区别?典型回答要回答这个问题之前,我们先要弄清什么是二叉树?什么是红黑树?二叉树(Binary Tree)是指每个节点最多只有两个分支的树结构,即不存在分支大
2020-06-23 16:10:48
924
原创 28-你知道哪些设计模式?分别对应的应用场景有哪些?
上一课时我们讲了单例模式的 8 种实现方式以及它的优缺点,可见设计模式的内容是非常丰富且非常有趣。我们在一些优秀的框架中都能找到设计模式的具体使用,比如前面 MyBatis 中(第 13 课时)讲的那些设计模式以及具体的使用场景,但由于设计模式的内容比较多,有些常用的设计模式在 MyBatis 课时中并没有讲到。因此本课时我们就以全局的视角,来重点学习一下这些常用设计模式。我们本课时的面试题是,你知道哪些设计模式?它的使用场景有哪些?它们有哪些优缺点?典型回答设计模式从大的维度来说,可以分为三大类:创
2020-06-23 16:02:22
462
原创 27-单例的实现方式有几种?它们有什么优缺点?
单例模式是 Java 中最简单的设计模式之一,它是指一个类在运行期间始终只有一个实例,我们就把它称之为单例模式。它不但被应用在实际的工作中,而且还是面试中最常考的题目之一。通过单例模式我们可以知道此人的编程风格,以及对于基础知识的掌握是否牢固。我们本课时的面试题是,单例的实现方式有几种?它们有什么优缺点?典型回答单例的实现分为饿汉模式和懒汉模式。顾名思义,饿汉模式就好比他是一个饿汉,而且有一定的危机意识,他会提前把食物囤积好,以备饿了之后直接能吃到食物。对应到程序中指的是,在类加载时就会进行单例的初始
2020-06-23 15:43:04
253
原创 26-生产环境如何排除和优化 JVM?
通过前面几个课时的学习,相信你对 JVM 的理论及实践等相关知识有了一个大体的印象。而本课时将重点讲解 JVM 的排查与优化,这样就会对 JVM 的知识点有一个完整的认识,从而可以更好地应用于实际工作或者面试了。我们本课时的面试题是,生产环境如何排查问题?典型回答如果是在生产环境中直接排查 JVM 的话,最简单的做法就是使用 JDK 自带的 6 个非常实用的命令行工具来排查。它们分别是:jps、jstat、jinfo、jmap、jhat 和 jstack,它们都位于 JDK 的 bin 目录下,可以使
2020-06-23 15:38:00
336
原创 25-你用过哪些垃圾回收器?它们有什么区别?
上一课时我们讲了垃圾回收的理论知识,而本课时将介绍这些理论知识的具体实践。垃圾回收器也叫垃圾收集器,不同的厂商对垃圾收集器的实现也是不同的,这里主要介绍目前使用最广泛的 OracleJDK 中自带的 HotSpot 虚拟机中的几个垃圾收集器。我们本课时的面试题是,你用过哪些垃圾回收器?它们有什么区别?典型回答《Java 虚拟机规范》并没有对垃圾收集器的具体实现做任何的规定,因此每家垃圾收集器的实现方式都不同,但比较常用的垃圾回收器是 OracleJDK 中自带的 HotSpot 虚拟机。HotSpot
2020-06-23 15:19:52
371
原创 24-垃圾回收算法有哪些?
说到 Java 虚拟机不得不提的一个词就是**“垃圾回收”(GC,Garbage Collection)**,而垃圾回收的执行速度则影响着整个程序的执行效率,所以我们需要知道更多关于垃圾回收的具体执行细节,以便为我们选择合适的垃圾回收器提供理论支持。我们本课时的面试题是,如何判断一个对象是否“死亡”?垃圾回收的算法有哪些?典型回答垃圾回收器首先要做的就是,判断一个对象是存活状态还是死亡状态,死亡的对象将会被标识为垃圾数据并等待收集器进行清除。判断一个对象是否为死亡状态的常用算法有两个:引用计数器算法
2020-06-23 15:19:09
473
原创 23-说一下 JVM 的内存布局和运行原理?
JVM(Java Virtual Machine,Java 虚拟机)顾名思义就是用来执行 Java 程序的“虚拟主机”,实际的工作是将编译的 class 代码(字节码)翻译成底层操作系统可以运行的机器码并且进行调用执行,这也是 Java 程序能够“一次编写,到处运行”的原因(因为它会根据特定的操作系统生成对应的操作指令)。JVM 的功能很强大,像 Java 对象的创建、使用和销毁,还有垃圾回收以及某些高级的性能优化,例如,热点代码检测等功能都是在 JVM 中进行的。因为 JVM 是 Java 程序能够运行的
2020-06-23 15:18:36
217
原创 22-Redis 是如何实现高可用的?
高可用是通过设计,减少系统不能提供服务的时间,是分布式系统的基础也是保障系统可靠性的重要手段。而 Redis 作为一款普及率最高的内存型中间件,它的高可用技术也非常的成熟。我们本课时的面试题是,Redis 是如何保证系统高可用的?它的实现方式有哪些?典型回答Redis 高可用的手段主要有以下四种:数据持久化主从数据同步(主从复制)Redis 哨兵模式(Sentinel)Redis 集群(Cluster)其中数据持久化保证了系统在发生宕机或者重启之后数据不会丢失,增加了系统的可靠性和减少了
2020-06-22 20:43:06
259
原创 21-Redis 中如何实现的消息队列?实现的方式有几种?
细心的你可能发现了,本系列课程中竟然出现了三个课时都是在说消息队列,第 10 课时讲了程序级别的消息队列以及延迟消息队列的实现,而第 15 课时讲了常见的消息队列中间件 RabbitMQ、Kafka 等,由此可见消息队列在整个 Java 技术体系中的重要程度。本课时我们将重点来看一下 Redis 是如何实现消息队列的。我们本课时的面试题是,在 Redis 中实现消息队列的方式有几种?典型回答早在 Redis 2.0 版本之前使用 Redis 实现消息队列的方式有两种:使用 List 类型实现使用
2020-06-22 20:36:42
1080
原创 20-Redis 怎样实现的分布式锁?
“锁”是我们实际工作和面试中无法避开的话题之一,正确使用锁可以保证高并发环境下程序的正确执行,也就是说只有使用锁才能保证多人同时访问时程序不会出现问题。我们本课时的面试题是,什么是分布式锁?如何实现分布式锁?典型回答第 06 课时讲了单机锁的一些知识,包括悲观锁、乐观锁、可重入锁、共享锁和独占锁等内容,但它们都属于单机锁也就是程序级别的锁,如果在分布式环境下使用就会出现锁不生效的问题,因此我们需要使用分布式锁来解决这个问题。分布式锁是控制分布式系统之间同步访问共享资源的一种方式。是为了解决分布式系统
2020-06-22 19:16:01
126
原创 19-Redis 的过期策略和内存淘汰机制有什么区别?
Redis 和 MySQL 是面试绕不过的两座大山,他们一个是关系型数据库的代表(MySQL),一个是键值数据库以及缓存中间件的一哥。尤其 Redis 几乎是所有互联网公司都在用的技术,比如国内的 BATJ、新浪、360、小米等公司;国外的微软、Twitter、Stack Overflow、GitHub、暴雪等公司。我从业了十几年,就职过 4、5 家公司,有的公司用 MySQL、有的用 SQL Server、甚至还有的用 Oracle 和 DB2,但缓存无一例外使用的都是 Redis,从某种程度上来讲 Re
2020-06-22 19:07:54
1092
原创 18-关系型数据和文档型数据库有什么区别?
关系数据库(Relational Database)是建立在关系模型基础上的数据库,借助于几何代数等数学概念和方法来处理数据库中的数据。所谓关系模型是一对一、一对多或者多对多等关系,常见的关系型数据库有 Oracle、SQL Server、DB2、MySQL 等。而文档型数据库是一种非关系型数据库,非关系型数据库(Not Only SQL,NoSQL)正好与关系型数据库相反,它不是建立在“关系模型”上的数据库。文档型数据库的典型代表是 MongoDB。我们本课时的面试题是,关系型数据库和文档型数据库有什
2020-06-22 19:00:05
3275
原创 17-MySQL 的优化方案有哪些?
性能优化(Optimize)指的是在保证系统正确性的前提下,能够更快速响应请求的一种手段。而且有些性能问题,比如慢查询等,如果积累到一定的程度或者是遇到急速上升的并发请求之后,会导致严重的后果,轻则造成服务繁忙,重则导致应用不可用。它对我们来说就像一颗即将被引爆的定时炸弹一样,时刻威胁着我们。因此在上线项目之前需要严格的把关,以确保 MySQL 能够以最优的状态进行运行。同时,在实际工作中还有面试中关于 MySQL 优化的知识点,都是面试官考察的重点内容。我们本课时的面试题是,MySQL 的优化方案有哪些
2020-06-22 18:52:53
666
原创 16-MySQL 的运行机制是什么?它有哪些引擎?
数据库是 Java 程序员面试必问的知识点之一,它和 Java 的核心面试点共同组成了一个完整的技术面试。而数据库一般泛指的就是 MySQL,因为 MySQL 几乎占据了数据库的半壁江山,即使有些公司没有使用 MySQL 数据库,如果你对 MySQL 足够精通的话,也是会被他们录取的。因为数据库的核心与原理基本是相通的,所以有了 MySQL 的基础之后,再去熟悉其他数据库也是非常快的,那么接下来的几个课时就让我们好好的学习一下 MySQL。我们本课时的面试题是,MySQL 是如何运行的?说一下它有哪些引擎
2020-06-22 10:16:49
159
原创 15-MQ 有什么作用?你都用过哪些 MQ 中间件?
在第 10 课时中讲过“手写消息队列”,当时粗略的讲了 Java API 中使用 Queue 实现自定义消息队列,以及使用 Delayed 实现延迟队列的示例;同时还讲了 RabbitMQ 中的一些基础概念。本课时我们将会更加深入的讲解 MQ(Message Queue,消息队列)中间件,以及这些热门中间件的具体使用。我们本课时的面试题是,MQ 常见的使用场景有哪些?你都用过哪些 MQ 中间件?典型回答在介绍 MQ 的使用场景之前,先来回忆一下 MQ 的作用。MQ 可以用来实现削峰填谷,也就是使用它可
2020-06-21 23:48:38
378
原创 14-SpringBoot 有哪些优点?它和 Spring 有什么区别?
Spring 和 Spring Boot 的区别很多新手容易搞混,从这道简单的面试题也可以很轻易试探出你的 Java 基础功底,如果连这个问题都答不上来的话,通常就没有什么下文了,因为这已经是用人单位对面试者的最低要求了,所以本课时我们就来看一下二者的区别,以及 Spring Boot 的特性。我们本课时的面试题是,Spring 和 Spring Boot 有什么区别?Spring Boot 的优点有哪些?典型回答作为 Java 开发人员对 Spring 框架都很熟悉,Spring 为 Java 程序
2020-06-21 23:47:51
504
原创 13-MyBatis 使用了哪些设计模式?在源码中是如何体现的?
MyBatis 的前身是 IBatis,IBatis 是由 Internet 和 Abatis 组合而成,其目的是想当做互联网的篱笆墙,围绕着数据库提供持久化服务的一个框架,2010 年正式改名为 MyBatis。它是一款优秀的持久层框架,支持自定义 SQL、存储过程及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作,还可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Ordinary Java Object,普通 Java
2020-06-21 23:47:21
273
原创 12-底层源码分析 Spring 的核心功能和执行流程?(下)
上一课时我们讲了 Bean 相关的内容,它其实也是属于 IoC 的具体实现之一,本课时我们就来讲讲 Spring 中其他几个高频的面试点,希望能起到抛砖引玉的作用,能为你理解 Spring 打开一扇门。因为 Spring 涉及的内容和知识点太多了,用它来写一本书也绰绰有余,因此这里我们只讲核心的内容,希望下来你能查漏补缺,完善自己的 Spring 技术栈。我们本课时的面试题是,谈一谈你对 IoC 和 DI 的理解。典型回答IoC(Inversion of Control,翻译为“控制反转”)不是一个具
2020-06-21 22:08:52
91
原创 11-底层源码分析 Spring 的核心功能和执行流程?(上)
Spring Framework 已是公认的 Java 标配开发框架了,甚至还有人说 Java 编程就是面向 Spring 编程的,可见 Spring 在整个 Java 体系中的重要位置。Spring 中包含了众多的功能和相关模块,比如 spring-core、spring-beans、spring-aop、spring-context、spring-expression、spring-test 等,本课时先从面试中必问的问题出发,来帮你更好的 Spring 框架。我们本课时的面试题是,Spring B
2020-06-21 21:24:56
107
原创 10-如何手写一个消息队列和延迟消息队列?
第一次听到“消息队列”这个词时,不知你是不是和我反应一样,感觉很高阶很厉害的样子,其实当我们了解了消息队列之后,发现它与普通的技术类似,当我们熟悉之后,也能很快地上手并使用。我们本课时的面试题是,消息队列的使用场景有哪些?如何手动实现一个消息队列和延迟消息队列?典型回答消息队列的使用场景有很多,最常见的使用场景有以下几个。1.商品秒杀比如,我们在做秒杀活动时,会发生短时间内出现爆发式的用户请求,如果不采取相关的措施,会导致服务器忙不过来,响应超时的问题,轻则会导致服务假死,重则会让服务器直接宕机,
2020-06-20 19:08:37
948
原创 09-如何实现本地缓存和分布式缓存?
缓存(Cache) 是指将程序或系统中常用的数据对象存储在像内存这样特定的介质中,以避免在每次程序调用时,重新创建或组织数据所带来的性能损耗,从而提高了系统的整体运行速度。以目前的系统架构来说,用户的请求一般会先经过缓存系统,如果缓存中没有相关的数据,就会在其他系统中查询到相应的数据并保存在缓存中,最后返回给调用方。缓存既然如此重要,那本课时我们就来重点看一下,应该如何实现本地缓存和分布式缓存?典型回答本地缓存是指程序级别的缓存组件,它的特点是本地缓存和应用程序会运行在同一个进程中,所以本地缓存的操
2020-06-20 18:44:29
474
原创 08-动态代理是如何实现的?JDK Proxy 和 CGLib 有什么区别?
90% 的程序员直接或者间接的使用过动态代理,无论是日志框架或 Spring 框架,它们都包含了动态代理的实现代码。动态代理是程序在运行期间动态构建代理对象和动态调用代理方法的一种机制。我们本课时的面试题是,如何实现动态代理?JDK Proxy 和 CGLib 有什么区别?典型回答动态代理的常用实现方式是反射。反射机制是指程序在运行期间可以访问、检测和修改其本身状态或行为的一种能力,使用反射我们可以调用任意一个类对象,以及类对象中包含的属性及方法。但动态代理不止有反射一种实现方式,例如,动态代理可以
2020-06-20 14:25:46
352
原创 07-深克隆和浅克隆有什么区别?它的实现方式有哪些?
使用克隆可以为我们快速地构建出一个已有对象的副本,它属于 Java 基础的一部分,也是面试中常被问到的知识点之一。我们本课时的面试题是,什么是浅克隆和深克隆?如何实现克隆?典型回答浅克隆(Shadow Clone)是把原型对象中成员变量为值类型的属性都复制给克隆对象,把原型对象中成员变量为引用类型的引用地址也复制给克隆对象,也就是原型对象中如果有成员变量为引用对象,则此引用对象的地址是共享给原型对象和克隆对象的。简单来说就是浅克隆只会复制原型对象,但不会复制它所引用的对象,如下图所示:深克隆(D
2020-06-20 12:10:29
260
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人