自定义博客皮肤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)
  • 收藏
  • 关注

原创 Kafka 原理——生产者分区写入策略

文章目录一、生产者分区写入策略1.1 分区策略1.1.1 指定分区(与写入策略无关)1.1.2 轮询策略1.1.3 按 key 分配策略1.1.4 随机策略1.1.5 自定义分区策略二、 消息乱序问题参考一、生产者分区写入策略Producer 发送消息到 Topic 时,会根据不同的策略将数据分配到不同的 Partition 中1.1 分区策略1.1.1 指定分区(与写入策略无关)若 Producer 在发送消息时指定了 Partition,就直接发送到这个 Partition,与分区策略无关

2021-05-06 09:30:22 2065 1

原创 Kafka 简介

文章目录一、消息队列简介1.1 消息队列是什么1.2 消息队列中间件1.3 消息队列应用场景1.3.1 异步处理1.3.2 系统解耦1.3.3 流量削峰1.3.4 日志处理1.4 生产者-消费者模型1.5 消息队列的两种模式1.5.1 点对点模式1.5.2 发布订阅模式二、Kafka 简介2.1 Kafka 简介2.2 Kafka基本组成参考文章一、消息队列简介1.1 消息队列是什么消息队列就是存储消息的队列;英文名为 Message Queue,经常缩写为 MQ。1.2 消息队列中间件用来存储

2021-04-29 23:12:42 1344 3

原创 Redis 事务

文章目录一、事务的定义二、事务的基本操作三、事务的错误处理注意事项3.1 组队阶段3.2 执行阶段四、Redis 事务的三特性五、锁5.1 监视锁5.2 分布式锁5.3 分布式锁改良-15.4 分布式锁改良-2参考文章一、事务的定义Redis 的事务就是一个命令执行的队列,将一系列的预定义命令放入队列;执行时按照添加顺序执行,中间不会被打断和干扰。一个队列中,一次性、顺序性、排它性地执行一系列的命令;redis 的事务更像是批量执行指令。二、事务的基本操作1、multi:开启事务,并

2021-02-03 23:54:18 140

原创 Redis 删除策略和淘汰算法

文章目录一、数据删除策略1.1 过期数据的说明1.2 数据删除策略的目标1.3 删除策略1.3.1 定时删除1.3.2 惰性删除1.3.3 定期删除1.4 删除策略的比较二、数据淘汰策略2.1 内存不足时放入新数据的问题2.3 相关策略2.3 数据逐出的相关配置参考文章一、数据删除策略1.1 过期数据的说明我们可以使用 TTL 指令获取数据状态返回时间:具有时效性的数据返回 -1 :永久有效的数据返回 -2 :已经过期的数据或被删除的数据或未定义的数据对于过期数据,redis 删

2021-02-02 10:30:37 269

原创 Redis 持久化

文章目录一、RDB1.1 概念1.2 原理1.3 启动方式1.3.1 手动触发——save 指令1.3.2 手动触发——bgsave 指令1.3.3 自动触发——save 配置1.3.4 RDB 特殊的启动方式1.4 相关配置1.5 save 和 bgsave 对比1.6 RDB的优缺点二、AOF2.1 概念2.2 原理2.3 三种策略2.4 相关配置2.5 AOF 重写2.5.1 概念2.5.2 作用2.5.3 重写规则2.5.4 重写方式三、RDB 和 AOF 的区别3.1 RDB VS AOF3.2

2021-02-01 09:47:25 131 2

原创 《实战Java高并发程序设计》——无锁编程

文章目录一、悲观锁和乐观锁(CAS)1.1 悲观锁1.2 乐观锁二、比较并交换(CAS)2.1 步骤2.2 优点2.3 缺点三、AtomicInteger3.1 介绍3.2 相关方法3.3 代码示例3.4 AtomicInteger和使用锁的性能比较四、AtomicReference4.1 简介4.2 示例五、AtomicStampReference5.1 简介5.2 新增API(相对于AtomicReference)5.3 示例六、AtomicIntegerArray6.1 简介6.2 核心API6.3

2020-12-29 00:05:41 310 2

原创 《实战Java高并发程序设计》——锁优化

文章目录一、提高锁性能的建议1.1 减小锁的持有时间1.2 减小锁粒度1.3 读写锁替换独占锁1.4 锁分离1.5 锁粗化二、JVM中的锁优化2.1 锁偏向2.2 轻量级锁2.3 自旋锁2.4 锁消除一、提高锁性能的建议1.1 减小锁的持有时间尽量在关键代码部分持有锁,防止在持锁过程中执行大量非关键代码。即尽可能减少某个锁的占有时间,以减少线程间互斥的可能性,进而提升系统的并发能力。public synchronized void syncMethod(){ otherCode1(); /

2020-12-26 21:16:19 169 1

原创 《实战Java高并发程序设计》笔记——ThreadLocal

文章目录一、简单的使用1.1 是什么1.2 示例1.3 解决方案二、实现原理2.1 set() 方法2.2 get() 方法2.3 ThreadLocal 导致内存泄漏三、对性能的帮助3.1 说明3.2 代码示例一、简单的使用1.1 是什么ThreadLocal是一个线程的局部变量,只有当前线程可以访问,因为只有当前线程可以访问,所以是线程安全的。1.2 示例1、举例多线程环境中使用SimpleDateFormat 解析日期2、代码public class SimpleDateFormat

2020-12-24 12:03:20 103

原创 《实战Java高并发程序设计》笔记——线程池

文章目录一、线程池概念1.1 为什么需要线程池1.2 池化思想二、JDK对线程池的支持2.1 Executor框架结构图2.2 Executor框架提供的线程池三、线程池的核心实现3.1 构造函数3.2 核心参数3.3 任务队列3.3.1 SynchronousQueue(直接提交的队列)3.3.2 ArrayBlockingQueue(有界的任务队列)3.3.3 LinkedBlockingQueue(无界任务队列)3.3.4 PriorityBlockingQueue(优先任务队列)3.4 默认线程池的

2020-12-23 00:28:15 132

原创 泛型学习笔记

文章目录一、泛型的定义二、泛型的使用2.1 泛型类2.2 泛型接口2.3 泛型方法2.4 泛型类和泛型方法共存的情况三、类型通配符3.1 我们为什么需要通配符?3.2 无限定通配符<?>3.3 有上限通配符<? extends T>3.4 有下限通配符<? super T>3.5 注意四、类型擦除4.1 定义4.2 验证4.3 泛型信息转译4.3.1 情况一:类型参数T4.3.2 情况二:有上限的类型参数T4.3.3 总结4.3.4 注意事项五、如何在List中添加其它类

2020-12-19 14:59:10 146 1

原创 JAVA设计模式之——观察者模式

文章目录一、类型二、定义三、参与者四、类图五、示例六、注意事项和细节参考文章一、类型行为类模式二、定义定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都会得到通知并自动更新。三、参与者1、Subject(目标接口):目标就是观察者观察的对象,它拥有一个集合来存放观察者对象,并提供注册、删除、通知观察者对象的接口。2、ConcreteSubject(具体的目标类):实现 Subject 接口或抽象类,当有数据更新时,向各个观察者发送通知。3、Observer

2020-12-18 22:18:55 117 1

原创 JAVA设计模式之——策略模式

文章目录一、类型二、定义三、参与者四、类图五、示例5.1 举例5.2 代码六、注意事项和细节参考文章一、类型行为类模式二、定义定义一组算法,将每个算法封装起来,并且使他们之间可以相互替换。此模式让算法的变化独立于使用算法的客户。相关的设计原则:把变化的代码分离出来针对接口编程尽量使用组合/聚合三、参与者IStrategy(策略接口):算法的接口。ConcreteStrategy(策略实现类):实现策略接口,提供具体的算法。Context(封装类):对策略进行二次封装

2020-12-18 14:54:53 88

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

文章目录一、类型二、定义三、举例四、类适配器模式4.1 定义4.2 参与者4.3 UML类图4.4 示例代码4.5 注意事项和细节五、对象适配器模式5.1 定义5.2 参与者5.3 UML类图5.4 示例代码5.5 注意事项和细节六、接口适配器模式6.1 定义6.2 参与者6.3 类图6.4 示例代码6.5 注意事项和细节参考文章一、类型结构型模式二、定义将某个类的接口转换成客户端期望的另一个接口,让原本因为接口不匹配而不能工作的类可以一起协同工作。适配器模式一共分为3种类适配器模式对象

2020-12-16 10:23:02 260

原创 JAVA设计模式之——模板方法模式

文章目录一、类型二、定义三、参与者四、UML类图五、示例六、总结参考文章一、类型行为类模式二、定义定义一个算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤。三、参与者1、AbstractClass抽象类:实现一个模板方法,定义算法的骨架,具体的子类将实现这些方法以实现算法的各个步骤;2、ConcreteClass:具体的子类,实现抽象方法,以完成算法中的各个步骤。四、UML类图说明:AbstractClass 是抽象类,

2020-12-15 20:24:59 77

原创 Java是值传递还是引用传递?

文章目录一、值传递和引用传递二、基本类型和引用类型三、赋值运算符"="的作用四、调用方法时发生了什么1、基本类型2、引用类型:提供了改变自身值的方法3、引用类型:提供了改变自身值的方法,但是不使用这个方法,而是使用了赋值运算符(=)五、总结参考文章首先,我们要知道值传递和引用传递的区别;然后要了解Java中基本类型和引用类型的区别,以及Java中"="的作用;最后我们再来判断Java到底值值传递还是引用传递。一、值传递和引用传递值传递:是指在调用函数时将实际参数复制一份到函数中,在函数中

2020-12-13 00:24:42 661

原创 JAVA设计模式之——单例模式

文章目录一、类型二、定义三、UML类图四、示例4.1 饿汉式(静态常量)4.2 饿汉式(静态代码块)4.3 懒汉式(线程不安全)4.4 懒汉式(线程安全,同步方法)4.5 懒汉式(线程安全,同步代码块)4.6 双重检测4.7 静态内部类4.8 枚举五、注意事项和细节说明参考文章一、类型创建型模式二、定义某个类只能存在一个对象实例,可以自行实例化,并存在一个获取这个唯实例的静态方法。三、UML类图说明:单例类 Singleton 中有一个私有静态成员变量 instance ,可以通过公共的

2020-11-15 23:09:54 94

原创 JAVA设计模式之——原型模式

文章目录一、类型二、定义三、参与者四、类图五、示例六、注意事项和细节参考文章一、类型建造者模式二、定义用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。有原型,说明这个模式有一个样板实例,我们可以通过这个样板实例来复制一个内部属性一模一样的对象。三、参与者Prototype(原型类):声明一个克隆自己的接口ConcretePrototype(具体的原型类):实现一个克隆自己的操作Client(客户端):让一个原型对象克隆自己,从而创建一个新的对象(内部属性相同)

2020-11-11 01:03:03 104 2

原创 JAVA设计模式之——建造者模式

文章目录一、类型二、定义三、简化方式3.1 示例3.2 实现步骤3.3 代码示例四、传统方式4.1 参与者4.2 UML类图4.3 示例4.4 优点参考文章一、类型建造者模式二、定义建造者模式用于创建过程稳定,但配置多变的对象。将一个复杂的构建和其表示相分离,使得同样的构建过程可以创建不同的表示。三、简化方式3.1 示例经典的【建造者-指挥者】模式现在并不常用,现在建造者模式主要是通过链式调用来生成不同的配置。例如:我们现在想要做一杯奶茶,奶茶的制作过程是稳定的,但其中有很多东西

2020-11-09 01:15:18 244

原创 JAVA设计模式之——抽象工厂模式

文章目录一、类型二、定义三、参与者四、类图五、示例六、适用情况参考文章一、类型创建型模式二、定义定义一个接口,用于创建一组相关或有依赖关系的对象,而且无需指定这些对象具体的类。三、参与者1、AbstractFactory:抽象工厂,用于声明创建抽象产品对象的方法2、ConcreteFactory:AbstractFactory 抽象工厂的实现类,实现创建具体产品的方法3、AbstractProduct:某一类产品的接口4、ConcreteProduct:AbstractProduct

2020-11-07 00:44:33 92

原创 JAVA设计模式之——工厂方法模式

文章目录一、类型二、定义三、参与者四、类图五、示例六、适用情况参考文章一、类型建造者模式二、定义定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到它的子类。三、参与者Product(产品接口):所需创建对象的接口,有时也会使用抽象类。ConcreteProduct(产品实现):实现 Product 接口Creator(工厂接口):用来声明一个工厂方法,这个方法用来返回一个 Product 类型的对象。 Creator 也可以定义一个工厂方法的默认实现

2020-11-06 01:04:47 116

原创 设计模式之——UML类图

文章目录一、UML类图介绍二、类图——依赖三、类图——泛化(继承)四、类图——实现五、类图——关联5.1 单向关联5.2 双向关联5.3 自关联六、类图——聚合七、类图——组合参考文章一、UML类图介绍1、UML 类图用于描述系统中的类(对象)本身的组成和类(对象)之间的各种静态关系。2、类之间的关系:依赖、泛化(继承)、实现、依赖、聚合和组合。3、类图的简单示例:public class Person { private Integer id; private String na

2020-11-05 00:35:46 342

原创 设计模式七大原则 (7)——合成复用原则

文章目录一、定义二、依赖、聚合、组合介绍2.1 依赖关系2.2 聚合关系2.3 组合关系三、注意事项和细节参考一、定义尽量使用组合/聚合的方式,而不是继承方式。二、依赖、聚合、组合介绍2.1 依赖关系定义 : 只要在类中用到了对方,那么它们之间就存在依赖关系。依赖关系常可以出现在以下地方类中用到了对象类的成员变量方法的返回类型方法接收的参数类型方法中使用到2.2 聚合关系定义 : 聚合关系表示的是整体和部分的关系,整体和部分可以分开。例如:一台电脑由显示器、键盘、鼠标等

2020-11-04 00:54:22 147

原创 设计模式七大原则 (6)——迪米特法则

文章目录一、定义二、应用举例2.1 方式一 : 违背迪米特法则2.2 方式二 : 遵守迪米特法则三、注意事项和细节参考一、定义迪米特法则也叫最少知道原则:即一个类对依赖的类知道的越少越好。也就是说,被依赖的类不论多复杂,尽量将逻辑封装在类的内部,除了堆外提供的 public 方法,不对外泄露任何信息。迪米特法则的另一个简单定义:只与直接的朋友进行通讯。直接朋友:依赖、关联、组合、聚合都是耦合的方式,只要两个对象之间有耦合关系,那这两个对象就是朋友关系。其中,成员变量、方法参数、方法返回值中出现的

2020-11-03 21:47:16 748

原创 设计模式七大原则 (5)——开闭原则

文章目录一、定义二、应用举例2.1 方式一 : 不遵循开闭原则2.2 方式二 : 遵循开闭原则三、注意事项和细节参考一、定义类、模块和函数应该对拓展开放,对修改关闭。当软件需要变化时,尽量通过拓展软件实体的行为而不是通过修改已有的代码来实现变化。二、应用举例我们来用一个画图的功能来说明。类图:说明: Shape类 是所有图形类的基类; GraphicEditor类 接收 Shape 对象并根据其参数 type 判断画出什么图形。2.1 方式一 : 不遵循开闭原则我们在实现这个画图

2020-11-03 21:43:58 243 2

原创 设计模式七大原则 (4)——里氏替换原则

文章目录一、定义二、应用举例2.1 代码一2.2 代码二2.3 代码三三、注意事项和细节参考一、定义我们平时说的继承,它有另一层含义父类中已实现的方法实际上是在设定规范,虽然不要所有子类都遵守这些规范,但是子类如果对这些已实现的方法任意修改,就会对整个继承体系造成破坏。继承有优点,也有缺点。如果一个类被其它类所继承,当这个类需要修改时,不仅要考虑所有的子类,且在修改后相关子类的功能可能会出现问题。里氏替换原则定义定义一 : 现在有类 Class1 的对象 obj1 ,类 Class2 的对

2020-11-03 21:38:17 121

原创 设计模式七大原则 (3)——依赖倒转原则

文章目录一、定义二、应用举例2.1 方式一2.2 方式二三、依赖关系传递的三种方式3.1 方式一:接口传递3.2 方式二:构造方法传递3.3 方法三:setter方法传递四、注意事项和细节参考信息一、定义高层模块不应该依赖低层模块,二者都应该依赖它们的抽象抽象不应该依赖细节,细节反而需要依赖抽象依赖倒转的中心思想使是面向接口编程依赖倒转原则所基于的设计理念 : 相较于细节的多变性,抽象的东西稳定的多;以抽象为基础的架构比以细节为基础的架构要稳定的多在Java中,抽象指的是接口或抽象类,细节是

2020-10-25 22:04:47 165

原创 设计模式七大原则 (2)——接口隔离原则

文章目录1、 定义2、 应用实例2.1不符合接口隔离原则2.2 符合接口隔离原则3、 注意事项和细节参考信息1、 定义客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小的接口上2、 应用实例2.1不符合接口隔离原则这个图的意思是:类A依赖接口Ⅰ中的方法1、2、3,类B是对类A的依赖实现;类C依赖接口Ⅰ中的方法1、4、5,类D是对类C的依赖实现;对于类B和D来说,由于它们实现接口Ⅰ,虽然它们存在用不到的方法,但是必须要去实现代码interface Interfac

2020-10-25 20:45:48 76

原创 设计模式七大原则 (1)——单一职责原则

1.1 定义导致类变更的原因,不要多于一个。即 : 一个类只负责一项职责。如类 T 负责职责 P1 和 P2,当 P1 因为需求改变而要修改类T时,有可能导致原来正常的 P2 执行错误。所以,我们可以拆分类的粒度,将类 T 拆分为类 T1 和类 T2。1.2 应用实例举例 : 我们需要用一个类来描述交通工具的运行场景方式一class Vehicle { public void run(String vehicle) { System.out.println("vehi

2020-10-25 20:30:25 122

原创 JavaSE之——反射

文章目录一、静态语言VS动态语言二、Java Refletion2.1 反射概念2.2 Java反射机制提供的功能2.3 Java反射相关的API2.4 Java反射的优点和缺点三、Class类3.1 Class类的常用方法3.2 如何获取Class类的实例3.3 哪些类型可以有Class对象四、Java内存分析4.1 类的加载与ClassLoader的理解4.2 什么时候回发生类的初始化4.3 类加载器的作用五、获取运行时类的完整结构六、动态创建对象执行方法七、setAccessible(true)效率测

2020-10-24 23:58:05 148

原创 JavaSE之——注解入门

文章目录一、什么是注解二、内置注解三、元注解四、自定义注解五、通过反射获取注解参考信息各大框架都使用了很多注解,学习注解可以让我们更好的了解框架的运行原理一般公司自己会封装一些注解,了解注解的原理可以让我们获得更高效的开发掌握注解,我们可以有机会参与到公司框架的封装,得到个人能力的提升一、什么是注解Annotation 的作用:注解不是程序本身,但是它可以对程序做出解释(这点和 comment 相同)注解可以被其它程序(例如编译器)读取Annotation 的格式:注解是

2020-10-19 22:58:00 206

原创 SpringBoot之——异步、定时、邮件任务

文章目录一、异步任务二、定时任务1、cron表达式1.1 什么时cron表达式1.2 各个域支持的字符类型1.3 特殊字符的含义1.4 表达式示例2、测试步骤三、邮件任务参考信息一、异步任务我们在网站上发送邮件,后台在发送邮件时由于时间过长导致前端响应不动,直到邮件发送完毕前端才可以响应。对于这种任务,可以采用异步的方式进行处理。1、创建service包2、在包中创建一个AsyncService类,编写相关方法并在方法上添加 @Async 注解,告诉SpringBoot这是一个异步的方法,Spr

2020-10-13 01:59:05 360 1

原创 《实战Java高并发程序设计》笔记——同步工具类

文章目录一、可重入锁ReentrantLock1.1 什么是可重入锁1.2 为什么叫做可重入1.3 可重入锁的高级功能1.3.1 中断响应1.3.2 限时等待1.3.3公平锁1.4 相关方法1.5 可重入的三要素二、 Condition重入锁搭档2.1 介绍2.2 相关方法2.3 代码示例三、Semaphore信号量3.1 信号量和锁的区别3.2 主要方法3.3 代码示例四、ReadWriteLock读写锁4.1 读写锁和普通锁的区别4.2 读写锁的访问约束情况4.3 适用情况4.4 代码示例五、Count

2020-09-30 16:05:28 185

原创 《实战Java高并发程序设计》笔记——Java并行程序基础

文章目录一、线程基础知识1.1 进程是什么1.2 线程是什么1.3为什么使用线程1.4 线程的生命周期二、线程基础操作2.1 新建线程2.1.1 如何创建线程2.1.2 调用start()和调用run()的区别2.2 终止线程2.2.1 stop()方法2.2.2 为什么不推荐使用stop()方法2.3 线程中断2.3.1 线程中断2.3.2 与线程中断有关的方法2.3.3 sleep()方法2.3.4 sleep()由于中断而导致的问题2.4 等待(wait)和通知(notify)2.4.1 wait()

2020-09-30 01:34:57 123

原创 《实战Java高并发程序设计》笔记——并行基础概念

文章目录一、相关概念1、同步和异步2、并发和并行3、临界区4、阻塞和非阻塞5、死锁、饥饿和活锁二、并发级别1、阻塞2、无饥饿3、无障碍4、无锁5、无等待三、JMM1、原子性2、可见性3、有序性4、Happen-Before 原则一、相关概念1、同步和异步同步:线程 A 调用一个方法,必须等到方法调用返回后,线程A才能继续运行异步:线程 A 调用一个方法,然后继续执行;而这个方法一般会在另一个线程 B 中执行。整个过程中,这个方法不会阻碍线程 A 的工作2、并发和并行并行:多个任务同时执行并发

2020-09-15 01:32:29 123

原创 Java 并发入门

文章目录一、Volatile关键字1. 不使用任何同步手段2. 使用synchronized3. 使用 `volatile` 关键字4. 总结二、原子类1. 常规2. 代码二,使用 `volatile` 关键字3. 代码三:使用原子类三、模拟CAS算法四、CopyOnWriteArrayList1. 代码一:使用普通的ArrayList2.代码二:使用CopyOnWriteArrayList3.总结五、CountDownLatch六、Callable创建线程七、Lock锁八、生产者—消费者模型九、交替打印A

2020-09-06 23:43:12 147

原创 LocalDateTime 相关方法

LocalDateTime 相关方法注意:本文中相关变量与对应的类型关系为datexxx -> LocalDatetimexxx -> LocalTimedateTimexxx -> LocalDateTime1、获取日期/时间/日期时间LocalDate date1 = LocalDate.now(); // 2020-09-04LocalTime time1 = LocalTime.now(); // 10:57:10.594LocalDateTime da

2020-09-04 11:32:05 531

原创 SimpleDateFormat和Calendar方法测试

日期测试1、SimpleDateFormat 测试/** * @Title: SimpleDateFormat 测试 * @Description: * @author: QianYi * @date: 2020/8/27 - 17:33 */public class SimpleDateFormatTest { public static void main(String[] args) throws ParseException { // 将字符串String解

2020-08-28 02:14:23 131

原创 《深入理解Java虚拟机》个人总结

文章目录一、Java内存区域和内存溢出异常1.1 运行时数据区域1.1.1程序计数器(私有)1.1.2 Java 虚拟机栈(私有)1.1.3本地方法栈(私有)1.1.4Java 堆(公有)1.1.5方法区(公有)1.1.6运行时常量池(公有)1.2 实战:OutOfMemoryError 异常1.2.1 Java堆溢出1.2.2虚拟机栈和本地方法栈溢出1.2.3方法区和运行时常量池溢出1.2.4本...

2020-03-13 14:05:46 109

空空如也

空空如也

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

TA关注的人

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