youthlql的博客

主要是Java技术栈的博客,比如JVM原理,JVM调优,容器源码,并发原理,JUC源码,Mysql原理(事务,锁,索引),Mysql优化,Netty,Dubbo源码,计算机网络,操作系统,缓存,MQ,分布式等等 作者: youthlql 链接: htt
私信 关注
youthlql
码龄1年

主要是Java技术栈的博客,比如JVM原理,JVM调优,容器源码,并发原理,JUC源码,Mysql原理(事务,锁,索引),Mysql优化,Netty,Dubbo源码,计算机网络,操作系统,缓存,MQ,分布式等等。

  • 8,735
    被访问量
  • 35
    原创文章
  • 222,036
    作者排名
  • 25
    粉丝数量
  • 于 2019-09-22 加入CSDN
获得成就
  • 获得10次点赞
  • 内容获得9次评论
  • 获得55次收藏
荣誉勋章
兴趣领域
  • #后端
    #Spring#Linux#Redis#Spring Boot#架构#MySQL#Java#分布式#Elasticsearch
TA的专栏
  • 杂文
    6篇
  • 水文
  • SpringCloudAlibaba
  • 操作系统
  • 面试系列
  • JVM
    12篇
  • 计算机网络
    1篇
  • Linux相关
    1篇
  • Spring相关
  • Java并发
    7篇
  • Redis
  • RocketMQ
  • Elasticsearch
    4篇
  • Mysql
  • Springboot
  • Java基础
    4篇
  • RPC
  • 随笔
    1篇
  • 最近
  • 文章
  • 资源
  • 问答
  • 课程
  • 帖子
  • 收藏
  • 关注/订阅

杂文系列4

分类专栏不够用了,搞了4篇文章加分偶遇也算有缘,夜深雪大无事可做,我同老爷子凑着一堆火边烤边聊,话匣子一开便合不拢,听他唠唠叨叨多半个时辰,从前事讲了个底儿掉。讲他小时候何等贪玩,一听见盘铃声就收不住脚,知道是演牵丝傀儡的卖艺人来了,就奔着那小戏台子去,给三尺红绵台毯上木偶来来往往演出的傀儡戏勾了魂儿,一高兴,干脆学起了傀儡戏。家里打也打了骂也骂了,见是真止不了,也只好由得他去。就这么入了行,也演了一辈子。  漂泊过多少山水,卖艺的到底都是卖艺的,除了年轻时一股逍遥浪荡的劲儿,还能剩下什么呢?没个家.
原创
27阅读
0评论
0点赞
发布博客于 2 月前

杂文系列3

分类专栏不够用了,搞了4篇文章加分这样的故事,理应埋在心里,葬下就不再提起。  打小儿我就能看见些不同寻常的东西,旁人看不见的,见识这故事时就是这样,只不过那时我还年轻——年轻到了,一切的一切都可以并不当作一回事。见鬼见神也好,独自出游也好,那时候觉得都没什么要紧,所以就这么给阻在了路上,好歹算有座破庙能挡一挡风雪。  我就是在那个大风雪的夜里,在那座庙里,遇见了他们。演傀儡戏的老人,和他的木偶。那是一种很奇怪的感觉。老爷子破衣烂衫,年纪足够半截身子入土,随身没半点值钱玩意儿,除了那木偶——那木偶.
原创
56阅读
4评论
0点赞
发布博客于 2 月前

杂文系列2

分类专栏不够用了,搞了4篇文章加分。余少能视鬼,尝于雪夜野寺逢一提傀儡翁,鹤发褴褛,唯持一木偶制作极精,宛如娇女,绘珠泪盈睫,惹人见怜。 时云彤雪狂,二人比肩向火,翁自述曰:少时好观牵丝戏,耽于盘铃傀儡之技,既年长,其志愈坚,遂以此为业,以物象人自得其乐。奈何漂泊终生,居无所行无侣,所伴唯一傀儡木偶。 翁且言且泣,余温言释之,恳其奏盘铃乐,作牵丝傀儡戏,演剧于三尺红绵之上,度曲咿嘤,木偶顾盼神飞,虽妆绘悲容而婉媚绝伦。曲终,翁抱持木偶,稍作欢容,俄顷恨怒,曰:平生落魄,皆傀儡误之,天寒,冬衣难置,一贫.
原创
24阅读
0评论
0点赞
发布博客于 2 月前

杂文系列1

分类专栏不够用了,搞了4篇文章加分,
原创
20阅读
0评论
0点赞
发布博客于 2 月前

Apollo简单入门

文章目录Apollo简单入门目标概览什么是配置什么是配置中心Apollo简介主流配置中心功能特性对比总结Apollo简介Apollo特性Apollo快速入门执行流程安装Apollo运行时环境下载配置创建数据库启动Apollo代码实现发布配置应用读取配置修改配置热发布Apollo应用Apollo工作原理各模块职责分步执行流程核心概念项目管理基础设置创建项目删除项目配置管理添加发布配置项修改配置删除配置添加Namespace公共配置添加公共Namespace关联公共Namespace集群管理创建集群同步集群配置
原创
130阅读
0评论
0点赞
发布博客于 2 月前

hugo搭建博客教程-简单搭建

文章目录Hexo和Hugo安装Hugo(Windows)二进制安装(推荐:简单、快速)配置环境变量创建站点主题安装(以Even为例)文章显示巨坑!!!语言设置关于作者【菜单】社交链接定制logo中文导航栏文章可以配置的属性部署到gitee几个大坑报错error: failed to transform resource: SCSS页面加载不出来1、文章可能会优先更新在Github,个人博客,公众号【Github有】。其它平台会晚一段时间。个人博客备用地址2、如果Github很卡,可以在Gitee浏览,
原创
184阅读
0评论
0点赞
发布博客于 3 月前

Hexo搭建博客教程-基于Butterfly主题

文章目录Hexo和Hugo安装Hexo步骤验证主题快速开始(后面的都以Butterfly主题为例)安裝插件升级建议验证生成导航菜单关于作者清单留言板开启404代码风格社交图标图标库主页文章节选文章封面文章页相关配置文章meta显示文章打赏头像主页侧边栏设置侧边栏排版及内容运行时间最新评论不蒜子原理评论系统搜索(algolia)algolia(放弃了)本地搜索字数统计网站背景图片文章生成永久url连接步骤效果区别好处自定义图标部署到Gitee安装发布的插件直接部署几个坑同时部署到Github域名绑定写文章可配
原创
450阅读
0评论
1点赞
发布博客于 3 月前

JVM系列-第12章-垃圾回收器

文章目录垃圾回收器GC 分类与性能指标垃圾回收器概述垃圾回收器分类评估 GC 的性能指标不同的垃圾回收器概述垃圾收集器发展史7款经典的垃圾收集器垃圾收集器的组合关系查看默认垃圾收集器JDK8JDK9Serial 回收器:串行回收PaeNew 回收器:并行回收Parallel 回收器:吞吐量优先CMS 回收器:低延迟CMS 回收器CMS 工作原理(过程)CMS分析CMS 的优点与弊端CMS 参数配置小结JDK 后续版本中 CMS 的变化G1 回收器:区域化分代式为什么还需要G1为什么名字叫Garbage Fi
原创
263阅读
0评论
0点赞
发布博客于 3 月前

JVM系列-第11章-垃圾回收相关概念

文章目录垃圾回收相关概念System.gc() 的理解手动 GC 理解不可达对象的回收行为内存溢出与内存泄漏内存溢出内存泄漏Stop the World代码感受 Stop the World垃圾回收的并行与并发并发的概念并行的概念垃圾回收的并发与并行HotSpot的算法实现细节根节点枚举安全点与安全区域记忆集与卡表什么是跨代引用?记忆集与卡表再谈引用概述再谈引用:强引用再谈引用:软引用再谈引用:弱引用再谈引用:虚引用再谈引用:终结器引用(了解)1、文章可能会优先更新在Github,个人博客,公众号【Gi
原创
171阅读
0评论
0点赞
发布博客于 3 月前

JVM系列-第10章-垃圾回收概述和相关算法

文章目录垃圾回收概述大厂面试题蚂蚁金服百度天猫滴滴京东阿里字节跳动什么是垃圾?为什么需要GC?早期垃圾回收Java 垃圾回收机制自动内存管理应该关心哪些区域的回收?垃圾回收相关算法标记阶段:引用计数算法标记阶段的目的引用计数算法循环引用证明:java使用的不是引用计数算法小结标记阶段:可达性分析算法可达性分析实现思路GC Roots可以是哪些元素?注意对象的 finalization 机制finalize() 方法机制生存还是死亡?具体过程代码演示 finalize() 方法可复活对象MAT与JProfil
原创
184阅读
0评论
0点赞
发布博客于 3 月前

JVM系列-第9章-StringTable(字符串常量池)

文章目录StringTable(字符串常量池)String的基本特性为什么 JDK9 改变了 String 的结构String 的基本特性String 的底层结构String 的内存分配StringTable 为什么要调整?String 的基本操作举例1举例2字符串拼接操作先说结论字符串拼接的底层细节intern() 的使用intern() 方法的说明new String() 的说明new String(“ab”)会创建几个对象?new String(“a”) + new String(“b”) 会创建几个
原创
197阅读
1评论
0点赞
发布博客于 3 月前

JVM系列-第8章-执行引擎

文章目录执行引擎执行引擎概述执行引擎概述执行引擎工作过程Java代码编译和执行过程解释执行和即时编译什么是解释器?什么是JIT编译器?机器码 指令 汇编语言机器码指令和指令集汇编语言高级语言字节码C、C++源程序执行过程解释器为什么要有解释器解释器的分类解释器的现状JIT编译器Java 代码执行的分类为啥我们还需要解释器呢?案例JIT编译器相关概念热点代码及探测方式方法调用计数器热度衰减回边计数器HotSpotVM可以设置程序执行方法HotSpotVM JIT 分类C1和C2编译器不同的优化策略分层编译策略
原创
150阅读
0评论
2点赞
发布博客于 3 月前

JVM系列-第7章-对象的实例化内存布局与访问定位

文章目录对象的实例化内存布局与访问定位对象的实例化对象创建的方式对象创建的步骤对象的内存布局对象的访问定位1、文章可能会优先更新在Github,个人博客,公众号【Github有】。其它平台会晚一段时间。个人博客备用地址2、如果Github很卡,可以在Gitee浏览,或者Gitee在线阅读,个人博客。Gitee在线阅读和个人博客加载速度比较快。3、转载须知:转载请注明GitHub出处,让我们一起维护一个良好的技术创作环境!4、如果你要提交 issue 或者 pr 的话建议到 Github 提交。5
原创
143阅读
0评论
1点赞
发布博客于 3 月前

JVM系列-第6章-方法区

文章目录方法区栈、堆、方法区的交互关系方法区的理解方法区在哪里?方法区的基本理解HotSpot方法区演进设置方法区大小与 OOMJDK7及以前(永久代)JDK8及以后(元空间)方法区OOM如何解决OOM方法区的内部结构方法区存储什么?概念举例non-final 类型的类变量全局常量:static final运行时常量池运行时常量池 VS 常量池常量池运行时常量池方法区的使用举例图解字节码指令执行流程方法区演进细节永久代演进过程永久代为什么要被元空间替代?字符串常量池静态变量放在哪里对象实体在哪里放着?变量(
原创
286阅读
0评论
1点赞
发布博客于 3 月前

JVM系列-第5章-堆

文章目录堆堆的核心概述堆与进程堆内存细分JVisualVM可视化查看堆内存设置堆内存大小与 OOM设置堆内存OOM年轻代与老年代图解对象分配过程图解对象分配(一般情况)特殊情况说明常用调优工具GC分类Young GCMajor/Full GCGC日志分析堆空间分代思想对象内存分配策略TLAB为对象分配内存(保证线程安全)为什么有 TLAB什么是 TLABTLAB再说明堆空间参数设置常用参数设置空间分配担保堆是分配对象的唯一选择么?逃逸分析代码优化栈上分配同步省略(同步消除)标量替换逃逸分析的不足小结1、
原创
239阅读
0评论
1点赞
发布博客于 3 月前

JVM系列-第4章-虚拟机栈

文章目录虚拟机栈简介虚拟机栈的出现背景内存中的栈与堆虚拟机栈基本内容虚拟机栈的特点虚拟机栈的异常设置栈内存大小概念举例栈的存储单位栈中存储什么?栈运行原理栈帧的内部结构局部变量表认识局部变量表概念举例部分详解关于Slot的理解Slot代码示例Slot的重复利用静态变量与局部变量的对比补充说明操作数栈操作数栈的特点操作数栈的作用操作数栈代码追踪一步一步看流程小问题栈顶缓存技术动态链接方法的调用静态链接与动态链接早期绑定与晚期绑定多态与绑定虚方法与非虚方法举例关于 invokedynamic 指令动态语言和静态
原创
555阅读
0评论
1点赞
发布博客于 3 月前

JVM系列-第3章-运行时数据区

文章目录运行时数据区概述及线程前言运行时数据区结构运行时数据区与内存线程的内存空间Runtime类线程JVM 线程JVM 系统线程程序计数器(PC寄存器)PC寄存器介绍PC寄存器的作用举例两个面试题CPU 时间片本地方法接口本地方法举例为什么要使用 Native Method?与Java环境外交互与操作系统的交互Sun’s Java本地方法的现状本地方法栈1、文章可能会优先更新在Github,个人博客,公众号【Github有】。其它平台会晚一段时间。个人博客备用地址2、如果Github很卡,可以在Gi
原创
251阅读
0评论
0点赞
发布博客于 3 月前

JVM系列-第2章-类加载子系统

文章目录第2章-类加载子系统内存结构概述简图详细图类加载器子系统类加载器ClassLoader角色类加载过程概述加载阶段链接阶段验证(Verify)准备(Prepare)解析(Resolve)初始化阶段类的初始化时机clinit()1,2,3说明4说明5说明6说明类加载器的分类概述虚拟机自带的加载器启动类加载器扩展类加载器系统类加载器用户自定义类加载器什么时候需要自定义类加载器?如何自定义类加载器?关于ClassLoader获取ClassLoader途径双亲委派机制双亲委派机制原理双亲委派机制代码演示举例1
原创
487阅读
1评论
0点赞
发布博客于 3 月前

JVM系列-第1章-JVM与Java体系结构

文章目录第1章-JVM和Java体系架构前言开发人员如何看待上层框架架构师每天都在思考什么?我们为什么要学习JVMJava VS C++什么人需要学JVM?推荐及参考书籍TIOBE排行榜Java生态圈Java-跨平台的语言JVM-跨语言的平台多语言混合编程如何真正搞懂JVM?Java发展重大事件Open JDK和Oracle JDK虚拟机虚拟机概念Java虚拟机JVM的位置JVM的整体结构Java代码执行流程JVM的架构模型基于栈的指令集架构基于寄存器的指令级架构两种架构的举例JVM架构总结JVM的生命周期
原创
566阅读
0评论
2点赞
发布博客于 3 月前

Java并发体系-第四阶段-AQS源码解读-[1]-【万字长文系列】

文章目录可重入锁LockSupport是什么?3种让线程等待和唤醒的方法Object类提供的等待唤醒机制的缺点正常情况下异常情况1异常情况2Condion类提供的等待唤醒机制的缺点LockSupport的优点异常情况1异常情况2AQSAQS是什么?AQS能干嘛?AQS独占模式(以ReentrantLock 源码为例)AQS结构Node类结构AQS队列基本结构开始非公平锁lock()加锁lock()acquire()和tryAcquire()addWaiter()enq()acquireQueued()sho
原创
159阅读
0评论
0点赞
发布博客于 3 月前

Java并发体系-第三阶段-JUC并发包-[2]-【万字长文系列】

文章目录Phaser工具简介重复使用的例子动态减少常用API注册到达onAdvance()监控子线程任务强制关闭监控API获取阶段数获取注册的数获得到达和未到达的数目Phaser的分层结构阻塞队列请谈谈对阻塞队列的理解种类核心方法阻塞队列的使用场景传统版生产者消费者模式 Demo阻塞队列版生产者消费者模式Demo线程池主要优点线程池七大参数入门简介线程池的底层工作流程线程池的4种拒绝策略线程池在实际生产中使用哪一个线程池合理配置参数线程池的状态线程池的关闭Executors简介newWorkStealing
原创
189阅读
3评论
0点赞
发布博客于 3 月前

Java并发体系-第三阶段-JUC并发包-[1]-【万字长文系列】

文章目录AtomicXXXFieldUpdater简介使用场景CountDownLatch简介使用场景一使用场景二常用API给离散的平行任务增加逻辑层次关系利用CountDownLatch实现回调函数CyclicBarrier引出API使用构造方法重要方法其他方法CyclicBarrier 与 CountDownLatch 区别Exchanger简介简单的应用方法介绍数据的分析ReentrantLock简介公平锁和非公平锁构造方法获得锁释放锁锁的调试Lock和synchronized的区别Semaphore
原创
140阅读
0评论
0点赞
发布博客于 3 月前

Java并发体系-第二阶段-锁与同步-[3]-【万字长文系列】

文章目录synchronized保证三大特性synchronized的特性可重入特性不可中断特性synchronized不可中断演示ReentrantLock可中断演示synchronized简单原理synchronized修饰代码块时monitorentermonitorexitsynchronized 修饰方法的的情况Java对象的布局(C++代码层面)对象头Mark Wordklass pointer实例数据对齐填充查看Java对象布局的方法Lock RecordLock Record的结构synch
原创
121阅读
0评论
0点赞
发布博客于 3 月前

Java并发体系-第二阶段-锁与同步-[2]-【万字长文系列】

文章目录可见性设计的硬件MESI-缓存一致性协议(简介)内存屏障的相关讲解基本内存屏障可见性保障有序性保障synchronizedvolatile强调MESI-缓存一致性协议(进阶)MESI-初步MESI-优化硬件层面的MESI协议为何会引发有序性和可见性的问题?内存屏障在硬件层面的实现原理原子操作的实现原理相关术语处理器如何实现原子操作使用总线锁保证原子性使用缓存锁保证原子性Java如何实现原子操作1、文章可能会优先更新在Github,个人博客,公众号【Github有】。其它平台会晚一段时间。个人博客
原创
108阅读
0评论
0点赞
发布博客于 3 月前

Java并发体系-第二阶段-锁与同步-[1]-【万字长文系列】

文章目录并发编程中的三个问题可见性可见性概念可见性演示原子性原子性概念原子性演示有序性有序性概念有序性演示指令重排为什么指令重排序可以提高性能?as-if-serial语义Java内存模型(JMM)计算机结构计算机结构简介CPU内存缓存Java内存模型CPU缓存,内存与Java内存模型的关系再谈可见性主内存与工作内存之间的交互happens-before什么是happens-before?天然的happens-before关系volatileCPU术语介绍volatile保证可见性原理volatile禁止指
原创
112阅读
0评论
0点赞
发布博客于 3 月前

Java并发体系-第一阶段-多线程基础知识【万字长文系列】

文章目录程序、进程、线程的理解并行与并发单核CPU与多核CPU的理解并行与并发的理解创建线程的几种方法继承Thread类创建线程实现Runnable接口创建线程Thread和Runnable的关系Runnable接口构造线程源码Thread类构造线程源码最直观的代码描述实现Callable接口创建线程策略模式在Thread和Runnable中的应用Thread的构造方法start()源码为什么线程的启动不直接使用run()而必须使用start()呢?线程生命周期Thread常用API一个Java程序有哪些线
原创
194阅读
0评论
0点赞
发布博客于 3 月前

HashMap-JDK8源码讲解及常见面试题

文章目录数据结构红黑树为什么要引入红黑树Node类TreeNode类重要参数构造函数源码tableSizeFor()put源码hash()resize()get源码---下面是常见面试题---HashMap在JDK7和8中区别?为什么不直接用hash码作为数组table的下标?为什么容量要求为2的幂?二次扰动的好处什么样类型的数据适合做hashmap的key?为什么选择8作为树化阈值?为什么选择6和8作为链表化和树化的阈值?1、文章可能会优先更新在Github,个人博客,公众号【Github有】。其它平
原创
122阅读
0评论
0点赞
发布博客于 3 月前

HashMap-JDK7源码详解

1、文章可能会优先更新在Github,个人博客,公众号【Github有】。其它平台会晚一段时间。个人博客备用地址2、如果Github很卡,可以在Gitee浏览,或者Gitee在线阅读,个人博客。Gitee在线阅读和个人博客加载速度比较快。3、转载须知:转载请注明GitHub出处,让我们一起维护一个良好的技术创作环境!4、如果你要提交 issue 或者 pr 的话建议到 Github 提交。5、笔者会陆续更新,如果对你有所帮助,不妨Github点个Star~。你的Star是我创作的动力。本文基.
原创
106阅读
0评论
0点赞
发布博客于 3 月前

Java8常用新特性详解

1、文章可能会优先更新在Github,个人博客,公众号【Github有】。其它平台会晚一段时间。个人博客备用地址2、如果Github很卡,可以在Gitee浏览,或者Gitee在线阅读,个人博客。Gitee在线阅读和个人博客加载速度比较快。3、转载须知:转载请注明GitHub出处,让我们一起维护一个良好的技术创作环境!4、如果你要提交 issue 或者 pr 的话建议到 Github 提交。5、笔者会陆续更新,如果对你有所帮助,不妨Github点个Star~。你的Star是我创作的动力。Java.
原创
112阅读
0评论
0点赞
发布博客于 3 月前

万字长文详解Java泛型

1、文章可能会优先更新在Github,个人博客,公众号【Github有】。其它平台会晚一段时间。个人博客备用地址2、如果Github很卡,可以在Gitee浏览,或者Gitee在线阅读,个人博客。Gitee在线阅读和个人博客加载速度比较快。3、转载须知:转载请注明GitHub出处,让我们一起维护一个良好的技术创作环境!4、如果你要提交 issue 或者 pr 的话建议到 Github 提交。5、笔者会陆续更新,如果对你有所帮助,不妨Github点个Star~。你的Star是我创作的动力。简介泛.
原创
119阅读
0评论
0点赞
发布博客于 3 月前

计算机网络-秋招总结

文章目录备注补充1、关于计网比较好的博客2、三次挥手,四次握手3、DNS解析4、http1.0,http1.1,http2.0介绍5、https建立链接过程6、IO的一些博客1、OSI七层模型与TCP/IP 五层模型1、物理层2、数据链路层概念一些小细节3、网络层4、运输层5、应用层2、常见应用层协议和运输层、网络层协议1、各层协议2、硬件如路由器之类在哪一层3、TCP与UDP区别和应用场景,基于TCP的协议有哪些,基于UDP的有哪些1、区别+应用场景2、基于TCP的协议有哪些,基于UDP的有哪些4、TCP
原创
265阅读
0评论
1点赞
发布博客于 7 月前

ElasticSearch6.x-进阶-与SpringBoot集成

文章目录1、搭建工程1、Maven依赖2、application.properties3、配置类4、主启动类2、索引管理1、创建索引库APIJava客户端2、删除索引库APIJava客户端3、添加文档APIJava客户端4、查询文档APIJava客户端5、更新文档APIJava客户端6、删除文档APIJava客户端-----下面是DSL搜索的内容-----3、DSL搜索环境准备1、创建映射2、插入原始数据4、查询所有文档APIJava客户端5、分页查询APIJava客户端6、Term QueryAPIJav
原创
284阅读
0评论
0点赞
发布博客于 7 月前

ElasticSearch6.x-入门

文章目录1、ElasticSearch介绍1、介绍2、倒排索引2、基本概念1、创建索引库概念:操作:2、创建映射概念操作3、创建文档概念操作4、搜索文档3、分词1、内置分词分词APIStandardSimpleWhitespaceStopKeyword中文分词2、IK分词器两种分词模式4、映射1、映射维护方法2、常用映射类型text文本字段keyword关键字字段日期类型综合例子1、文章很长,喜欢的话,可以关注下博客。这段时间秋招忙完之后,会持续更新新内容。新内容会优先在个人博客发布2、本人博客地址:
原创
165阅读
0评论
0点赞
发布博客于 7 月前

Springboot2.x与elasticsearch6.3.2整合报错None of the configured nodes are available

结合我前面一篇Springboot2.x与elasticsearch6.3.2整合的文章SpringBoot2.x集成Elasticsearch6.3.2,同时配置RestClient和TransportClient本文目录transportClient常见问题1.集群名2.端口3.防火墙4.我的elasticsearch.yml文件transportClient常见问题NoNodeAvai...
原创
353阅读
0评论
0点赞
发布博客于 2 年前

SpringBoot2.x集成Elasticsearch6.3.2,同时配置RestClient和TransportClient

本文目录1.Maven(只贴出了部分Maven)2.application.properties3.配置类4.主启动类5.整合中的常见报错1.Maven(只贴出了部分Maven) <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>...
原创
852阅读
0评论
0点赞
发布博客于 2 年前