自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(135)
  • 资源 (10)
  • 收藏
  • 关注

转载 Java GC垃圾收集器这点小事

对于大多数的应用来说,其实默认的JVM设置就够用了,但当你意识到有GC引起的性能问题、并且仅仅加大堆内存空间也解决不了的时候,那你就应该考虑下GC的调优了。但对于大多数程序员来说,这是很麻烦的,因为调优需要很多耐心,并且需要知道垃圾回收器的运作原理及背后对应用的影响。本文是high-level层面的关于Java垃圾回收器的总览,并以例子的形式去讲解性能定位的一些问题。​ 正文开始。​ Java提供了很多种垃圾回收器,会在gc运行的线程中搭配着不同的算法。不同的回收器工作原理不一样,优缺点也不同。最重

2021-12-01 14:49:31 207

转载 kafka consumer防止数据丢失

kafka最初是被LinkedIn设计用来处理log的分布式消息系统,因此它的着眼点不在数据的安全性(log偶尔丢几条无所谓),换句话说kafka并不能完全保证数据不丢失。尽管kafka官网声称能够保证at-least-once,但如果consumer进程数小于partition_num,这个结论不一定成立。考虑这样一个case,partiton_num=2,启动一个consumer进程订阅这个topic,对应的,stream_num设为2,也就是说启两个线程并行处理message。

2021-11-30 15:45:47 233

转载 分布式事务——三阶段提交

在分布式系统中,为了保证数据的高可用,通常会将数据保留多个副本(replica), 这些副本会放置在不同的节点上。这些数据节点可能是物理机器,也可能是虚拟机。为了对用户提供正确的CURD等语意,我们需要保证这些放置在不同节点上的副本是一致的,这就涉及分布式事务的问题。本文介绍分布式事务处理方案之一的三阶段提交协议。分布式事务分布式事务是指发生在多个数据节点之间的事务,分布式事务比单机事务要复杂的多。在分布式系统中,各个节点之间在是相互独立的,需要通过网络进行沟通和协调。由于存在事务机制,可以保证

2021-11-29 14:32:00 708

转载 MySQL 的 crash-safe 原理解析

MySQL作为当下最流行的开源关系型数据库,有一个很关键和基本的能力,就是必须能够保证数据不会丢。那么在这个能力背后,MySQL是如何设计才能保证不管在什么时间崩溃,恢复后都能保证数据不会丢呢?有哪些关键技术支撑了这个能力?本文将为我们一一揭晓。一、前言MySQL 保证数据不会丢的能力主要体现在两方面:能够恢复到任何时间点的状态; 能够保证MySQL在任何时间段突然奔溃,重启后之前提交的记录都不会丢失;对于第一点将MySQL恢复到任何时间点的状态,相信很多人都知道,只要保留有足够的binlo

2021-11-18 10:52:33 213

转载 CPU Cache 与缓存行

最近的两篇文章,介绍了我参加的中间件比赛中一些相对重要的优化,但实际上还存在很多细节优化,出于篇幅限制并未提及,在最近的博文中,我会将他们整理成独立的知识点,并归类到我的系列文章「JAVA 拾遗」中。引言 123456789101112131415161718192021222324 public class Main { static long[][] arr; public static voi.

2021-11-18 10:49:37 677

原创 消息最终一致性

1.本地事务开启,消息生产者处理业务数据,业务入库2.构建领域消息事件,消息入库,此时消息状态为"未投递"3.提交事务,成功则执行第4步4.投递消息到消息中间件,并监听投递状态5.收到消息中间件反馈的ack信息,更改消息状态,成功则为“投递成功”,否则“投递失败”6.启动异常消息定时轮询线程,对"未投递",“投递失败”的消息筛选出来,根据实际业务场景,实行人工处理或者重试投递...

2021-11-03 14:06:03 72

转载 并发机制及其底层实现原理

并发编程的目的是为了让程序运行得更快,但是,并不是启动更多的线程就能让程序最大限度地并发执行。在进行并发编程时, 如果希望通过多线程执行任务让程序运行得更快,会面临非常多的挑战,比如上下文切换的问题、死锁的问题,以及受限于硬件和软件的 资源限制问题,下面介绍几种并发编程的挑战以及解决方案。1.1 上下文切换即使是单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机制。时间片是CPU分配给各个线程的时间, 因为时间片非常短,所以CPU通过不停地切换线程执行,让我们感觉多个线

2021-10-02 21:00:46 1014

转载 CPU缓存一致性协议MESI

CPU高速缓存(Cache Memory)CPU为何要有高速缓存CPU在摩尔定律的指导下以每18个月翻一番的速度在发展,然而内存和硬盘的发展速度远远不及CPU。这就造成了高性能能的内存和硬盘价格及其昂贵。然而CPU的高度运算需要高速的数据。为了解决这个问题,CPU厂商在CPU中内置了少量的高速缓存以解决I\O速度和CPU运算速度之间的不匹配问题。在CPU访问存储设备时,无论是存取数据抑或存取指令,都趋于聚集在一片连续的区域中,这就被称为局部性原理。时间局部性(Temporal Locali

2021-10-02 16:17:00 216

原创 动态代理简介

public interface IHello { String sayHello(String name);}public class HelloImply implements IHello{ @Override public String sayHello(String name) { String result = "hello "+name; System.out.println( result ); ret.

2021-09-27 10:29:54 52

转载 TCP粘包、拆包与通信协议详解

在TCP编程中,我们使用协议(protocol)来解决粘包和拆包问题。本文将详解TCP粘包和半包产生的原因,以及如何通过协议来解决粘包、拆包问题。让你知其然,知其所以然。1 TCP粘包、拆包图解由于TCP传输协议面向流的,没有消息保护边界。一方发送的多个报文可能会被合并成一个大的报文进行传输,这就是粘包;也可能发送的一个报文,可能会被拆分成多个小报文,这就是拆包。下图演示了粘包、拆包的过程,client分别发送了两个数据包D1和D2给server,server端一次读取到字节数是不确定的,因

2021-09-24 14:32:22 895

转载 select ,poll,epoll对比

前言这篇文章读不懂的没关系,可以先收藏一下。笔者准备介绍完epoll和NIO等知识点,然后写一篇Java网络IO模型的介绍,这样可以使Java网络IO的知识体系更加地完整和严谨。初学者也可以等看完IO模型介绍的博客之后,再回头看这些博客,会更加有收获。如果你顺利啃下这篇博客,恭喜你,nginx、redis和NIO等核心思想已经被你掌握了,可以顺势去拓展自己的理解。否则,只是孤立的看epoll,时间一长会很快忘记的。当然,这些核心思想,笔者也会在之后的博客慢慢做详细讲解,欢迎关注概念初探

2021-09-17 16:41:08 165

转载 零拷贝技术

平时在面试中你肯定会经常碰见的问题就是:RocketMQ为什么快?Kafka为什么快?什么是mmap?这一类的问题都逃不过的一个点就是零拷贝,虽然还有一些其他的原因,但是今天我们的话题主要就是零拷贝。传统IO在开始谈零拷贝之前,首先要对传统的IO方式有一个概念。基于传统的IO方式,底层实际上通过调用read()和write()来实现。通过read()把数据从硬盘读取到内核缓冲区,再复制到用户缓冲区;然后再通过write()写入到socket缓冲区,最后写入网卡设备。整个过程发生了

2021-09-17 16:18:45 158

原创 设备终端数据采集模块流程

初始化阶段数据采集轮询:

2021-09-16 16:55:11 194

原创 BIO,NIO,多路复用器测试代码

Clientimport java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.Socket;/** * @author wbb * @ClassName Client * @Description TODO * @date 2021/9/9 17:04 **/public cla

2021-09-14 15:48:12 128

转载 5种网络IO模型:阻塞IO、非阻塞IO、异步IO、多路复用IO、信号驱动IO

目录前言阻塞IO(blocking IO)非阻塞IO(non-blocking IO)多路复用IO(IO multiplexing)异步IO(Asynchronous I/O)模型间的区别和比较(信号驱动IO)前言同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出的答案都可能不同,比如wiki,就认为asynchronous I

2021-09-10 18:25:49 307

转载 理解一下5种IO模型、阻塞IO和非阻塞IO、同步IO和异步IO

5种IO模型、阻塞IO和非阻塞IO、同步IO和异步IO看了一些文章,发现有很多不同的理解,可能是因为大家入切的角度、环境不一样。所以,我们先说明基本的IO操作及环境。本文是在《UNIX网络编程 卷1:套接字联网API》6.2节"I/O 模型 "的基础上,即UNIX/LINUX环境下的网络 IO环境下的理解,它里面给出的例子是读取(接收)网络UDP数据。下面简单写写自己对这些IO模型的理解。1、IOIO (Input/Output,输入/输出)即数据的读取(接收)或写入(发送)操.

2021-09-10 15:54:08 387

转载 Kafka、RabbitMQ、RocketMQ 之间的区别是什么 ?

作为一个有丰富经验的微服务系统架构师,经常有人问我,“应该选择 RabbitMQ 还是 Kafka?”。基于某些原因, 许多开发者会把这两种技术当做等价的来看待。的确,在一些案例场景下选择 RabbitMQ 还是 Kafka 没什么差别,但是这两种技术在底层实现方面是有许多差异的。不同的场景需要不同的解决方案,选错一个方案能够严重的影响你对软件的设计,开发和维护的能力。这篇文章会先介绍 RabbitMQ 和 Apache Kafka 内部实现的相关概念。紧接着会主要介绍这两种技术的主要不同点

2021-09-06 11:26:29 632

转载 一文理解Mysql MVCC

MVCC就是多版本并发控制。MVCC 是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问。为什么需要MVCC呢?数据库通常使用锁来实现隔离性。最原生的锁,锁住一个资源后会禁止其他任何线程访问同一个资源。但是很多应用的一个特点都是读多写少的场景,很多数据的读取次数远大于修改的次数,而读取数据间互相排斥显得不是很必要。所以就使用了一种读写锁的方法,读锁和读锁之间不互斥,而写锁和写锁、读锁都互斥。这样就很大提升了系统的并发能力。之后人们发现并发读还是不够,又提出了能不能让读写之间也不冲突

2021-08-23 17:25:35 133

转载 MySQL 加锁处理分析(MVVC、快照读、当前读、GAP锁(间隙锁))——数据库锁看这一篇就足够了

MySQL 加锁处理分析本文来自:何登成的技术博客一、背景MySQL/InnoDB的加锁分析,一直是一个比较困难的话题。我在工作过程中,经常会有同事咨询这方面的问题。同时,微博上也经常会收到MySQL锁相关的私信,让我帮助解决一些死锁的问题。本文,准备就MySQL/InnoDB的加锁问题,展开较为深入的分析与讨论,主要是介绍一种思路,运用此思路,拿到任何一条SQL语句,都能完整的分析出这条语句会加什么锁?会有什么样的使用风险?甚至是分析线上的一个死锁场景,了解死锁产生的原因。注:MySQL是

2021-08-19 14:13:19 1021 1

转载 Java内存管理-JVM内存模型以及JDK7和JDK8内存模型对比总结

上一篇分享了JVM及其启动流程,今天介绍一下JVM内部的一些区域,以及具体的区域在运行过程中会发生哪些异内存常! 其实也就对应了内存管理的第一篇中 JVM的第三个阶段,程序运行内存溢出。知识地图:一、概述Java的内存管理采用[自动内存管理]机制,因为这个自动管理机制,Java程序员就不需要去写释放内存的代码,而且不容易出现内存泄漏问题(比C/C++程序员少一些烦恼)。但是由于内存的申请和释放都交给了Java虚拟机,一旦出现内存泄漏和溢出问题时,在不了解Java虚拟机内存结构和自动管理机制的

2021-07-22 14:58:53 810 3

转载 JVM内存模型

Java虚拟机(Java Virtual Machine=JVM)的内存空间分为五个部分,分别是:1. 程序计数器2. Java虚拟机栈3. 本地方法栈4. 堆5. 方法区。下面对这五个区域展开深入的介绍。1. 程序计数器1.1. 什么是程序计数器?程序计数器是一块较小的内存空间,可以把它看作当前线程正在执行的字节码的行号指示器。也就是说,程序计数器里面记录的是当前线程正在执行的那一条字节码指令的地址。注:但是,如果当前线程正在执行的是一个本地方法,那么此...

2021-07-21 16:40:57 45

转载 HashMap底层实现原理(下)

上一篇文章我们介绍了HashMap的底层实现,但还遗留了一点内容,我们再回顾一下上一篇文章里说的内容执行完红框里的代码,personMap里放入了8个元素,放置完成后在堆内存表现如下图如果忽略底层实现细节,是这样的在Map中,一个key,对应了一个value,如果key的值已经存在,Map会直接替换value的内容,来看一下源码中是怎么实现的,来看以下代码Person oldPerson1 = personMap.put("张三", new Person("新张三", 21))

2021-06-22 15:32:39 79

转载 HashMap底层实现原理(上)

本来想先在专栏里简单的说一下二叉树,红黑树的内容后再说HashMap的,但看到评论区里不断的出现HashMap这个词,怕大家等得着急,本篇文章就先说说HashMap吧,前面讲ArrayList和LinkedList时把源码说得很细,只要理解了这两块内容,本篇内容也很好理解,先来看看HashMap在Map这个大家族中的位置。上图中,白色部分是接口,黄色部分是要重点了解的,最好是看一遍源码,绿色部分已经过时,不常用了,但是面试中可能会问到。这里先简单的说一下这几个Map,TreeMap是基于...

2021-06-22 15:31:40 86

原创 取号器设计

背景新建商品时,每个商品需要有商品编码,有以下要求1.8位无序的编码(编码比较敏感,不能被外部猜测到平台的商品数量);2.全局唯一,不可重复;方案由三部分组成,分别是“生成器”,“取号器”,"编码池"。设计一个"编码池",采用预生成方案,定时定量生成唯一编码放到"编码池",由“取号器”从"编码池"获取唯一编码。8位无序编码有两部分组成:号段+随机数。号段:2位,随机数:6位。也就是说一次性会生成99W的编码,我们采用每天一次检查,如果检查到当前"编码池"的可用编码低于阈值(...

2021-04-23 15:45:09 873

转载 Canal——增量同步MySQL数据到ElasticSearch

前言本篇只介绍TCP模式下详细的canal相关配置。高可用请参考文章:【Canal——高可用架构设计与应用】Kafka模式请参考文章:【Canal——canal server 读取 binlog 到 kafka 然后在使用 canal-adapter】1.准备1.1.组件  JDK:1.8版本及以上;  ElasticSearch:6.x版本,目前貌似不支持7.x版本; Kibana:6.x版本;  Canal.deployer:1.1...

2021-04-14 15:17:02 332

转载 MySQL优化:如何避免回表查询?什么是索引覆盖

数据库表结构: 1 2 3 4 5 6 createtableuser( idintprimarykey, namevarchar(20), sexvarchar(5), index(name) )engine=innodb; ...

2020-03-30 21:37:57 268

转载 联合索引在B+树上的存储结构及数据查找方式

引言上一篇文章《MySQL索引那些事》主要讲了MySQL索引的底层原理,且对比了B+Tree作为索引底层数据结构相对于其他数据结构(二叉树、红黑树、B树)的优势,最后还通过图示的方式描述了索引的存储结构。但都是基于单值索引,由于文章篇幅原因也只是在文末略提了一下联合索引,并没有大篇幅的展开讨论,所以这篇文章就单独去讲一下联合索引在B+树上的存储结构。本文主要讲解的内容有:联合索引在B+...

2020-03-30 17:21:34 487

转载 MySQL索引背后的数据结构及算法原理

摘要本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题。特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等。为了避免混乱,本文将只关注于BTree索引,因为这是平常使用MySQL时主要打交道的索引,至于哈希索引和全文索引本文暂不讨论。文章主要内容分为三个部分。第...

2020-03-29 20:00:53 120

转载 B树和B+树的插入、删除图文详解

简介:本文主要介绍了B树和B+树的插入、删除操作。写这篇博客的目的是发现没有相关博客以举例的方式详细介绍B+树的相关操作,由于自身对某些细节也感到很迷惑,通过查阅相关资料,对B+树的操作有所顿悟,写下这篇博客以做记录。由于是自身对B+树的理解,肯定有考虑不周的情况,或者理解错误的地方,请留言指出。1. B树1. B树的定义B树也称B-树,它是一颗多路平衡查找树。我们描述一颗B树时需要指...

2020-03-28 21:52:25 398

转载 你对Redis的使用靠谱吗?Redis的性能高,吗?Redis可以保证原子性,吗?用Redis可以实现事务,吗?用Redis可以当队列,吗?Redis适合用来做什么?

Redis是个流行的in-momery存储。接口好用,性能也很强,还支持多种数据结构,加上各种HA和Cluster方案,实在是居家旅行、杀人灭口、必备良药。转存失败重新上传取消必备良药但是就是因为太好用了,好用到让很多人都晕了脑子:用Redis性能就大大提高了 用Redis可以保证原子性 用Redis可以实现事务 用Redis可以当队列 ……这就好像一个股民,在手机上操作...

2020-03-16 17:49:46 361

转载 缓存更新的套路

看到好些人在写更新缓存数据代码时,先删除缓存,然后再更新数据库,而后续的操作会把数据再装载的缓存中。然而,这个是逻辑是错误的。试想,两个并发操作,一个是更新操作,另一个是查询操作,更新操作删除缓存后,查询操作没有命中缓存,先把老数据读出来后放到缓存中,然后更新操作更新了数据库。于是,在缓存中的数据还是老的数据,导致缓存中的数据是脏的,而且还一直这样脏下去了。我不知道为什么这么多人用的都是这个逻...

2020-03-08 23:08:41 94

转载 linux 同步IO: sync、fsync与fdatasync

传统的UNIX实现在内核中设有缓冲区高速缓存或页面高速缓存,大多数磁盘I/O都通过缓冲进行。当将数据写入文件时,内核通常先将该数据复制到其中一个缓冲区中,如果该缓冲区尚未写满,则并不将其排入输出队列,而是等待其写满或者当内核需要重用该缓冲区以便存放其他磁盘块数据时,再将该缓冲排入输出队列,然后待其到达队首时,才进行实际的I/O操作。这种输出方式被称为延迟写(delayed write)(Bach ...

2020-03-01 20:32:48 217

转载 【RabbitMQ】生产者,消费者,信道,队列,交换器和绑定

了解消息通信中的一些重点概念对于深化对RabbitMQ的理解有重要的意义;下面从生产者,消费者,信道,队列,交换器和绑定,来介绍他们在消息通信过程中的角色和作用;生产者:创建消息,然后发布到代理服务器(RabbitMQ)消费者:连接到代理服务器(RabbitMQ)上,并订阅到队列上。不会知道谁是消息的生产者整个过程:生产者创建消息,消费者接收消息。消息:包括有效载荷...

2020-02-14 23:47:33 569

转载 Redis线程安全问题

https://blog.csdn.net/weixin_38070406/article/details/82903677

2020-02-13 22:51:43 284

转载 redis架构演变与redis-cluster群集读写方案

redis架构演变与redis-cluster群集读写方案导言redis-cluster是近年来redis架构不断改进中的相对较好的redis高可用方案。本文涉及到近年来redis多实例架构的演变过程,包括普通主从架构(Master、slave可进行写读分离)、哨兵模式下的主从架构、redis-cluster高可用架构(redis官方默认cluster下不进行读写分离)的简介。同时还介绍使...

2020-01-28 22:54:59 179

转载 一致性哈希算法

一致性哈希算法在1997年由麻省理工学院的Karger等人在解决分布式Cache中提出的,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似。一致性哈希修正了CARP使用的简单哈希算法带来的问题,使得DHT可以在P2P环境中真正得到应用。  但现在一致性hash算法在分布式系统中也得到了广泛应用,研究过memcached缓存数据库的人都知道,memcached服务...

2020-01-08 22:18:56 86

原创 ZooKeeper session管理

ZooKeeper的每个客户端都维护一组服务端信息,在创建连接时由应用指定,客户端随机选择一个服务端进行连接,连接成功后,服务端为每个连接分配一个唯一标识。客户端在创建连接时可以指定溢出时间,客户端会周期性的向服务端发送PING请求来保持连接,当客户端检测到与服务端断开连接后,客户端将自动选择服务端列表中的另一个服务端进行重连。客户端允许应用修改服务端列表,但修改可能导致客户端与服务端...

2019-11-13 20:32:28 163

转载 Redis哨兵模式(sentinel)学习总结及部署记录(主从复制、读写分离、主从切换)

Redis的集群方案大致有三种:1)redis cluster集群方案;2)master/slave主从方案;3)哨兵模式来进行主从替换以及故障恢复。一、sentinel哨兵模式介绍Sentinel(哨兵)是用于监控redis集群中Master状态的工具,是Redis 的高可用性解决方案,sentinel哨兵模式已经被集成在redis2.4之后的版本中。sentinel是redis高可用的解...

2019-10-28 19:23:49 151

转载 带着问题学习分布式系统之数据分片

目录三种数据分片方式 hash方式: 一致性hash range based 小结: 分片特征值的选择 以MongoDB sharding key为例 元数据服务器 HDFS元数据 MongoDB元数据 元数据的缓存: Lease机制: 总结 references正文  在前文中,提出了分布式系统(尤其是分布式存储系统)需要解决...

2019-10-23 17:36:36 215

转载 聊聊同步、异步、阻塞与非阻塞

近来遇到了一些常见的概念,尤其是网络编程方面的概念,如:阻塞、非阻塞、异步I/O等等,对于这些概念自己也没有太清晰的认识,只是很模糊的概念,说了解吧也了解,但是要让自己准确的描述概念方面的具体细节,却说的不那么准确,这也是自己在这几个方面也没有细细考究过的原因吧。经过看了些这几个概念的资料,发现同步、异步、阻塞、非阻塞的概念其实也并不难以理解,在此写下此文,欢迎拍砖,希望多多交流。1 同步与异...

2019-09-29 16:00:03 77

c++屏幕保护程序的开发源码

c++屏幕保护程序的开发源码,注释详尽,易于理解

2012-05-20

Java就业面试题大全

涵盖大中型企业面试,笔试题库,详解面试技巧

2012-05-20

java多线程编程总结

结合案例详解java多线程编程。

2012-05-20

java应用软件设计

各种常用软件源代码,解析:记忆测试软件,计算器, HANNOI-塔,JPEG图象生成器,标准化考试系统 (单机版),标准化考试系统 (C/S网络版),标准化考试系统 (B/S网络版),日历记事本,学籍管理系统,图书查询系统 (B/S网络版), 局域网络广播系统。。。。

2012-04-24

JAVA程序GOHOME自动抢票

解决网络购票难问题,此程序帮助你秒杀成功买到票

2012-04-17

java经典项目源代码合集

内含168个经典项目,虽然项目不是很难,但很有学习价值

2011-12-26

高仿qq聊天源代码

已实现QQ大部分实用功能,完整,规范源代码

2011-12-26

java环境变量设置原理

java环境变量设置原理.。。。。。。。。。

2011-10-23

数据结构算法与运用 c++

本书是关于计算机科学与工程领域的基础性研究科目之一——数据结构与算法的专著。本书不仅仅介绍了理论知识,还提供了50多个应用实例及600多道练习题。 本书内容广博权威,结构清晰合理,是一本全新的有关数据结构与算法的教材,对于计算机编程人员是一本很好的参考书。

2011-10-23

C语言高级编程及实例剖析

提高篇。。。附上代码及实例讲解,内容详细

2011-10-23

空空如也

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

TA关注的人

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