自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

成功最快的秘诀: 抱团取暖 。

你的时间花在哪里,收获就在哪里

  • 博客(40)
  • 收藏
  • 关注

原创 全网最全-谷粒商城项目-面试总结-简历优化

该系用采用SpringCloud架构,利用SpringBoot构建应用,利用Nacos作为服务的注册、配置中心,利用OpenFeign实现与其他模块进行交互,利用Sentinel实现熔断降级和错误处理,利用Gateway作为服务网关,利用RabbitMQ实现延迟队列,利用Redis作为缓存解决读多写少的场景,利用MySQL进行持久化,利用MyBatisPlus作为持久化框架。

2022-09-20 16:49:11 285220 50

原创 全网最全-探花交友项目-面试总结-简历优化

本项目是一个在线交友平台,在该平台中可以搜索附近的人,查看好友动态,平台还会通过大数据计算进行智能推荐,通过智能推荐可以找到更加匹配的好友,这样才能增进用户对产品的喜爱度。探花平台还提供了在线即时通讯功能,可以实时的与好友进行沟通,让沟通随时随地的进行。

2023-05-22 16:42:25 233957 5

原创 《MySQL必修课:瞬间搞定大厂高频MySQL面试题,轻松拿下心仪职位!》

索引是用来优化查询速度的一种数据结构,可以用来加快分组和排序的速度以及表之间的连接,但是建立索引需要占用物理空间,对应增删改后的索引数据需要进行动态维护,在大数据量情况下,效率会很低。视图是一个虚拟表,是动态生成的,它只存放视图的定义,不存放数据。因此可以提高复杂sql语句的复用性和数据的安全性。视图的建立和删除不影响基本表对视图内容的更新直接影响基本表当视图来自多个基本表时,不允许添加和删除数据。

2023-05-21 10:45:27 12190 3

原创 《MySQL必修课:想要成为数据库架构大师?掌握这些集群技能让你轻松hold住!》

在MySQL故障切换过程中,MHA能做到在30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。可以发现MySQL 5.7二进制日志较之原来的二进制日志内容多了last_committed和sequence_number,last_committed表示事务提交的时候,上次事务提交的编号,如果事务具有相同的last_committed,表示这些事务都在一组内,可以进行并行的回放。而分片策略是指分片的规则,常用规则有以下几种。

2023-05-21 10:39:10 12038

原创 《MySQL必修课:掌握事务和锁的魔法!助你实战无敌!》

每一个写事务,都会修改BufferPool,从而产生相应的Redo/Undo日志,在Buffer Pool 中的页被刷到磁盘之前,这些日志信息都会先写入到日志文件中,如果 Buffer Pool 中的脏页没有刷成功,此时数据库挂了,那在数据库再次启动之后,可以通过 Redo 日志将其恢复出来,以保证脏页写的数据不会丢失。引入锁之后就可以支持并发处理事务,如果事务之间涉及到相同的数据项时,会使用排他锁,或叫互斥锁,先进入的事务独占数据项以后,其他事务被阻塞,等待前面的事务释放锁。对于并发率要求低的可以选择悲观锁。

2023-05-21 10:27:54 11779

原创 全网最全-HR面试高频问题-求职宝典

这个问题在技术面试时常被问到,问这个问题的意图可能是想考察你的成长路径和编程习惯,因为,你最熟悉的项目往往是你成长最快的项目,那个成长最快的项目往往会给你今后的编程习惯留下很多痕迹。所以,通过你对熟悉项目的描述,有经验的他会很快锁定你技术成长中的缺陷和闪光点,从而判断是否能够“为我所用”。你最好拿出一个自己最擅长技术的那个项目进行介绍,他听完你的介绍后,会接下来进行提问,这样他所有问的问题,你都成竹在胸了。切忌拿自己参与很少的项目来介绍,一旦他深入的询问很可能你会答非所问,反而造成更严重的影响。

2023-05-20 20:13:30 237346 3

原创 《MySQL必修课:狙击海量数据!教你如何进行索引分析与SQL查询优化!》

辅助索引的叶子节点存储的是主键值和索引字段值,通过辅助索引无法直接定位行记录,通常情况下,需要扫码两遍索引树。我们在使用索引时,不要只关注是否起作用,应该关心索引是否减少了查询扫描的数据行数,如果扫描行数减少了,效率才会得到提升。复合索引使用时遵循最左前缀原则,最左前缀顾名思义,就是最左优先,即查询中使用到最左边的列,那么查询就会使用到索引,如果从索引的第二列开始查找,索引将失效。虽然使用了索引,但是还是从主键索引的最左边的叶节点开始向右扫描整个索引树,进行了全表扫描,此时索引就失去了意义。

2023-05-20 15:18:45 13679 1

原创 《MySQL必修课:索引大决战!你不得不知道的各种索引类型和实现原理!》

复合索引可以代替多个单一索引,相比多个单一索引复合索引所需的开销更小。索引同时有两个概念叫做窄索引和宽索引,窄索引是指索引列为1-2列的索引,宽索引也就是索引列超过2列的索引,设计索引的一个重要原则就是能用窄索引不用宽索引,因为窄索引往往比组合索引更有效。与"普通索引"类似,不同的就是:索引字段的值必须唯一,但允许有空值。聚簇索引和非聚簇索引:B+Tree的叶子节点存放主键索引值和行记录就属于聚簇索引;主键索引和辅助索引:B+Tree的叶子节点存放的是主键字段值就属于主键索引;

2023-05-20 15:14:11 13626 1

原创 《MySQL必修课:存储引擎大揭秘!InnoDB和MyISAM究竟谁更强?》

Undo:意为撤销或取消,以撤销操作为目的,返回指定某个状态的操作。Undo Log:数据库事务开始之前,会将要修改的记录存放到 Undo 日志里,当事务回滚时或者数据库崩溃时,可以利用 Undo 日志,撤销未提交事务对数据库产生的影响。Undo Log产生和销毁:Undo Log在事务开始前产生;事务在提交时,并不会立刻删除undo log,innodb会将该事务对应的undo log放入到删除列表中,后面会通过后台线程purge thread进行回收处理。

2023-05-20 15:09:09 13680 1

原创 《MySQL必修课:海量数据黑科技!深入理解MySQL体系架构与运行机制》

查询执行引擎负责执行 SQL 语句,此时查询执行引擎会根据 SQL 语句中表的存储引擎类型,以及对应的API接口与底层存储引擎缓存或者物理文件的交互,得到查询结果并返回给客户端。句,此时查询执行引擎会根据 SQL 语句中表的存储引擎类型,以及对应的API接口与底层存储引擎缓存或者物理文件的交互,得到查询结果并返回给客户端。查询缓存(Cache&Buffer),这是MySQL的一个可优化查询的地方,如果开启了查询缓存且在查询缓存过程中查询到完全相同的SQL语句,则将查询结果直接返回给客户端;

2023-05-20 15:04:58 13752 1

原创 《Redis主从复制大揭秘:性能翻倍,让你的缓存飞一般的体验!》

当客户端向从服务器发送slaveof(replicaof) 主机地址(127.0.0.1)端口(6379)时:从服务器将主机ip(127.0.0.1)和端口(6379)保存到redisServer的masterhost和masterport中。当同步数据完成后,主从服务器就会进入命令传播阶段,主服务器只要将自己执行的写命令发送给从服务器,而从服务器只要一直执行并接收主服务器发来的写命令。从服务器将向发送SLAVEOF命令的客户端返回OK,表示复制指令已经被接收,而实际上复制工作是在OK返回之后进行。

2023-05-19 12:25:21 11304 2

原创 《纵横高并发世界,Redis分布式锁让你秒杀无敌!》

传统的session是由tomcat自己进行维护和管理,但是对于集群或分布式环境,不同的tomcat管理各自的session,很难进行session共享,通过传统的模式进行session共享,会造成session对象在各个tomcat之间,通过网络和Io进行复制,极大的影响了系统的性能。答案是肯定的,比如客户端A加锁,一段时间之后客户端A解锁,在执行jedis.del()之前,锁突然过期了,此时客户端B尝试加锁成功,然后客户端A再执行del()方法,则将客户端B的锁给解除了。那么是否真的有这种场景?

2023-05-18 21:23:06 14132 1

原创 《Redis缓存神器:解决缓存穿透、雪崩、击穿问题的完美方案》

这个时候,需要考虑一个问题:缓存被“击穿”的问题,这个和缓存雪崩的区别在于这里针对某一key缓存,前者则是很多key。单个简单的key存储的value很大,可以尝试将对象分拆成几个key-value,使用mget获取值,这样分拆的意义在于分拆单次操作的压力,将操作压力平摊到多次操作中,降低对redis的IO影响。缓存在某个时间点过期的时候,恰好在这个时间点对这个Key有大量的并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。

2023-05-18 21:18:42 10868 1

原创 《Redis缓存大作战:掌握缓存预热与设计要素》

因为静态文件(比如css,js,图片)中,很多都是不经常更新的。通常来讲,缓存的命中率越高则表示使用缓存的收益越高,应用的性能越好(响应时间越短、吞吐量越高),抗并发的能力越强。缓存的设计要分多个层次,在不同的层次上选择不同的缓存,包括JVM缓存、文件缓存和Redis缓存。分布式缓存,采用主从+哨兵或RedisCluster的方式缓存数据库的数据。这里的文件缓存是基于http协议的文件缓存,一般放在nginx中。由此可见,在高并发的互联网系统中,缓存的命中率是至关重要的指标。

2023-05-18 21:15:17 10997 1

原创 《Redis面试宝典:揭秘大厂面试必问的高性能缓存问题!》

IO多路复⽤就是 通过⼀种机制实现监听多个描述符,⼀旦描述符就绪就会通知程序去执⾏相应的读写操作常⻅的有select、poll、epollRedis采用单线程多进程集群方案Redis是基于内存的操作,CPU不是Redis的瓶颈瓶颈最有可能是机器内存的大小或者网络带宽单线程的设计是最简单的但是对多核CPU利用率不够,所以Redis6采用多线程。代码更清晰,处理逻辑更简单不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗。

2023-05-18 17:58:04 10976

原创 《Redis数据永不消逝:探究AOF和RDB持久化策略》

为了解决这个问题, Redis 增加了一个 AOF 重写缓存,这个缓存在 fork 出子进程之后开始启用,Redis 主进程在接到新的写命令之后,除了会将这个写命令的协议内容追加到现有的 AOF 文件之外,还会追加到这个缓存中。不过,使用子进程也有一个问题需要解决:因为子进程在进行 AOF 重写期间,主进程还需要继续处理命令,而新的命令可能对现有的数据进行修改,这会让当前数据库的数据和重写后的 AOF 文件中的数据不一致。Redis数据量存储过大,性能突然下降,fork 时间过长阻塞主进程则只开启AOF。

2023-05-18 17:30:42 10780

原创 《Redis魔法盒:掌握数据类型与应用场景,让你的分布式缓存飞起来!》

REDIS_STRING(字符串)、REDIS_LIST (列表)、REDIS_HASH(哈希)、REDIS_SET(集合)、REDIS_ZSET(有序集合)。1、hash表的数组初始容量为4,随着k-v存储量的增加需要对hash表数组进行扩容,新扩容量为当前量的一倍,即4,8,16,32。Redis没有表的概念,Redis实例所对应的db以编号区分,db本身就是key的命名空间。对于少的和小的数据,Redis采用小的和压缩的存储方式,体现Redis的灵活性。Redis整个数据库是用字典来存储的。

2023-05-18 16:40:55 10846

原创 《Redis缓存中的时间炸弹——缓存过期和淘汰策略》

当我们使用 expire命令设置一个key的失效时间时,Redis 首先到 dict 这个字典表中查找要设置的key 是否存在,如果存在就将这个key和失效时间添加到 expires 这个字典表。假设这时候缓存容量已经达到上限,必须先删除最近最少访问的数据,那么位于哈希链表最左端的用户1就会被删除掉,然后再把用户6插入到最右端。这时候,链表中最右端是最新访问到的用户4,最左端仍然是最近最少访问的用户1。2.此时,业务方访问用户5,由于哈希链表中没有用户5的数据,我们从数据库中读取出来,插入到缓存当中。

2023-05-18 16:29:22 10877 1

原创 《缓存背后的黑科技:揭秘Redis架构设计与高性能原理》

缓存原指CPU上的一种高速存储器,它先于内存与CPU交换数据,速度很快现在泛指存储在计算机上的原始数据的复制集,便于快速访问。在互联网技术中,缓存是系统快速响应的关键技术之一以空间换时间的一种技术(艺术)

2023-05-18 12:16:01 11183

原创 谷粒学苑-在线教育实战项目-面试总结-简历优化

本系统采用微服务架构设计,是一款基于微信公众号B2C模式的在线学习平台,通过业务划分,设计独立模块的微服务,拆分为会员管理、讲师管理、课程管理、问答管理、广告管理、网站管理、短信管理、邮件管理等服务模块,,该平台包含三大模块∶直播、教学与微信消息服务﹔平台会定期推出直播课程,方便学员与名师之间的交流互动,学员也可以购买教学视频在线学习,分享直播与教学视频获取平台收益,平台支持直播、腾讯云视频点播等一系列功能,为用户构建了一个全方位的在线学习平台。

2022-12-03 17:24:28 239123 11

原创 全网最全-Java简历优化-优质项目经历

该项目要求仿照目前比较流行的“今日头条” app,内容则以技术类文章为主,为终端学习用户提供精准的.感兴趣的技术文章,为技术类的自媒体人提供首运营的平台。该项自运用Spring Boot快速并发框架构建顽自工程,并结合Spring Cloud全家桶技术,实现后端个人中心、自媒体、管理中心等微服务。该项目是一个多平台联合使用工程,本人负责真中文章为主线的核心业务。

2022-10-16 22:54:28 243981 8

原创 全网最全-Java简历优化-专业技能

熟练掌握Java核心知识、JUC、HashMap、斐波那契散列等,具备良好的面向对象编程思想。熟练掌握Java设计模式,如工厂、代理、组合、策略等设计模式,并善用设计原则构建可复用代码。熟练使用 IDEA、Eclipse等编译工具以及 Navicat、PostMan、Git、Maven、SVN等开发工具。

2022-10-15 22:20:44 241276 1

原创 《垃圾回收器:Java虚拟机内存管理的秘密武器》

串行回收器: Serial、Serial old并行回收器: ParNew、Parallel Scavenge、Parallel old并发回收器:CMS、G1。

2022-09-14 08:47:14 10992

原创 《Java虚拟机内幕揭秘:垃圾回收的奇妙世界》

问题:调用System.gc()并不会马上执行垃圾回收操作,为什么上述例子中,每次调用都会有垃圾回收信息输出?是进行了GC吗?

2022-09-14 08:46:04 11003 1

原创 《摆脱垃圾:探究Java虚拟机垃圾回收算法》

为了解决这个问题,即对实时垃圾收集算法的研究直接导致了增量收集(Incremental collecting)算法的诞生。状态下,应用程序所有的线程都会挂起,暂停一切正常的工作,等待垃圾回收的完成。如果一次性将所有的垃圾进行处理,需要造成系统长时间的停顿,那么就可以让垃圾收集线程和应用程序线程交替执行。在HotSpot中,基于分代的概念,Gc所使用的内存回收算法必须结合年轻代和老年代各自的特点。上述现有的算法,在垃圾回收过程中,应用软件将处于一种stop the world的状态。

2022-09-14 08:45:08 10966

原创 《Java垃圾回收机制:从诞生到现在的演进史!》

垃圾回收器可以对年轻代回收,也可以对老年代回收,甚至是全堆和方法区的回收。(img-Lm56TeBi-1663116224159)]自动内存管理机制,将程序员从繁重的内存管理中释放出来,可以。自动内存管理无需开发人员手动参与内存的分配与回收,这样。

2022-09-14 08:44:16 10822

原创 《Java虚拟机内存分配秘籍:StringTable大揭秘!》

string:字符串使用一对""引起来表示。string声明为final的,不可被继承string实现了serializable接口:表示字符串是支持序列化的。实现了Comparable接口:表示string可以比较大小string在jdk8及以前内部定义了final char[ ] value用于存储字符串数据。jdk9时改为byte[ ]string:代表不可变的字符序列。简称:不可变性。当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值。

2022-09-14 08:43:34 10996

原创 《深入Java虚拟机:揭秘执行引擎的奥秘》

执行引擎概述执行引擎是java虚拟机核心的组成部分之一。物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。JVM的主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只是一些能够被JVM所识别的字节码指令、符号表,以及其他辅助信息。

2022-09-14 08:42:17 10996 1

原创 《探秘Java虚拟机:解密直接内存的神秘面纱》

直接内存概述不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。直接内存是在Java堆外的、直接向系统申请的内存区间。来源于NIO,通过存在堆中的DirectByteBuffer操作Native内存通常,访问直接内存的速度会优于Java堆。即读写性能高。因此出于性能考虑,读写频繁的场合可能会考虑使用直接内存。Java的NIO库允许Java程序使用直接内存,用于数据缓冲也可能导致outofMemoryError异常Exception in

2022-09-14 08:42:03 11033

原创 《深入Java虚拟机:解密对象实例化内存布局与访问定位》

测试对象实例化的过程 ① 加载类元信息 - ② 为对象分配内存 - ③ 处理并发问题 - ④ 属性的默认初始化(零值初始化) ⑤ 设置对象头的信息 - ⑥ 属性的显式初始化、代码块中初始化、构造器中初始化 给对象的属性赋值的操作: ① 属性的默认初始化 - ② 显式初始化 / ③ 代码块中初始化 - ④ 构造器中初始

2022-09-13 11:26:36 11096

原创 《Java虚拟机:方法区的黑科技剖析》

方法区的理解- 方法区看作是一块独立于Java堆的内存空间。- 方法区(Method Area)与Java堆一 样, 是各个线程共享的内存区域。- 方法区在JVM启动的时候被创建,并且它的实际的物理内存空间中和Java堆区--样都可以是不连续的。.- 方法区的大小,跟堆空间- -样,可以选择固定大小或者可扩展。- 方法区的大小决定了系统可以保存多少个类,如果系统定义了太多的类,导致方法区溢出,虚拟机同样会抛出内存溢出错误: java. lang. OutOfMemoryError:

2022-09-13 11:23:18 11030

原创 《自由穿梭的Java虚拟机堆内存:一场关于内存管理的盛宴》

一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域。Java堆区在JVM启动的时候即被创建,其空间大小也就确定了。是JVM管理的最大一块内存空间。堆内存的大小是可以调节的。《Java虚拟机规范》规定,堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的。所有的线程共享Java堆,在这里还可以划分线程私有的缓冲区( ThreadLocal Allocation Buffer,TLAB)。

2022-09-13 11:21:25 11082

原创 《深入剖析Java虚拟机本地方法栈:管理本地方法调用的关键》

本地方法栈(Native Method Stack)Java虚拟机栈用于管理Java方法的调用,而本地方法栈用于管理本地方法的调用。- 本地方法栈,也是线程私有的。- 允许被实现成固定或者是可动态扩展的内存大小。(在内存溢出方面是相同的) - 如果线程请求分配的栈容量超过本地方法栈允许的最大容量,Java虚拟机将会抛出一个stackoverflowError异常。 - 如果本地方法栈可以动态扩展,并且在尝试扩展的时候无法申请到足够的内存,或者在创建新的线程时没有足够的内存去

2022-09-13 11:19:19 11057

原创 《穿越程序界的桥梁:Java本地方法接口实战》

什么是本地方法?- 简单地讲,一个Native Method就是一个Java调用非Java代码的接口。一个Native Method是这样一个Java方法:该方法的实现由非Java语言实现,比c。这个特征并非Java所特有,很多其它的编程语言都有这一机制,比如在c++中,你可以用extern "c"告知C++编译器去调用一个c的函数。

2022-09-13 11:17:54 11098

原创 《Java虚拟机:轻便高效的跨平台神器——探秘虚拟机栈》

虚拟机栈出现的背景由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。内存中的栈与堆栈是运行时的单位,堆是存储的单位即:栈解决程序的运行问题,即程序如何执行,或者说如何处理数据。堆解决的是数据存储的问题,即数据怎么放、放在哪儿。

2022-09-13 11:16:13 10741

原创 《程序计数器:指引Java程序的下一步,解锁执行引擎的奥秘》、

JVM中的程序计数寄存器(Program counter Register)中, Register 的命名源于CPU的寄存器,寄存器存储指令相关的现场信息。CPU只有把数据装载到寄存器才能够运行。这里,并非是广义上所指的物理寄存器,或许将其翻译为pc计数器(或指令计数器)会更加贴切(也称为程序钩子),并且也不容易引起一些不必要的误会。它是一块很小的内存空间,几乎可以忽略不记。也是运行速度最快的存储区域。在JVM规范中,每个线程都有它自己的程序计数器,是线程私有的,生命周期与线程的生命周期保持一致。

2022-09-13 11:14:00 11106

原创 《深入探究Java虚拟机:运行时数据区大揭秘》

03_运行时数据区概述及线程;内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行。JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定运行。。结合JVM虚拟机规范,来探讨一下经典的JVM内存布局。

2022-09-13 11:12:48 11122

原创 《探秘Java虚拟机:类加载子系统的神秘世界》

《JVM学习笔记》02_类加载子系统; String类使用引导类加载器进行加载的。

2022-09-13 11:10:20 10776

原创 《Java虚拟机解密:探究JVM与Java体系结构的奥秘》

《深入理解JVM虚拟机》JVM与Java体系结构java字节码,指的是用java语言编译成的字节码。准确的说任何能在jvm平台上执行的字节码格式都是一样的。所以应该统称为:jvm字节码。不同的编译器,可以编译出相同的字节码文件,字节码文件也可以在不同的JVM上运行。Java虚拟机与Java 语言并没有必然的联系,它只与特定的二进制文件格式—class文件格式所关联,class 文件中包含了Java 虚拟机指令集(或者称为字节码、Bytecodes)和符号表,还有一些其他辅助信息。

2022-09-13 10:17:41 11467

原创 shell脚本编程

shell脚本编程作业内容:编写一个shell脚本,实现如下功能:\1. 脚本运行时提供一个显示界面如下:Menu:1) 循环创建5个用户和密码2) 输入成绩3) 计算平均成绩4) 退出\2. 脚本运行后显示界面,循环等待用户输入选择的数字1~4,脚本接收输入数字,选择 功能。创建用户,用户名格式:xxx+软件yyy班,密码是学号创建完后,给出提示“用户已经创建好“,显示界面。循环输入5个用户的成绩,以score.txt保存在用户的家目录/home/用户名下,输入完后给

2021-12-18 20:59:22 1543 1

空空如也

空空如也

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

TA关注的人

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