自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(44)
  • 收藏
  • 关注

原创 阿里巴巴开发手册为何禁止三表JOIN?

摘要 阿里巴巴开发手册禁止三表JOIN操作,这源于在分布式架构下的性能考量。多表JOIN在MySQL中会导致优化器效率下降、执行计划失控,时间复杂度可能呈指数级增长。在分库分表环境下,跨分片JOIN还会引发网络传输爆炸、事务一致性等问题。阿里推荐三种替代方案:1)将JOIN拆分为多次单表查询并在应用层内存合并;2)采用反范式设计冗余关键字段;3)使用异步物化视图预计算结果。仅在使用NewSQL数据库或OLAP场景等特殊情况下可考虑打破此禁令。这一规范是阿里在亿级流量场景下通过实践总结的性能优化经验。

2025-07-17 09:00:00 224

原创 volatile 你真的懂了吗?

Java volatile关键字是轻量级线程同步机制,通过内存屏障和缓存一致性协议保证可见性和有序性,但不保证原子性。本文深入剖析了volatile的实现原理、适用场景(状态标志、DCL单例模式等)和常见误区,对比了volatile与synchronized的特性差异,并给出最佳实践建议。volatile在多线程环境下能高效实现变量可见性,但复合操作仍需配合原子类或锁使用。正确理解volatile的内存语义对构建线程安全程序至关重要。

2025-07-16 14:47:35 536

原创 深入理解JVM

摘要:本文深入解析JVM核心机制,涵盖内存模型、垃圾回收与性能调优实战。重点介绍JDK 17内存结构(堆、元空间、线程私有区域)及主流垃圾收集器(ZGC、Shenandoah、G1)的性能对比。详细阐述类加载流程与双亲委派模型,并给出内存泄漏检测与调优方案,包括命令行工具(jstat/jmap/jstack)和MAT分析等实战技巧,帮助开发者优化JVM性能。

2025-07-16 14:07:30 674

原创 Kafka 4.0 技术深度解析

Kafka 4.0技术解析:告别ZooKeeper,拥抱新架构时代 Apache Kafka 4.0标志着该分布式流处理平台的重大变革,通过KRaft模式完全摆脱了ZooKeeper依赖,同时引入KIP-848消费者重平衡协议和KIP-932共享组队列功能。KRaft模式将元数据管理内置化,使用Raft协议实现控制器选举,显著提升了性能和扩展性。KIP-848解决了传统重平衡的"Stop-the-World"问题,将万级消费者组的重平衡时间从60秒降至1秒以内。KIP-932则突破了消费

2025-07-15 16:27:25 833

原创 学了这个,再也不怕RocketMQ消息丢失了

Apache RocketMQ消息零丢失保障方案 摘要:本文详细分析了RocketMQ在消息生产、存储和消费全链路中的潜在丢失风险,并提出针对性解决方案。生产者端推荐使用同步发送配合重试机制,关键业务采用事务消息;Broker存储建议配置同步刷盘(SYNC_FLUSH)和同步主从复制(SYNC_MASTER),4.5+版本可使用Dledger模式实现自动容灾;消费者应关闭自动提交,正确处理消费失败。通过多层次的可靠性机制组合,可以实现金融级消息零丢失保障。

2025-07-15 09:00:00 392

原创 并发编程之- Atomic

Atomic类通过CAS机制实现无锁并发编程,解决了多线程环境下的原子性问题。它包含基本类型、数组、引用、字段更新和累加器等五大类,相比传统锁机制具有更细粒度的并发控制和更低的开销。虽然CAS存在ABA问题和自旋开销等局限性,但可通过版本号标记和分段累加优化。Atomic类为高并发场景提供了高效的线程安全解决方案,是Java并发编程的重要工具。

2025-07-14 15:47:37 841

原创 MongoDB从入门到精通

MongoDB作为现代数据库领导者,以其灵活文档模型和分布式架构赋能企业高效开发。文章从三大维度解析其核心技术:1)数据模型采用BSON格式,支持动态扩展和模式验证,通过嵌入或引用处理数据关系;2)聚合管道实现复杂分析,案例演示电商销售统计;3)分布式架构通过复制集保障高可用,分片集群实现横向扩展。实践表明,MongoDB可提升开发效率3-5倍,典型场景如医疗企业将报告生成时间从12周缩短至10分钟。文中结合代码示例和可视化图表,指导文档设计、聚合优化和集群部署的最佳实践。

2025-07-14 13:51:05 966

原创 秒杀系统该怎么设计?

秒杀系统是应对高并发抢购场景的技术解决方案,面临读多写少、瞬时流量洪峰、数据一致性等核心挑战。主流架构采用分层拦截的"漏斗模型",包括客户端静态资源缓存、接入层限流、应用层隔离、Redis集群原子扣减库存、消息队列异步处理等关键技术。淘宝通过答题机制实现流量削峰,京东采用库存分段降低并发竞争。典型优化后系统可支撑60万QPS,缓存命中率达99.9%。秒杀设计已成为分布式系统的重要实践,其方法论也适用于其他高并发场景。

2025-07-11 14:30:52 443

原创 分布式链路追踪之SkyWalking详解

Apache SkyWalking是一款专为微服务、云原生设计的分布式APM工具,提供分布式追踪、服务拓扑分析和性能监控一体化方案。其核心优势包括无侵入式探针采集、多语言支持和低资源消耗。最新v10.2.0版本采用原生数据库BanyanDB,显著提升性能,并优化了Java虚拟线程支持。架构包含Agent、OAP Server、存储和UI四大模块,支持灵活扩展。相比Zipkin、Jaeger等工具,SkyWalking在代码侵入性、数据可视化和微服务支持方面更具优势。通过Docker快速部署即可实现全链路监控

2025-07-11 09:00:00 827

原创 一文带你了解分布式事务

本文深入解析分布式事务技术,从理论基础到实践应用。首先介绍CAP定理和BASE理论,对比不同事务模型的特性。重点剖析2PC/3PC、TCC和SAGA等主流解决方案的核心原理与实现方式,并对比Seata和Hmily两大开源框架的架构特点与适用场景。通过电商订单和金融转账的实战案例,展示生产环境的最佳实践,包括性能优化、高可用部署和异常处理方案。最后展望分布式事务的未来发展方向,提供选型建议,帮助开发者构建可靠的分布式系统。全文兼顾理论深度与实践价值,为处理微服务架构中的数据一致性问题提供全面指导。

2025-07-10 13:58:13 484

原创 工作5年了,执行计划都看不懂,还说自己会优化sql?

MySQL EXPLAIN命令详解与查询优化指南 本文深入解析MySQL的EXPLAIN命令,帮助开发者优化SQL查询性能。主要内容包括: EXPLAIN基础用法:介绍如何通过EXPLAIN获取执行计划,并详细解读12个关键输出字段的含义,特别是type字段(访问类型)和Extra字段(额外执行信息)的性能指标意义。 实战案例:通过单表查询和多表关联的示例,演示如何分析执行计划,包括: 有效使用联合索引的情况 索引失效的常见原因(如函数操作) 嵌套循环连接的执行过程 优化建议:针对不同场景提供具体的优化方案

2025-07-10 09:30:00 884

原创 MySQL索引深度解析

MySQL索引深度解析:从B+树原理到实战优化 本文深入剖析MySQL索引机制,揭示B+树为何成为索引首选数据结构,对比InnoDB与MyISAM存储引擎的索引实现差异。文章详细讲解聚簇索引、联合索引等核心概念,通过10个典型场景分析最左前缀原则的应用,列举索引失效常见原因及规避方法。重点涵盖:索引底层设计如何优化磁盘IO、不同类型索引的适用场景、覆盖索引的高效实现原理,以及实际查询中的索引优化策略。通过电商平台案例,展示合理索引设计对系统性能的关键影响,为数据库性能调优提供全面指导。

2025-07-09 13:46:41 875

原创 常用设计模式详解

本文详细解析了软件开发中常用的设计模式,重点介绍了创建型模式中的单例模式和工厂模式。单例模式通过五种实现方式(饿汉式、懒汉式、双重检查锁、静态内部类、枚举)确保类仅有一个实例,并分析了Spring框架中单例实现的三级缓存机制。工厂模式则通过示例代码展示了工厂方法模式的应用,并说明Spring的IoC容器如何基于工厂模式构建Bean管理体系。文章还涉及这些模式在主流框架如Spring中的实际应用场景,为开发者提供从理论到实践的完整指导。

2025-07-09 09:30:00 2414

原创 XXL-JOB从入门到精通

《XXL-JOB:分布式任务调度的核心机制与实战应用》 XXL-JOB是一款轻量级分布式任务调度平台,采用中心化调度设计,分为调度中心和执行器两大组件,实现任务调度与执行的解耦。其核心优势包括高可用集群部署、10种路由策略、多种任务模式和完善监控体系。技术实现上采用类时间轮机制进行秒级调度,通过60槽位的环形数组高效管理任务。在分布式场景下提供一致性Hash等路由策略和任务分片机制,支持百万级数据处理。系统还内置失败重试、故障转移等容错机制保障可靠性。通过实际金融案例展示了XXL-JOB在数据批处理中的卓越

2025-07-08 13:34:28 1086 1

原创 一文带你了解 Java 21

Java 21 作为长期支持版本,带来了15项重要革新,包括虚拟线程、记录模式等核心特性。虚拟线程实现了M:N映射,支持百万级并发且内存占用极低;记录模式简化了嵌套对象访问;序列集合统一了有序集合操作;分代ZGC提升了垃圾回收效率;字符串模板优化了拼接操作;结构化并发改善了任务管理。这些改进显著提升了Java在并发编程、代码简洁性和性能方面的表现,为开发者提供了更高效的开发体验。

2025-07-08 10:18:10 969

原创 Arthas从入门到精通

本文全面介绍了阿里巴巴开源Java诊断工具Arthas的核心功能与实战应用,旨在帮助开发者快速掌握线上问题排查与性能优化技巧。核心内容包括:入门指南:覆盖多平台安装步骤(Linux/Windows/Mac)、启动流程及首个命令(如dashboard实时监控面板),零基础即可上手。核心功能:详解线程分析(thread)、方法追踪(watch/trace)、JVM监控(jvm)、热更新(redefine)等18+诊断命令,结合参数示例说明适用场景。实战案例:通过CPU飙高定位、死锁排查、内存泄漏分析

2025-07-07 14:01:47 833

原创 工作5年天天crud,mysql中的锁都不知道?

MySQL锁机制是保障数据一致性与并发性能的核心技术。本文深入解析了MySQL锁的分类、特性及优化策略: 锁分类:按粒度分为全局锁、表锁和行锁;按模式分为共享锁、排他锁和意向锁;InnoDB特有记录锁、间隙锁和临键锁。 锁兼容性:不同锁之间存在兼容矩阵,隔离级别直接影响锁行为(如RR级别使用临键锁防幻读)。 死锁处理:InnoDB自动检测并回滚死锁事务,可通过固定访问顺序、缩小事务范围预防。 MySQL 8.0特性:NOWAIT立即报错、SKIP LOCKED跳过锁定行,优化高并发场景。 优化实践:索引避免

2025-07-07 10:19:45 862

原创 JMeter从入门到精通

JMeter作为开源性能测试工具,凭借其灵活性和扩展性,广泛应用于接口测试、负载测试、压力测试等场景。本文从简介、下载安装到核心使用、高级功能进行了详细说明,涵盖了从入门到进阶的关键知识点。通过实际操作和参数调优,可有效模拟真实用户行为,评估系统性能瓶颈,为系统优化提供数据支持。下一步学习建议:探索JMeter脚本录制、数据库测试(JDBC)、自定义插件开发,结合CI/CD工具(如Jenkins)实现自动化测试。

2025-07-04 16:24:03 724

原创 一文带你读懂AQS

AQS(AbstractQueuedSynchronizer)是Java并发编程的核心框架,提供了一套通用的线程同步机制。它通过原子状态变量(state)和CLH队列实现资源管理,支持独占(如ReentrantLock)和共享(如Semaphore)两种模式。AQS采用模板方法模式,将线程排队、阻塞/唤醒等通用逻辑封装,具体资源获取/释放由子类实现。源码分析显示其核心流程包括:获取资源时先尝试快速获取,失败则进入队列自旋等待;释放资源时唤醒后续节点。AQS还通过ConditionObject实现条件等待机制

2025-07-04 10:22:05 1004

原创 并发编程之Semaphore详解

Java并发编程利器:Semaphore源码解析摘要 Semaphore是Java并发包中的重要工具类,用于控制多线程环境下资源访问的并发数量。本文深入分析了Semaphore的源码实现和工作原理。Semaphore通过内部Sync类继承AQS实现,支持公平与非公平两种模式。acquire()方法获取许可证时会减少可用数量,release()方法释放许可证则会增加可用数量并唤醒等待线程。典型应用场景包括资源池限流(如数据库连接池)、系统限流等。文章通过会议室使用示例展示了Semaphore的基本用法,并解析

2025-07-03 16:13:51 692

原创 并发编程之 CyclicBarrier 详解

本文深入分析了Java并发工具类CyclicBarrier的实现原理及应用。CyclicBarrier允许线程在特定屏障点同步等待,当所有线程到达后继续执行。文章首先介绍了其基本概念、构造方法和核心API,通过示例展示了其使用方式。随后重点解析了源码实现,包括内部成员变量(ReentrantLock、Condition等)、构造方法和核心await/dowait方法的工作原理。CyclicBarrier通过计数器机制和代(generation)概念实现线程同步,支持超时等待和屏障重置功能。该工具类适用于需要

2025-07-03 16:11:59 725

原创 多线程之CountDownLatch详解

摘要:Java并发工具类CountDownLatch通过内部计数器机制实现线程同步,允许一个或多个线程等待其他线程完成操作。其核心方法包括await()和countDown(),底层基于AQS框架实现。典型应用场景包括主线程等待子线程完成任务、并行任务协调等。CountDownLatch初始化时设置计数器值,每次countDown()调用递减计数器,当计数器归零时唤醒所有等待线程。源码分析表明其通过CAS操作确保线程安全,并提供超时等待机制增强灵活性。

2025-07-02 14:41:32 635

原创 一文带你了解 Redis

Redis(Remote Dictionary Server),即远程字典服务,是一款由Salvatore Sanfilippo最初使用ANSI C编写的开源、高性能的键值对存储数据库。它以其卓越的性能、丰富的数据类型和多样的功能,在软件开发和数据存储领域占据了重要地位。Redis以其出色的性能、丰富的数据类型和多样的集群模式,成为了现代软件开发中不可或缺的工具。通过深入了解Redis的数据结构底层原理、快速的原因以及集群模式,我们可以更好地利用Redis的优势,解决各种实际问题。

2025-07-02 10:42:25 867

原创 MCP Java SDK源码分析

MCP Java SDK为AI应用提供标准化接口,使大型语言模型能够安全调用外部工具和资源。该SDK采用分层架构设计,包含客户端/服务器层、会话层和传输层,支持同步和异步通信。核心功能包括工具动态注册、资源URI管理、提示词处理和多传输协议实现。通过分析McpClient和McpServer源码可见,其采用建造者模式提供流式API,实现了协议版本协商、功能配置等关键机制,为Java开发者构建AI应用提供了高效解决方案。

2025-07-01 16:25:26 1174

原创 一文带你搞懂 Spring AI Alibaba

Spring AI Alibaba 是一款以 Spring AI 为基础的 AI 框架,它深度集成百炼平台,支持 ChatBot、工作流、多智能体应用开发模式。该框架在 1.0 GA 版本中,为开发者提供了一系列核心能力,助力其快速构建各类 AI 应用。

2025-07-01 11:11:23 981

原创 工作5年了,redo Log、undo Log、MVCC 和binlog都不知道?

本文深入解析了数据库核心日志技术:redo log用于崩溃恢复和事务持久性,采用预写日志技术;undo log记录事务修改前数据,支持回滚和MVCC;MVCC通过多版本数据实现高并发读写;binlog记录所有数据修改,用于主从复制和数据恢复。这些技术协同工作,共同保障数据库的高效稳定运行、事务一致性和数据可靠性。理解它们的原理和调用流程对数据库优化和维护至关重要。

2025-06-30 13:47:34 918

原创 学了binlog,程序员删库后再也不用跑路了

讲解了使用binlog恢复mysql被删除的数据

2025-06-30 11:11:24 893

原创 线上问题之-OOM排查记

本文讲述了Java线上OOM(内存溢出)的排查与解决方法。通过一个互联网公司的项目案例,分析了三种常见的OOM类型(堆内存、栈内存、方法区溢出)及其代码示例。介绍了使用MAT工具分析堆转储文件的步骤,包括直方图视图、支配树视图和线程视图的分析方法。最后给出了避免OOM的实用建议:合理配置JVM参数、优化代码逻辑、选择合适垃圾回收器以及持续监控调优。全文以故事形式呈现,生动展现了OOM问题的排查全过程,为开发者提供了有价值的参考方案。

2025-06-27 14:51:56 674

原创 线上问题之- CPU飙高排查记

摘要 线上Java应用CPU飙高至100%,导致系统卡顿。排查过程:首先通过top命令定位高CPU进程,再用top -H查看线程占用情况,最后用jstack分析线程堆栈。发现四个主要问题:1)代码中存在无限循环;2)线程池未限制最大线程数;3)频繁创建临时对象引发GC;4)数据库未加索引的慢查询。解决方案包括:添加循环终止条件、改用固定大小线程池、优化对象创建、添加数据库索引。建议预防措施:代码审查、性能测试、监控预警、JVM调优、异步处理等。

2025-06-27 14:04:54 827

原创 分库分表之-带你一步一步了解MyCAT

MyCAT是一个开源的数据库中间件,基于阿里Cobar研发,支持分库分表、读写分离、负载均衡等功能。其分层架构包括客户端交互层、路由与执行层等,通过解析SQL路由请求到后端数据库,并处理结果返回给用户。Java应用可以像连接普通MySQL一样使用MyCAT,只需修改连接配置即可。MyCAT解决了大数据量下的性能瓶颈问题,提供数据分片、高可用性、跨库查询和数据库透明性等能力,使应用程序无需关心后端数据库的复杂细节,专注于业务逻辑开发。

2025-06-26 17:04:15 635

原创 分库分表之-ShardingJDBC技术详解

ShardingJDBC是一款轻量级分布式数据库中间件,以JDBC驱动形式提供分库分表功能。摘要其核心原理包括SQL解析、路由、改写、执行和结果归并五个步骤,通过客户端直连方式实现对MySQL等数据库的水平扩展。文章详细展示了ShardingJDBC架构图、Java配置示例代码及其解决的问题(存储瓶颈、性能下降等),并与MyCAT等替代方案对比,突出其无需独立部署、兼容性强等优势。该技术适合基于JDBC的ORM框架,支持多种连接池,有效提升数据库扩展性和性能。

2025-06-26 16:57:08 753

原创 Docker 到底是个什么?

Docker技术解析与实用指南 Docker已成为现代软件开发和运维的核心工具,以其轻量化和高效性著称。本文提供从安装到应用的全面指导: 安装指南:详细说明Windows、macOS和Linux(Ubuntu)系统的Docker安装步骤,包括必要配置和验证方法。 核心原理:解析Docker架构的三大组件(引擎、镜像、容器),以及底层技术(cgroups和namespaces)如何实现资源隔离。 实用命令:分类整理镜像管理(搜索/拉取/删除)和容器操作(启动/停止/进入)的常用命令,每个命令附有具体示例。 优

2025-06-25 14:51:51 414

原创 Langchain4j真有那么强大吗?

Langchain4j的调用流程主要涉及与LLM的交互,包括请求的构建、发送,以及响应的接收和处理。在实际应用中,开发者可以通过定义接口和使用注解的方式,将复杂的调用逻辑封装起来,实现与LLM的高效交互。Langchain4j为Java开发者提供了一个强大而便捷的方式来集成大型语言模型。通过其统一的API、丰富的工具链和模块化的架构,开发者可以快速构建各种基于LLM的应用程序。同时,其丰富的代码示例和详细的文档也有助于开发者快速上手和深入理解。

2025-06-25 14:17:17 812

原创 Spring AI + MCP深度解析与应用探索

摘要 Spring AI与MCP技术深度解析:本文系统介绍了Java生态中的AI开发框架Spring AI及其核心概念(模型、提示、嵌入等),重点分析了其主要功能模块(模型集成、向量数据库、文档处理等)和技术优势。同时探讨了MCP(模型上下文协议)作为AI交互新范式的核心价值,包括标准化交互、自动化工作流等特性,以及其客户端-服务器架构的工作原理。文章为Java开发者提供了AI技术在Java生态中的创新应用方案,揭示了两种技术深度融合带来的开发效率提升和应用场景拓展。

2025-06-24 16:28:38 1682

原创 Elasticsearch从入门到精通

本文将介绍Java方向与Elasticsearch(ES)的集成应用。ES是一款分布式搜索分析引擎,具有实时搜索、高性能等特点。文章首先概述ES核心概念如文档、索引、分片等,然后详细讲解Java客户端API的两种类型(低级和高级REST客户端),以及通过Maven添加依赖和配置连接的具体步骤。接着提供了Java操作ES的代码示例,包括创建索引、插入数据和查询数据的关键API使用。全文旨在帮助Java开发者快速掌握ES集成与应用技术。

2025-06-24 14:50:33 1297

原创 阿里二面3道算法题

阿里二面3道算法题今天在一个学习群里看到一个小伙伴去面试了阿里本地生活,二面有4道算法编程题,我们一起来看下难度,我就纳闷了,明明有算法岗,还要求我们这些码农会算法干啥子。毕竟术业有专攻,这是人家的饭碗1分割平衡字符串题目描述在一个「平衡字符串」中,‘L’ 和 ‘R’ 字符的数量是相同的。给出一个平衡字符串 s,请你将它分割成尽可能多的平衡字符串。返回可以通过分割得到的平衡字符串的最大数量。示例 1:输入:s = “RLRRLLRLRL”输出:4解释:s 可以分割为 “RL”, “RRL

2021-12-21 19:47:24 681

原创 记录一次java.sql.SQLException: Column count doesn‘t match value count 排查的经过

记录一次java.sql.SQLException: Column count doesn’t match value count 排查的经过数据库是OceanBase框架是Mybaties插入的sql 由于公司代码需要保密,不方便截图,这里是伪代码insert user(name,age,sex,personno)values(‘张三’,16,‘男’,410522200506303214);id是自增主键 ,所以插入的列里没有id字段,分了10个库10表{000-090:10}分库分表

2021-09-28 17:16:51 550

原创 面试被问到缓存和数据库双写一致性,我这个答案只能88分?

缓存和数据库如何保证一致性目前在职,不方便请假去面试,就和一个闪电快车的HR约了周六去面试,这天我准时的来到他们公司的楼下,地铁北苑路北站,地铁口3百米很近,然后给HR打电话,问是那栋楼,发现和BOSS上的地址不一样,问了之后才知道原来这个楼有2个名字,我就胆战心惊的上去了。一面30分钟,一些八股文,巴拉巴拉的说完了,说让我等下,我窃喜:这就完事儿了?这也太简单了。过了5分钟,一个发际线很高的中年男人来了,穿着一双老年拖鞋,衣衫不整,感觉很邋遢的样子,让我做下自我介绍,然后告诉我他是二面的面试官,我瞬间

2021-08-31 17:35:59 398 2

原创 工作5年了,竟然不知道什么是幂等?

工作5年了,竟然不知道什么是幂等?在一个学习群里,有一个小伙伴说他面试了一位自称是工作5年的java开发,对方连幂等都没听说过?让人感到惊奇,5年啊,难道天天就是CRUD?写代码都不考虑幂等?接下来我们来说下互联网公司接口如何设计接口设计的时候一定要考虑到的几点,不然你会死的很惨,比如转账不考虑幂等,转了多笔,造成资损,轻则走人,严重的还要赔钱的1.数据的校验常规性校验:包括必填字段校验,长度校验,类型校验,格式校验等;业务校验:根据实际业务而定,比如转账接口,转账金额不能小于0;2.保障幂等

2021-08-26 18:19:09 274

原创 一次洗脚引发的线程池思考

一次洗脚引发的线程池思考上周末和好朋友大凯子约好周末去洗脚放松一下,毕竟忙了一周了,又加了几天班,身心疲惫,好的身体是革命的本钱,男人可得好好爱惜自己的身体,不能倒在革命的道路上,于是第二天大凯子早早的就来找我,说他找到了一家计师很不错的足浴馆,里面的计师身材很棒,颜值很高,肤白貌美大长腿,重要的是按摩的技术在大众点评上获得客户的一致好评,我被他说的深深的诱惑住了,说走就走,坐着5站地铁,不行6百米就来到了他说的这家足浴馆,由于这家店口碑特别好,也不支持线上预约,里面也是人满为患,得排队,我问大凯子要不要

2021-08-25 14:55:24 297 2

空空如也

空空如也

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

TA关注的人

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