- 博客(290)
- 收藏
- 关注
原创 如何把 库存扣减、创建订单,拆解成 TCC ?
本文探讨了如何将库存扣减和订单创建操作拆解为TCC(Try-Confirm-Cancel)模式。TCC模式将操作分为三个阶段:Try阶段进行业务检查和资源预留,Confirm阶段提交资源,Cancel阶段释放预留资源。对于库存扣减,Try阶段冻结库存,Confirm阶段解冻并扣减库存,Cancel阶段解冻库存。对于订单创建,Try阶段创建不可见订单,Confirm阶段将订单状态改为待支付,Cancel阶段将订单状态改为废弃。这种模式确保了分布式事务的一致性和可靠性。
2025-05-22 15:20:39
410
原创 分布式事务:什么是 TCC,和 2PC 的区别?
TCC 是 Try-Confirm-Cancel 的缩写,它是一种分布式事务解决方案。采用了基于业务逻辑的补偿机制,将整个分布式事务分解为若干个子事务,每个子事务都有一个try、confirm和cancel三个操作,通过这些操作来实现分布式事务的执行和回滚Try:在try阶段,参与者尝试执行本地事务,并对全局事务预留资源。如果try阶段执行成功,参与者会返回一个成功标识,否则会返回一个失败标识。Confirm:如果,所有参与者的 try 阶段都执行成功。
2025-05-22 11:03:53
249
原创 Java 进程异常终止,原因分析与解决方案
文章探讨了Java进程异常终止的两种主要情况:假死(无响应)和真挂(进程终止)。假死通常由死锁、活锁、I/O阻塞或长GC暂停引起,而真挂则可能由内存溢出、资源耗尽或宿主机故障等原因导致。文章提供了详细的排查流程和工具,如使用jstack检测死锁、jmap分析内存泄漏,以及通过系统监控工具如top和vmstat来监控资源使用情况。此外,文章还强调了快速恢复业务的重要性,并提供了高频命令速查表,帮助开发者快速定位和解决问题。
2025-05-15 23:00:56
281
原创 应用重启后,CPU和Load飙升的问题分析与解决方案
文章分析了应用重启后CPU和Load飙升的问题,指出该现象通常发生在发布后短暂时间内,与流量高峰相关,表现为CPU利用率飙升至70%,Load值达11,导致接口响应时间升高。排查过程包括应用代码、基础设施和JVM参数的检查,最终定位到JIT编译延迟是问题根源。解决方案包括优化JIT编译效率、实施流量控制和调整配置参数,如使用JWarmUp技术预加载机器码和调整JIT编译阈值,以提升启动性能和降低瞬时请求量。
2025-05-15 22:24:03
955
原创 一起来看看,如何使用 jstack 分析死锁?
本文介绍了如何使用jstack工具分析Java程序中的死锁问题。首先,通过一个示例程序展示了死锁的产生:两个线程分别持有并等待对方持有的锁资源,导致程序阻塞。接着,使用jstack工具查看线程堆栈信息,分析出死锁的具体原因:Thread-1持有资源<0x00000007d6aa2ca8>并等待<0x00000007d6aa2c98>,而Thread-0持有<0x00000007d6aa2c98>并等待<0x00000007d6aa2ca8>,形成循环等待。最后
2025-05-15 20:47:16
867
原创 回表导致慢 SQL 问题排查
在排查线上接口调用成功率暴跌问题时,发现一个慢SQL耗时较长,且有时不走索引。通过执行计划分析,发现该SQL虽然命中了索引,但由于索引中未包含sum_payment字段,导致每次查询都需要回表,从而产生高IO消耗。最终解决方案是将sum_payment与byr_id和biz_date组成联合索引,减少回表次数,优化查询性能。
2025-05-15 20:02:22
986
原创 数据库连接池被打满,问题排查
文章探讨了数据库连接池被打满的问题及其解决方案。背景是线上业务频繁出现数据库连接池报错,分析发现是由于大量耗时SQL和乐观锁并发控制导致的锁耗时问题。虽然乐观锁本身不需要加锁,但在高并发更新时,InnoDB的update语句仍需加锁,导致连接资源耗尽。解决方案包括缓存热点数据更新、异步更新策略、数据拆分和合并更新请求。通过对比各方案的优缺点,最终选择了合并更新请求的方案,将并发更新请求批量处理,有效降低了系统压力。文章还提供了相关参考链接,供进一步学习和实践。
2025-05-14 22:45:13
564
原创 RT 飙高问题排查与索引优化实战
文章分享了在IT行业中,面对接口响应时间(RT)飙高问题的排查与索引优化实战经验。背景是数据量从2万条激增至16万条后,接口RT显著增加。通过使用Arthas工具进行排查,发现原有索引区分度不足,导致查询效率低下。具体问题在于新增字段后,索引命中率低,仍需全表扫描大量数据。解决方案是创建新的索引,针对特定字段优化查询效率,从而显著降低接口RT。文章总结了排查方法论,强调了随着系统发展,数据库索引需要不断调整和优化的重要性。
2025-05-14 19:58:49
973
原创 生产环境下,慢 SQL 问题排查
在排查线上定时任务连续失败的问题时,发现一条慢SQL导致性能瓶颈。该SQL用于查询买卖家之间的关联关系,但由于不符合最左前缀匹配原则,导致全索引扫描,执行效率低下。通过分析表的索引结构,发现联合索引的字段顺序不合理。解决方案是增加一个包含subject_id_enum、product_type_enum、buyer_id和seller_id的新索引,或调整SQL查询条件。优化后,SQL执行效率显著提升,定时任务成功执行。
2025-05-14 18:19:42
374
原创 OOM问题排查过程
根据崩溃线程,可以看到程序在不断递归。在递归的过程中,导致内存不足了。也可以用 jmap、jhat 分析。注意 GC 前拉 dump。在做具体算法时,不仅要考虑时间复杂度,还要考虑到空间复杂度。可以看到,一个 LinkedList 占用了73%的内存。发现问题后,及时做线上功能切换、溶断等相关处理。定位到具体问题,就可以做针对性的修改了。GC 耗时和 GC 次数 的监控。某次大促时,线上出现大量报警。
2025-05-14 15:37:56
170
原创 CPU飙高问题排查与优化实践二
在大促前的压测中,接口QPS达到500时,CPU使用率飙升至181%,导致服务响应异常。通过Linux的top命令定位到高CPU占用的进程和线程,并使用jstack命令分析线程栈信息,发现自定义BeanValidator的实例化逻辑重复执行,导致CPU资源浪费。通过修改BeanValidator.java代码,解决了这一问题。此外,还可以使用Alibaba开源的Arthas工具进行更深入的性能分析。本文由10年IT行业经验的老鸟分享,旨在帮助开发者排查和优化CPU飙高问题。
2025-05-14 12:36:39
349
原创 线上CPU飙高问题排查与优化实践(一)
本文分享了线上CPU飙高问题的排查与优化实践。在预发压测中,单机QPS达到200时,CPU利用率飙升至100%,暴露了性能瓶颈。通过使用top命令定位高CPU进程,结合Arthas工具分析调用链,发现TDDL序列生成模块的高频调用是核心问题。进一步排查发现,预发环境误开TDDL日志采集,脱敏框架的正则匹配加剧了CPU消耗。优化措施包括将Sequence实例的生成改为应用启动时初始化,并关闭TDDL日志采集。最终,通过逐层定位根因,解决了CPU飙高问题,提升了系统性能。
2025-05-14 11:38:17
445
原创 支付系统常见问题与解决方案
本文总结了支付系统常见问题及其解决方案,涵盖支付流程、业务一致性、安全与容灾等方面。支付流程核心问题包括支付跳转失败、支付状态未同步和支付页面未跳转,解决方案涉及限流、降级、熔断、定时任务等技术。业务一致性保障主要解决用户重复支付和库存与订单状态不一致问题,采用Token校验、幂等设计、分布式事务等方案。安全与容灾方面,通过加签验签、加密解密、双向认证等措施防护数据篡改,并设计超时关单机制处理未支付订单。架构设计强调容错、一致性和安全基线,建议避免使用MQ实现支付强一致性,优先选择TCC或AT方案。
2025-05-13 22:39:42
428
原创 Redis与MySQL性能对比,及网络耗时分析
本文对比了Redis与MySQL的性能,并分析了网络耗时对两者的影响。Redis作为内存数据库,响应时间P99稳定在1ms以内,显著优于MySQL,主要得益于内存读写的高效性。MySQL的查询耗时通常在200ms到1000ms之间,复杂查询可能更慢,性能受索引命中率、BufferPool命中率等因素影响。网络耗时在整体响应时间中占比30%~50%,包括DNS解析、TCP连接、TLS握手等。典型场景下,局域网RTT在0.1ms~5ms,广域网RTT在1ms~150ms,移动网络RTT在1ms~100ms。文章
2025-05-13 20:48:49
700
原创 频繁Full GC的非常规问题分析笔记
场景关键指标应急措施内存误判jstat老年代使用率明确监控对象内存碎片对象分布G1算法替代CMS元空间溢出限制元空间大小System.gc()触发GC日志中Full GC原因标签禁用显式GC调用核心原则Full GC不仅是内存不足问题,更是内存管理策略与代码行为的结果结合jstatjmap、Arthas实现多维诊断,避免单一视角误判高频 检查命令 速查表# JVM 内存详情# GC统计(每秒输出)# 元空间监控# 内存映射分析(Arthas)!!
2025-05-13 20:29:17
373
原创 布隆过滤器内存估算笔记
布隆过滤器是一种用于高效判断元素是否存在于集合中的数据结构,广泛应用于大数据处理场景。本文探讨了将5亿条数据放入布隆过滤器所需的内存估算方法。核心公式显示,内存占用与元素数量(n)和预期误判率(p)相关。例如,当误判率为0.1%时,约需856MB内存;误判率降低10倍,内存需求增加约1.6倍。应用建议包括明确业务误判率、预留内存缓冲、注意不支持删除操作等。实际应用中,需在误判容忍度与内存成本间权衡,并通过优化哈希函数提升性能。
2025-05-13 19:52:36
373
原创 百万级数据,单表查询优化
在处理百万条数据的单表查询时,优化策略应从前端、Java后台和数据库三个层面进行分层优化。前端优化包括减少数据传输量、分页加载、控制输入框防抖和交互优化,以提升用户体验。Java后台优化涉及分页控制、缓存策略、异步处理和参数校验,以提高处理效率和安全性。数据库优化则强调索引优化、查询改造、分页优化和范式与反范式的平衡,确保查询性能。关键问题包括索引失效、多表JOIN的避免、深度分页处理和避免使用SELECT *。通过这些优化措施,可以显著提升大数据量下的查询效率和系统性能。
2025-05-13 19:33:39
458
原创 分布式定时任务 @Scheduled,并发控制方案
分布式定时任务在集群环境下常面临并发控制问题,Spring Boot默认的@Scheduled机制会导致多节点重复执行任务。本文对比了几种解决方案:XXL-JOB通过数据库悲观锁实现强一致性,但可能影响数据库性能;分布式锁方案如Redis和Zookeeper提供高吞吐和可靠性,但需处理锁续期和网络延迟;框架替代方案如XXL-JOB、Quartz和ElasticJob则自带分布式调度能力。选型建议根据集群规模、一致性要求和性能需求进行选择,并强调任务幂等性设计和性能优化的重要性。云原生趋势下,Kubernet
2025-05-13 14:51:14
432
原创 缓存设计核心要点
设计一个缓存系统时,需综合考虑本地缓存和分布式缓存的设计要点。本地缓存应关注数据结构、线程安全、对象上限、清除策略和过期时间设置,以确保高效性和安全性。分布式缓存如Redis,需考虑持久化机制、集群模式和分布式锁等,以保障数据的高可用性和一致性。缓存清除策略如LRU、LFU和FIFO,以及过期机制如TTL,都是确保缓存有效性的关键。主流缓存框架如Caffeine和Redis各有优势,Caffeine适用于单机高并发场景,而Redis则更适合分布式系统。选型时应根据具体场景和性能需求进行适配,同时考虑性能优化
2025-05-13 10:35:24
955
原创 银行系统垃圾回收器选型笔记
在银行系统中,实时性要求高,选择垃圾回收器时需优先考虑低延迟和短STW(Stop-The-World)时间。根据JDK版本,推荐以下方案:JDK 12及以上可选择Shenandoah或ZGC,提供亚毫秒级停顿;JDK 11至12之间推荐ZGC,停顿时间小于10ms;JDK 7及以上建议使用G1,停顿可控且调优简单;JDK 7以下则采用CMS+ParallelScavenge组合,但需手动优化。避免使用串行收集器,因其STW时间过长。选型时需结合堆内存规模和业务场景,确保系统实时性和稳定性。
2025-05-13 10:14:01
294
原创 百万级数量会员平台,如何实现到期提醒功能?
在百万级会员的用户平台中,实现快到期的会员消息提醒需要综合考虑多个技术模块。首先,通过消息推送表进行幂等控制和失败重试,确保消息的准确性和可靠性。其次,利用SQL查询识别即将到期的用户,并通过分片查询和联合索引优化查询性能。高效推送策略采用异步推送和批量处理,结合消息队列和多线程技术提升吞吐量。防疲劳机制通过Redis防止重复推送,并设置特殊规则如时间限制和渠道限流。异常处理包括失败重试、数据归档和渠道故障切换。最后,通过动态配置、数据分析和兜底策略进一步优化推送效果。这些措施共同确保了消息提醒系统的高效性
2025-05-13 09:54:36
651
原创 压测600没问题,上线后300就扛不住了,可能是什么原因?
文章分析了系统在压测时表现良好(支持600并发),但上线后却无法承受300并发的可能原因。常见问题包括未进行全链路压测、压测环境与生产环境的硬件和网络差异、定时任务干扰、中间件资源争用、慢SQL与数据问题、外部系统依赖、基础设施开销等。此外,冷启动与资源初始化问题也可能导致性能下降。文章提供了相应的解决方案,如实施全链路压测、优化分片策略、异步调用与熔断降级、预热缓存等,并强调了监控与优化的重要性。作者为10年IT行业从业者,持续分享技术干货。
2025-05-13 09:08:55
738
原创 海量数据Top K问题解决方案
在解决从1TB搜索日志中找出搜索量最高的10个关键词的问题时,采用了分治和堆排序的核心思路。首先,通过哈希分片将数据分散到多个文件中,确保相同关键词集中处理。接着,逐一分片统计关键词频率并生成有序中间文件。最后,利用最大堆和最小堆协作,从各分片中提取最大值并维护全局Top10。这一方法有效应对了海量数据处理的挑战,确保了计算的高效性和准确性。
2025-05-12 23:01:45
862
原创 TB级数据排序方案解析
在处理1TB海量数据排序时,仅拥有32GB内存的限制下,外部归并排序提供了一种高效的解决方案。该方法首先将大文件分块,每块在内存中进行局部排序,然后将这些有序块通过多路归并合并成全局有序文件。关键步骤包括数据分片、单块排序和持久化存储,以及通过输入和输出缓冲区进行多路归并。此外,优化建议包括使用SSD硬盘、动态调整缓冲区大小和多线程并行处理,以提升排序效率和性能。这种方法不仅突破了内存限制,还通过分批次归并确保了数据处理的灵活性和效率。
2025-05-12 22:38:47
636
原创 24-如何让团建活动不再“收效甚微”?
文章探讨了团建活动中的三个常见误区:一是认为团建活动万能,但实际上其初衷应清晰,需明确团队、员工或个人需求;二是认为团建活动自然有效,而实际上缺乏设计是效果不佳的主因;三是认为团建活动仅是助理、HR或行政的责任,管理者只需配合,而实际上管理者应以主人翁姿态参与。文章总结提出,团建活动应关注初衷、角色、目标和手段,确保活动能有效提升团队协作默契和文化。此外,文章还提及了IT行业的技术分享,强调持续学习和知识整理的重要性。
2025-05-11 10:16:22
233
原创 22-如何建设团队文化,营造团队氛围?
文章探讨了如何建设团队文化,强调了团队文化对提升效率、创造空间、增强归属感和耐力的重要性。作者指出,团队文化应基于领导者的优秀品质,而非简单模仿他人,且文化价值观的描述应生动易记。建设团队文化的步骤包括:命名文化、主张文化(在公开或私下场合传播)和追求文化(通过管理工作践行)。文章还提醒避免“拿来主义”和过度简练的误区,强调文化应从领导者自身特质中提炼并放大到整个团队。
2025-05-11 10:14:22
327
原创 21-梯队培养:如何物色和培养核心人才?
本文总结了IT行业团队管理中的梯队培养策略,强调了团队耐力和韧劲的重要性。梯队培养包括选拔和培养人才,确保其能力、协作意识和价值观与团队一致。培养过程中,应通过个人发展计划(IDP)对齐期待,提供机会和授权,并建立反馈机制。管理者应避免承诺,以保持灵活性,并通过周期性沟通和第二导师的支持来促进人才成长。本文旨在为IT管理者提供实用的团队建设指导。
2025-05-11 10:12:41
281
原创 20-有什么方法可以有效提升团队凝聚力吗?
本文探讨了如何提升团队凝聚力和协作水平,强调了明确分工和日常协作的重要性。文章提出四大策略:首先,设立共同愿景,确保团队成员有共同的目标;其次,提升员工归属感,通过分配职责和强化团队文化价值观来增强员工的团队认同;再次,加强员工间的相互了解,以增进信任和默契;最后,通过共同面对挑战来加强团队的团结。这些策略有助于管理者有效提升团队凝聚力,促进高效协作。
2025-05-11 10:08:23
367
原创 19-如何兼顾团队分工的稳定性和灵活性?
文章探讨了团队分工与协作的重要性,强调分工是实现规模化、协作和专精的关键手段。有效的分工依赖于管理者的协作水平,常见的分工形式包括矩阵式和BU(业务单元)式。文章还提到虚拟团队的组建原则,如专人专事、目标明确等,以实现高效执行和资源配置。整体而言,文章旨在分享IT行业中的团队管理经验,强调分工与协作的不可分割性,以及如何通过合理的分工提升团队效率。
2025-05-11 10:06:29
257
原创 18-如何提升员工的工作意愿和积极性?
文章探讨了员工激励的有效方法,分为三个主要部分:系统认知、可用资源和实际效果。首先,介绍了马斯洛需求模型和驱动力发展的三个阶段(驱动力1.0、2.0和3.0),强调从基本生存需求到自我实现的转变。其次,讨论了激励资源的匮乏问题,提出结合“驱动力3.0”和“PERMA模型”来丰富激励手段。最后,分析了激励效果不佳的原因,指出激励方案需要系统设计和立体实施,结合外驱与内驱、长期与短期目标,以及个人与团队的使命。文章强调,有效的激励应注重平时积累、精心设计,并与员工的职业幸福感相结合。
2025-05-11 10:04:32
814
原创 17-如何提升员工的个人能力?
本文探讨了如何提升员工个人能力以增强团队整体战斗力。文章首先强调了提升员工能力是提升团队战斗力的基础,并提出了“能力三核”模型,包括人格力量、专业能力和通用能力。接着,文章介绍了“7-2-1”法则,指出70%的能力提升来自工作实践,20%来自相互交流,10%来自自学。为了激发员工的学习动力,文章提出了“推”“拉”“放手”三大策略,即通过施加压力、引导方向和给予自主空间来激励员工学习。最后,文章强调了管理者应关注员工能力的差异性,相信团队能力的系统性,并通过定义员工能力、设计可行方法和激发学习动力来提升个人能
2025-05-11 10:02:21
595
原创 16-团队建设全要素剖析
本文深入探讨了团队建设的全要素,从个体、团队之间到团队整体三个层面进行了详细剖析。管理者在日常工作中需关注“管理规划”、“团队建设”和“任务管理”,即“看方向”、“带人”和“做事”。针对个体,重点在于提升员工的工作能力和激励其工作意愿;团队之间则需注重分工与协作,确保节奏和默契;团队整体则需关注耐力和可持续性,建立梯队和文化,以增强团队的战斗力和认同感。总结团队建设的六个关键要素:能力、激励、分工、协作、梯队和文化。本文为IT行业从业者提供了宝贵的团队管理经验,值得点赞、关注和收藏。
2025-05-11 09:51:28
217
原创 15-要素 4:我都要申请哪些资源呢?
本文分享了一位拥有10年IT行业经验的老鸟对于资源管理和战略规划的心得。文章强调了在资源管理中,除了传统的人、财、物外,时间、信息和权限也是关键要素。在处理人力资源短缺时,作者提倡多样化的解决手段,如自学、招聘、借调、跨部门合作、外包、云服务采购等,而不仅仅依赖招聘。此外,文章指出管理者应从战略视角出发,合理分配资源以实现目标。总结中,作者强调了战略规划的重要性,即如何有效投资资源以达成预期成果。
2025-05-11 09:49:08
293
原创 14-要素 3:如何来规划团队的组织结构呢?
本文探讨了团队规划的三大视角:团队目标、资源和人才培养。首先,团队目标包括规模、分工和梯队的设定;其次,从资源角度审视团队需考虑成本意识,合理预算人力并参照行业资源配比;最后,人才培养需关注梯队规划,提供平台和支持,并考虑团队消化能力。文章还提供了团队规划报告的参照版,包括组织结构图、资源盘点和重点培养对象的列出。作者为10年IT行业资深人士,持续分享IT干货。
2025-05-11 09:47:02
223
原创 13-要素 2:如何为团队设定合理的目标呢?
可达性原则: 目标是设定给团队的,而不是设定给上级的,其目的是为了让团队集中资源做出有效的成绩。“业务目标”来自外部要求相对应,“专业目标”来自你团队的内在要求。内在的专业目标属于重要的事情;而外部压过来的目标,属于紧急的事情。从上级的角度来讲,你的团队需要保证哪几项重要的结果。,即使你之前没做过目标管理,你也可以实际操作了。明确的目标可以让你把资源投注在有效的方向上,目标设定的原则,即 “SMART” 原则。专业目标,就是为团队树立明确的内在追求。什么样的目标才是合理的目标呢?,即,你们希望收获的东西。
2025-05-11 09:43:36
656
原创 12-要素1:如何界定我团队是干什么的呢?
本文探讨了如何明确团队职能定位,提出了“12-要素1:明确职能”的方法和步骤。首先,团队职能分为基本职责和升华使命两个层次,基本职责确保团队生存,而使命则追求团队幸福。明确职能的步骤包括:一、收集信息,通过向上、向下及横向沟通了解上级期待、团队业务理解及职能边界;二、提炼和升华,基于上级要求和业务核心价值提炼职责,结合行业趋势升华使命,并确定衡量维度;三、确认和主张,与上级确认后向团队内外主张职能定位。本文旨在帮助团队明确职能,提升价值。
2025-05-11 09:40:42
340
原创 11-管理规划的四要素
本文分享了管理规划的四个关键要素:职能、目标、团队和路径。首先,职能明确了团队的职责和任务;其次,目标设定了团队期望达成的成果;第三,团队强调了成员的构成和能力;最后,路径规划了实现目标所需的资源投入。这四个要素相互关联,动态平衡,其中职能作为管理的起点最为稳定。文章旨在帮助IT从业者更好地进行团队管理和规划,适用于技术人员和管理者参考。
2025-05-11 09:38:30
144
原创 21-Java并发类库提供的线程池有哪几种?分别有什么特点?
文章主要介绍了Java并发类库中提供的五种线程池及其特点,包括newCachedThreadPool()、newFixedThreadPool(int nThreads)、newSingleThreadExecutor()、newSingleThreadScheduledExecutor()、newScheduledThreadPool(int corePoolSize)和newWorkStealingPool(int parallelism)。每种线程池适用于不同的场景,如处理大量短时间任务、固定线程数执
2025-05-09 20:35:42
765
原创 20-ConcurrentLinkedQueue vs LinkedBlockingQueue 的区别?
本文对比了Java并发包中的ConcurrentLinkedQueue和LinkedBlockingQueue,分析了它们的区别、实现机制及适用场景。ConcurrentLinkedQueue基于无锁算法(lock-free),适用于高吞吐量场景,但遍历一致性较弱,且读取性能不确定。LinkedBlockingQueue基于锁机制,支持阻塞操作,适合需要等待的场景。文章还讨论了有界和无界队列的区别,如ArrayBlockingQueue和LinkedBlockingQueue的锁实现,ArrayBlocki
2025-05-09 20:32:46
679
原创 19 | Java 并发包提供了哪些并发工具类?
Java并发包(java.util.concurrent)提供了多种并发工具类,旨在提升多线程程序的性能和扩展能力。主要工具类包括: 同步结构:如CountDownLatch(用于线程等待事件完成)、CyclicBarrier(允许多个线程在屏障处等待)和Semaphore(控制资源访问权限)。 线程安全容器:如ConcurrentHashMap、ConcurrentSkipListMap和CopyOnWriteArrayList,适用于高并发场景。 并发队列:如ArrayBlockingQueue、Syn
2025-05-09 20:30:37
992
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人