<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Forest441的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Forest441</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Forest441]]></copyright><item><title><![CDATA[优化的道路永无止境——Mysql的ICP及MRR]]></title><link>https://blog.youkuaiyun.com/Forest441/article/details/110595609</link><guid>https://blog.youkuaiyun.com/Forest441/article/details/110595609</guid><author>Forest441</author><pubDate>Thu, 03 Dec 2020 23:43:13 +0800</pubDate><description><![CDATA[在讲ICP和MRR之前，我们先了解一下MySQL的架构。于本文的重点并不在架构细节上，所以让我们直接看关键部分，存储引擎作为单独的一层，是连接底层存储系统和上层server其他部分的桥梁，而MySQL对存储引擎的抽象也极大地丰富了其可扩展性。

ICP
我们平时需要查询和写入的数据最终的存储介质都是底层的文件系统，而数据的传输必然要经过上面说到的两个部分。就好像我们将单体服务切分成微服务一样，如果我们需要从另一个服务取数据，需要由对方服务查询DB，然后通过网络再传输给自己。查询DB的过程也是一种网络传输，所]]></description><category></category></item><item><title><![CDATA[关于MySQL中EXPLAIN语句的最全介绍]]></title><link>https://blog.youkuaiyun.com/Forest441/article/details/110007476</link><guid>https://blog.youkuaiyun.com/Forest441/article/details/110007476</guid><author>Forest441</author><pubDate>Mon, 23 Nov 2020 20:56:21 +0800</pubDate><description><![CDATA[MySQL应该是我们平时用得最多的一个关系型数据库了吧，毕竟开源免费而且功能强大。但是如果想知道一条SQL语句具体是怎么执行的，总不能每次都看源码吧，而官方就提供了一个工具——EXPLAIN语句，可以查看一条SQL的具体执行计划。
其实EXPLAIN我平时用得也不少，但EXPLAIN的输出信息实在比较丰富，所以每次都是根据输出结果然后上网定向查，过后就又忘了。这一次终于下定决心要把EXPLAIN的所有情况做一个总结。
本文介绍的MySQL版本
5.7
EXPLAIN的使用场景与功能

EXPLAIN后面如果]]></description><category></category></item><item><title><![CDATA[Spring的BeanUtils的copyProperties方法需要注意的点]]></title><link>https://blog.youkuaiyun.com/Forest441/article/details/104442196</link><guid>https://blog.youkuaiyun.com/Forest441/article/details/104442196</guid><author>Forest441</author><pubDate>Sat, 22 Feb 2020 13:01:04 +0800</pubDate><description><![CDATA[背景
最近项目中在和第三方进行联调一个接口，我们这边发送http请求给对方，然后接收对方的回应，代码都是老代码。根据注释，对方的SDK中写好的Request类有一个无法序列化的bug，所以这边重新写了一个Request类，基本属性都是相同的，但是重点是有一个属性是静态内部类，还有两个是list属性，类似于下面这样：
private List&lt;Order&gt; orders;
private...]]></description><category></category></item><item><title><![CDATA[关于spring自动加载的那点事儿]]></title><link>https://blog.youkuaiyun.com/Forest441/article/details/104442186</link><guid>https://blog.youkuaiyun.com/Forest441/article/details/104442186</guid><author>Forest441</author><pubDate>Sat, 22 Feb 2020 13:00:18 +0800</pubDate><description><![CDATA[背景
惯例要讲一下背景，毕竟问题来源于生活，困难滋生于工作，要是每天吃吃喝喝、无忧无虑，我相信我也没什么问题好写了^_^公司架构组在推新的基础框架，主要是嫌以前的框架用起来太啰嗦了，做了很多感觉多余的工作（思想也是在进步滴）。正好我这边也在做中台服务的下沉和重构，用到了索性就直接接新的框架了，老是用陈年的东西不肯升级，都快觉得自己已经七老八十了，咱要有互联网人的与时俱进的思维，出了问题大不了删库跑...]]></description><category></category></item><item><title><![CDATA[ReentrantLock源码分析]]></title><link>https://blog.youkuaiyun.com/Forest441/article/details/104442167</link><guid>https://blog.youkuaiyun.com/Forest441/article/details/104442167</guid><author>Forest441</author><pubDate>Sat, 22 Feb 2020 12:58:53 +0800</pubDate><description><![CDATA[ReentrantLock源码分析

前言
最近公司比较忙，整天忙着做项目、做需求，感觉整个人昏昏沉沉的，抬头看天空感觉都是灰色的~~，其实是杭州的天本来就是这个颜色，手动滑稽`~(^o^)/~`。废话不多说，今天突然回忆起面试的时候问到的锁，继而就想起了ReentrantLock这个类，我们知道，JDK1.6已经对synchronized做了很多的优化，性能上已经不比ReentrantLock差...]]></description><category></category></item><item><title><![CDATA[Apollo配置中心遇到的坑]]></title><link>https://blog.youkuaiyun.com/Forest441/article/details/104442158</link><guid>https://blog.youkuaiyun.com/Forest441/article/details/104442158</guid><author>Forest441</author><pubDate>Sat, 22 Feb 2020 12:58:07 +0800</pubDate><description><![CDATA[前言
项目用的springboot，连带着配置中心也一直用的spring的配置中心，但是一直以来都有各种问题：

每次变更配置要重启配置中心和应用；
各个环境集群的配置文件在不同分支，每个环境要分别手动同步，容易遗漏；
无法确定当前应用是否重启过，读取的是最新配置。



当然，个人觉得最重要的就是需要重启应用这个，简直就是浪费时间，浪费时间就是浪费生命啊。虽然spring也提供@RefreshS...]]></description><category></category></item><item><title><![CDATA[Spring事务处理机制以及错误使用TransactionSynchronization的afterCompletion方法引起的问题]]></title><link>https://blog.youkuaiyun.com/Forest441/article/details/104442150</link><guid>https://blog.youkuaiyun.com/Forest441/article/details/104442150</guid><author>Forest441</author><pubDate>Sat, 22 Feb 2020 12:57:35 +0800</pubDate><description><![CDATA[前言
我们都知道spring有声明式事务和编程式事务，声明式只需要提供@Transactional的注解，然后事务的开启和提交/回滚、资源的清理就都由spring来管控，我们只需要关注业务代码即可；而编程式事务则需要使用spring提供的模板，如TransactionTemplate，或者直接使用底层的PlatformTransactionManager。
声明式事务的最大优点就是对代码的侵入性...]]></description><category></category></item><item><title><![CDATA[dubbo的provider端抛出异常的处理逻辑]]></title><link>https://blog.youkuaiyun.com/Forest441/article/details/104442102</link><guid>https://blog.youkuaiyun.com/Forest441/article/details/104442102</guid><author>Forest441</author><pubDate>Sat, 22 Feb 2020 12:53:28 +0800</pubDate><description><![CDATA[直入主题，我们都知道dubbo是一个rpc的框架，consumer是通过网络对provider发起方法调用的，provider也要通过网络返回响应。那如果provider端发生了异常而又没有捕获，照理就不会有返回值，consumer端会得到什么样的结果呢？
其实dubbo有一个专门处理异常的Filter，叫ExceptionFilter，针对provider端未被捕获的各种异常做了分别处理，看一下...]]></description><category></category></item><item><title><![CDATA[当dubbo序列化遇上Collections]]></title><link>https://blog.youkuaiyun.com/Forest441/article/details/104435766</link><guid>https://blog.youkuaiyun.com/Forest441/article/details/104435766</guid><author>Forest441</author><pubDate>Fri, 21 Feb 2020 21:54:52 +0800</pubDate><description><![CDATA[背景
惯例先交待一下事件的背景，最近在调试接口的时候发现一个奇怪的现象，页面某一处显示的数据在我未对其做更改的情况下发生了变化。通过查看代码发现，页面会发送请求，然后将请求值做一层包装，之后传给其他模块做存储。
过程
一开始怀疑是其他模块动了数据，而且操作错了，经过调试代码发现不是那么回事儿~~，数据在传送之前就已经有问题了。更诡异的是，看上去根本没做啥啊，这代码的简单程度简直和HelloWord...]]></description><category></category></item><item><title><![CDATA[spring中定义多个HandlerExceptionResolver，异常会怎么处理]]></title><link>https://blog.youkuaiyun.com/Forest441/article/details/104435756</link><guid>https://blog.youkuaiyun.com/Forest441/article/details/104435756</guid><author>Forest441</author><pubDate>Fri, 21 Feb 2020 21:54:22 +0800</pubDate><description><![CDATA[前言
我们知道，spring提供了几种方式来统一异常，这样我们就不需要在controller的每个方法中都写烦人的try-catch了。主要有以下几种：

@ExceptionHandler 注解
HandlerExceptionResolver 接口
@ControllerAdvice 注解



这里就不一一展开说明了，今天主要讲一下，如果项目中定义了两个HandlerExceptionRes...]]></description><category></category></item><item><title><![CDATA[dubbo框架设计介绍]]></title><link>https://blog.youkuaiyun.com/Forest441/article/details/104435746</link><guid>https://blog.youkuaiyun.com/Forest441/article/details/104435746</guid><author>Forest441</author><pubDate>Fri, 21 Feb 2020 21:53:46 +0800</pubDate><description><![CDATA[简介
Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架，使得应用可通过高性能的 RPC 实现服务的输出和输入功能，可以和Spring框架无缝集成。它提供了三大核心能力：面向接口的远程方法调用，智能容错和负载均衡，以及服务自动注册和发现。相信国内用dubbo的互联网公司还是很多的，springcloud虽然是挂靠在鼎鼎大名的spring团队下，但是感觉国内使用的公司没有使用dubbo的多，而且...]]></description><category></category></item><item><title><![CDATA[rocketmq知识点概要]]></title><link>https://blog.youkuaiyun.com/Forest441/article/details/104435446</link><guid>https://blog.youkuaiyun.com/Forest441/article/details/104435446</guid><author>Forest441</author><pubDate>Fri, 21 Feb 2020 21:35:10 +0800</pubDate><description><![CDATA[前言
MQ现在在互联网公司算是一个必不可少的中间件了，我们都知道MQ可以用来流量削峰，异步解耦，但是总觉得只停留在最基本的使用上。正好最近看了一遍《RocketMQ实战与原理解析》这本书，讲的内容不见得有多高深、多全面，但是看完了回忆一遍，好多东西感觉只有一个模糊的印象，还是分章记下来可靠一点。
快速入门
主要介绍了MQ在实际中的应用场景
应用解耦
非关键链路服务挂掉后，MQ可以缓存消息，等服务再...]]></description><category></category></item><item><title><![CDATA[Netty中NioEventLoop源码分析]]></title><link>https://blog.youkuaiyun.com/Forest441/article/details/104431092</link><guid>https://blog.youkuaiyun.com/Forest441/article/details/104431092</guid><author>Forest441</author><pubDate>Fri, 21 Feb 2020 17:13:05 +0800</pubDate><description><![CDATA[版本
本次源码分析基于Netty的版本为4.1
源码分析
NioEventLoop可以视为java中的一个线程，只不过NioEventLoop处理的事件，以及内部的处理逻辑会有所不同。先看一下类的继承关系：
可以看到NioEventLoop实现了很多接口，特别是EventLoop和ScheduledExecutorService，所以NioEventLoop不仅能实现普通的task，还能实现定时t...]]></description><category></category></item><item><title><![CDATA[《Netty实战》总结]]></title><link>https://blog.youkuaiyun.com/Forest441/article/details/104430508</link><guid>https://blog.youkuaiyun.com/Forest441/article/details/104430508</guid><author>Forest441</author><pubDate>Fri, 21 Feb 2020 16:46:41 +0800</pubDate><description><![CDATA[前言
我们都知道Netty是一款用于创建高性能网络应用程序的高级框架，但是实际工作中真正地去直接使用Netty的场景好像不多(反正我没有)。其实Netty无处不在，很多中间件底层通信框架用的都是Netty，dubbo、rocketMQ、Elasticsearch等常用的框架和中间件其实都用到了Netty。最近在读《Netty实战》这本书，做一个知识点的简要概括吧，省略了一些章节(比如Netty用于...]]></description><category></category></item><item><title><![CDATA[关于springboot启动配置加载的那点事儿]]></title><link>https://blog.youkuaiyun.com/Forest441/article/details/104429793</link><guid>https://blog.youkuaiyun.com/Forest441/article/details/104429793</guid><author>Forest441</author><pubDate>Fri, 21 Feb 2020 16:17:54 +0800</pubDate><description><![CDATA[前言
现在几乎所有的java开发都会用到springboot，除了很老很老的项目，应该不会再有人直接用jsp，servlet等写web项目了吧，直接用spring的都很少见了。今天发生的这个问题就得从springboot说起。我们都知道springboot遵循约定大于配置的规则，尽量将spring中的配置减少，几行代码就可以跑一个web项目，但是默认的东西越多，其实隐藏的东西也就越多，一旦碰到什么...]]></description><category></category></item><item><title><![CDATA[Lombok的@Builder注解]]></title><link>https://blog.youkuaiyun.com/Forest441/article/details/104429711</link><guid>https://blog.youkuaiyun.com/Forest441/article/details/104429711</guid><author>Forest441</author><pubDate>Fri, 21 Feb 2020 16:14:30 +0800</pubDate><description><![CDATA[背景
惯例说一下背景，对于那些复杂的接口或者大的查询接口，一般我们会在入参定义一个option，然后将查询域分割成几部分，由调用方指定需要查询的域。今天在调用其他团队某个接口的时候发现对方定义的Option里面分成了十几个选项，但是没有提供链式调用，这样每次set值就要好几行代码，使用起来很不方便，代码也不美观。所以在己方代码里做了一层封装，定义了一个相同的Option类，标注了Lombok的@B...]]></description><category></category></item><item><title><![CDATA[redis中的对象]]></title><link>https://blog.youkuaiyun.com/Forest441/article/details/104429533</link><guid>https://blog.youkuaiyun.com/Forest441/article/details/104429533</guid><author>Forest441</author><pubDate>Fri, 21 Feb 2020 16:06:57 +0800</pubDate><description><![CDATA[redis中的对象

前言
在上一篇关于redis的文章中，我们分析了redis用到的主要的数据结构，但是redis并没有直接使用这些数据结构来实现KV形式的数据库，而是基于这些数据结构又封装了一些对象。常用的基础对象包括字符串、列表、哈希、集合和有序集合5种，而每种对象底层的实现就是上一篇提到的数据结构中的一种或多种。参考《redis设计与实现》，redis这么设计有以下几点的好处：

redi...]]></description><category></category></item><item><title><![CDATA[redis的数据结构]]></title><link>https://blog.youkuaiyun.com/Forest441/article/details/104429396</link><guid>https://blog.youkuaiyun.com/Forest441/article/details/104429396</guid><author>Forest441</author><pubDate>Fri, 21 Feb 2020 16:01:03 +0800</pubDate><description><![CDATA[前言
我们都知道，redis最基本的数据结构有5种，分别是字符串、列表、哈希表、集合和有序集合。其实准确来说，这种表述容易造成误会，给人误解。从redis的源码来看，这5种其实是redis封装的对象，而底层对象的实现才应该成为数据结构。redis最基础的数据结构包括以下几种：简单动态字符串、链表、字典、跳跃表、整数集合、压缩列表。而redis对象(也就是一开始提到的5种)其实底层都是基于这些数据结...]]></description><category></category></item><item><title><![CDATA[系统管理员应该知道的 20 条 Linux 命令]]></title><link>https://blog.youkuaiyun.com/Forest441/article/details/76795096</link><guid>https://blog.youkuaiyun.com/Forest441/article/details/76795096</guid><author>Forest441</author><pubDate>Sun, 06 Aug 2017 22:24:21 +0800</pubDate><description><![CDATA[如果您的应用程序不工作，或者您希望在寻找更多信息，这 20 个命令将派上用场。]]></description><category></category></item><item><title><![CDATA[AutoCAD2014打开闪退的解决办法]]></title><link>https://blog.youkuaiyun.com/Forest441/article/details/47910631</link><guid>https://blog.youkuaiyun.com/Forest441/article/details/47910631</guid><author>Forest441</author><pubDate>Sun, 23 Aug 2015 21:13:56 +0800</pubDate><description><![CDATA[上一次Windows8.1升级成Windows10系统之后出现了AutoCAD2014打开闪退的问题，当时束手无策，想来只好重装，花费个把小时之后终于安装激活全部搞定。启动之后发现没有问题，然后就不去管它了⊙﹏⊙，结果今天用CAD打开一个文件的时候出现这个问题，只好百度之，网上的办法除了重装都试了一遍，删除C:\ProgramData\FLEXnet\adskflex_*_tsf.data什么的，]]></description><category></category></item></channel></rss>