<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[lbllol365的博客]]></title><description><![CDATA[热爱兵棋，热爱编程]]></description><link>https://blog.youkuaiyun.com/lbllol365</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; lbllol365]]></copyright><item><title><![CDATA[MySQL 45 讲 | 01 基础架构 一条SQL查询语句是如何执行的]]></title><link>https://blog.youkuaiyun.com/lbllol365/article/details/114221888</link><guid>https://blog.youkuaiyun.com/lbllol365/article/details/114221888</guid><author>lbllol365</author><pubDate>Sun, 28 Feb 2021 14:20:16 +0800</pubDate><description><![CDATA[01 基础架构 一条SQL查询语句是如何执行的
MySQL逻辑架构图：

MySQL分为Server层和存储引擎层。

Server层：包括连接器、查询缓存、分析器、优化器、执行器等，涵盖MySQL大多数核心服务功能、内置函数、所有的跨存储引擎的功能，比如存储过程、触发器、视图等
存储引擎层负责数据的存储和提取。架构是插件式的，支持多个存储引擎。

不同的存储引擎共用一个Server层。
连接器
连接器负责跟客户端建立连接、获取权限、维持和管理连接。
连接时，如果用户名密码认证通过，连接器会到权限表里查出你]]></description><category></category></item><item><title><![CDATA[RabbitMQ安装与避坑]]></title><link>https://blog.youkuaiyun.com/lbllol365/article/details/111414202</link><guid>https://blog.youkuaiyun.com/lbllol365/article/details/111414202</guid><author>lbllol365</author><pubDate>Sun, 20 Dec 2020 10:10:20 +0800</pubDate><description><![CDATA[我用的腾讯云，Ubuntu18.04.4 LTS。
你先需要安装Erlang，然后在安装RabbitMQ。
但首先，要注意：RabbitMQ和Erlang相互的版本是有限制的。具体看下面的链接：
https://www.rabbitmq.com/which-erlang.html
现在我要安装3.8.9的RabbitMQ，那么我就得按照要求去安装最低22.3，最高23.x版本的Erlang
1.安装Erlang
你可以用apt来装Erlang，但我推荐使用aptitude，它会为你处理安装和卸载时依赖包的问]]></description><category></category></item><item><title><![CDATA[高性能MySQL 笔记 第四章 Schema与数据类型优化]]></title><link>https://blog.youkuaiyun.com/lbllol365/article/details/109651913</link><guid>https://blog.youkuaiyun.com/lbllol365/article/details/109651913</guid><author>lbllol365</author><pubDate>Thu, 12 Nov 2020 18:53:16 +0800</pubDate><description><![CDATA[Schema与数据类型优化
选择优化的数据类型
几个简单的原则：

更小的通常更好：应该尽量使用可以正确存储数据的最小数据类型
简单就好：简单数据类型的操作通常需要更少的CPU周期
尽量避免NULL

整数类型
有可选的UNSIGNED属性，表示不允许负值，这大致可以使正数的上限提高一倍
有符号和无符号类型使用相同的存储空间，并具有相同的性能
MySQL可以为整数类型指定宽度，但对于存储和计算来说，INT(1)和INT(20)是相同的
实数类型
FLOAT使用4字节，DOUBLE使用8字节，但MySQL使用]]></description><category></category></item><item><title><![CDATA[高性能MySQL 笔记 第三章 服务器性能剖析]]></title><link>https://blog.youkuaiyun.com/lbllol365/article/details/109290601</link><guid>https://blog.youkuaiyun.com/lbllol365/article/details/109290601</guid><author>lbllol365</author><pubDate>Mon, 26 Oct 2020 15:21:46 +0800</pubDate><description><![CDATA[服务器性能剖析
性能优化简介
数据库服务器的性能用查询的响应时间来度量，单位是每个查询花费的时间。
优化：在一定的工作负载下尽可能地降低响应时间。
注意：性能优化不是降低CPU利用率！资源就是用来消耗并用来工作的，如果消耗了更多的CPU，但缩短了响应时间，这种情况是有利的。
完成一项任务需要的时间分为：执行时间和等待时间。
要优化执行时间：定位和测量不同子任务花费的时间。然后优化去掉一些子任务、降低子任务的执行频率或者提升子任务的效率。一些运行不频繁或者很短的子任务对整体响应时间的影响很小，通常可以忽略不计]]></description><category></category></item><item><title><![CDATA[《深入浅出设计模式》 笔记第三章 装饰者模式]]></title><link>https://blog.youkuaiyun.com/lbllol365/article/details/107749390</link><guid>https://blog.youkuaiyun.com/lbllol365/article/details/107749390</guid><author>lbllol365</author><pubDate>Sun, 02 Aug 2020 19:22:47 +0800</pubDate><description><![CDATA[《深入浅出设计模式》 笔记第三章 装饰者模式
有这么一个需求：咖啡厅做饮料。饮料分基础饮料（浓缩咖啡、普通咖啡等等）和调味饮料（果汁、豆浆等）。现要求建立一个系统，计算饮料的价格和饮料的描述，成品饮料会在基础饮料的上搭配调味饮料。

第一次尝试

很明显，这种实现很烂。
第二次尝试

该次尝试将调味饮料放在了超类的属性（布尔值）中，每加入一种调味饮料，就需要添加一个属性和Get、Set方法。
但这种尝试违反了开放-关闭原则。
开放-关闭原则
设计原则：类应该对扩展开放，对修改关闭。
在选择需要被扩展的代码部]]></description><category></category></item><item><title><![CDATA[《深入浅出设计模式》笔记第二章 观察者模式]]></title><link>https://blog.youkuaiyun.com/lbllol365/article/details/107701645</link><guid>https://blog.youkuaiyun.com/lbllol365/article/details/107701645</guid><author>lbllol365</author><pubDate>Thu, 30 Jul 2020 21:49:29 +0800</pubDate><description><![CDATA[《深入浅出设计模式》笔记第二章 观察者模式
概况
需要建立一个应用如下：

WeatherData类：

错误示范：
public class WeatherData {
    public void measureementsChanged() {
        float temp = getTemperature();
        float humidity = getHumidity();
        float pressure = getPressure();
        
 ]]></description><category></category></item><item><title><![CDATA[《深入浅出设计模式》笔记第一章 策略模式]]></title><link>https://blog.youkuaiyun.com/lbllol365/article/details/107623391</link><guid>https://blog.youkuaiyun.com/lbllol365/article/details/107623391</guid><author>lbllol365</author><pubDate>Mon, 27 Jul 2020 22:43:22 +0800</pubDate><description><![CDATA[《深入浅出设计模式》笔记第一章
设计一个有各种各样鸭子的系统：
第一版 继承
类图：

加入了一个需求，需要让鸭子飞，修改类图如下：

但，并不是所有的鸭子都会飞，比如橡胶鸭子。并且，橡胶鸭子是“吱吱”叫的（假设），而不是一般鸭子的“呱呱”叫，这样，就需要重写父类的quack方法。
利用接口如何？

这个设计很不好。没有实现代码复用，对于每个实现两个接口的类，都需要实现对应接口的方法，万一需要更改方法的实现会非常麻烦。
软件开发的一个不变的真理就是变化。不管当初软件设计得多好，一段时间后，总是需要成长与改变]]></description><category></category></item><item><title><![CDATA[《高性能MySQL》 笔记 第一章 MySQL架构与历史]]></title><link>https://blog.youkuaiyun.com/lbllol365/article/details/107307197</link><guid>https://blog.youkuaiyun.com/lbllol365/article/details/107307197</guid><author>lbllol365</author><pubDate>Sun, 12 Jul 2020 22:50:56 +0800</pubDate><description><![CDATA[高性能MySQL 笔记 第一章 MySQL架构与历史
MySQL逻辑架构

最上层的服务并不是MySQL所独有的，大多数基于网络的客户端/服务端的工具或者服务都有类似的架构。比如连接处理、授权认证、安全等
第二层是MySQL的核心服务功能，包括查询解析、分析、优化、缓存以及所有内置函数（日期、时间、数学等等），所有跨存储引擎的功能都在这一层实现：储存过程、触发器、视图等。
第三层包含了存储引擎。存储引擎负责MySQL中数据的存储和提取。服务器通过API与存储引擎进行通信，这些接口屏蔽了不同存储引擎之间的差异]]></description><category></category></item><item><title><![CDATA[微服务设计 第二章 笔记]]></title><link>https://blog.youkuaiyun.com/lbllol365/article/details/107047619</link><guid>https://blog.youkuaiyun.com/lbllol365/article/details/107047619</guid><author>lbllol365</author><pubDate>Tue, 30 Jun 2020 18:03:37 +0800</pubDate><description><![CDATA[第二章 演化式架构师
不准确的比较
架构师的一个重要职责：确保团队有共同的技术愿景，以帮助我们向客户交付他们想要的系统。
**软件架构师和建筑师是天壤之别的！不要用建筑师的视角来看待软件开发。**建筑行业存在种种精确的约束，成果是一个“死”东西；而软件开发创造的东西从设计上来说就是要足够灵活，有很好的适应性，并且能根据用户的需求进行演化。
架构师的演化视角
架构师必须改变那种从一开始就要设计出完美产品的想法，相反我们应该设计出一个合理的框架，在这个框架下可以慢慢演化出正确的系统，并且一旦我们学到了更多的知识]]></description><category></category></item><item><title><![CDATA[微服务设计 第一章 笔记]]></title><link>https://blog.youkuaiyun.com/lbllol365/article/details/107025958</link><guid>https://blog.youkuaiyun.com/lbllol365/article/details/107025958</guid><author>lbllol365</author><pubDate>Mon, 29 Jun 2020 18:28:23 +0800</pubDate><description><![CDATA[第一章 微服务
什么是微服务
很小，专注于做好一件事
单一职责原则：把因相同原因而变化的东西聚合到一起，而把因不同原因而变化的东西分离开来。
怎样确定代码库足够小？

如果你不再感觉你的代码库过大，可能它就足够小了。
代码库的大小要与团队的大小相匹配

自治性
一个微服务就是一个独立的实体。它可以独立地部署在PaaS（Platform as a Service，平台即服务）上，也可以作为一个操作系统的进程存在。
要尽量避免把多个服务部署到同一台机器上。
特性：

服务之间均通过网络调用进行通信，从而加强了服]]></description><category></category></item><item><title><![CDATA[Memcached介绍与使用]]></title><link>https://blog.youkuaiyun.com/lbllol365/article/details/106928368</link><guid>https://blog.youkuaiyun.com/lbllol365/article/details/106928368</guid><author>lbllol365</author><pubDate>Tue, 23 Jun 2020 17:37:08 +0800</pubDate><description><![CDATA[Memcached介绍与使用
Memcached是什么？
Memcached是一个免费开源的、高性能的、分布式内存对象缓存系统。
Memcached是一个基于内存的键值对储存系统，用于储存小型的任意数据（字符串、对象），比如数据库查询、API调用以及页面渲染的结果。
它由什么组成的？

客户端软件，给出可用的Memcached服务器列表
一个基于客户端的哈希算法，用于基于“键”选择合适的服务器
服务端软件，在一个内部的哈希表中储存键值对数据
最近最少使用算法（LRU），决定何时丢弃旧数据（当内存不足）

各]]></description><category></category></item><item><title><![CDATA[《现代操作系统》笔记 第二章（1） 进程]]></title><link>https://blog.youkuaiyun.com/lbllol365/article/details/106708333</link><guid>https://blog.youkuaiyun.com/lbllol365/article/details/106708333</guid><author>lbllol365</author><pubDate>Fri, 12 Jun 2020 09:10:25 +0800</pubDate><description><![CDATA[第二章（1） 进程
进程
严格来说，在某个瞬间，CPU只能运行一个进程。但在1秒钟之内，它可能运行多个进程，这样就产生并行的错觉，伪并行就是指这种场景，以此来区分多处理器系统（该系统有两个或多个CPU共享一个物理内存）的真正硬件并行。
进程模型
关键思想：一个进程是某种类型的活动，它有程序、输入、输出以及状态。单个处理器可以被若干进程共享，它使用某种调度算法决定何时停止一个进程的工作，并转而为另一个进程服务。
如果一个程序运行了两遍，则算两个进程。
进程的创建
有4种主要事件会导致进程的创建：

系统初始化]]></description><category></category></item><item><title><![CDATA[《现代操作系统》笔记第一章 引论]]></title><link>https://blog.youkuaiyun.com/lbllol365/article/details/106584365</link><guid>https://blog.youkuaiyun.com/lbllol365/article/details/106584365</guid><author>lbllol365</author><pubDate>Sat, 06 Jun 2020 10:48:24 +0800</pubDate><description><![CDATA[第一章 引论
多数计算机有两种运行模式：内核态和用户态
操作系统运行在内核态（又称管态、和心态）中，用于对所有硬件的完全访问权，能使用硬件可以运行的任何机器指令。
其它软件运行在用户态，只能使用机器指令中的一个子集，特别禁止运行那些会影响机器的控制或者I/O操作的指令。
但在嵌入式系统（没有内核态）和解释系统（基于Java的操作系统，它采用解释方式而非硬件方式区分组件），上述区别是模糊的。
在许多系统中，一些在用户态上运行的程序协助操作系统运行特权功能，比如修改密码的程序，它不是操作系统的一部分，也不在内核]]></description><category></category></item><item><title><![CDATA[Mybatis中getMapper方法源码解析]]></title><link>https://blog.youkuaiyun.com/lbllol365/article/details/106063555</link><guid>https://blog.youkuaiyun.com/lbllol365/article/details/106063555</guid><author>lbllol365</author><pubDate>Mon, 11 May 2020 21:58:21 +0800</pubDate><description><![CDATA[Mybatis中getMapper方法源码解析
前言：最近重看了一遍Mybatis，看到“UserDao userDao = sqlSession.getMapper(UserDao.class);”这行代码。我很好奇，为什么传一个Class类型，就能返回一个可以用的接口呢？
总体的

红框的代码，会产生一个SqlSessionFactory，这个SqlSessionFactory携带着一个由Mybatis配置文件生解析而成的配置类(Configuration.java)，这个配置类里就包含着已注册Mapp]]></description><category></category></item><item><title><![CDATA[DispatcherServlet处理过程及源码分析]]></title><link>https://blog.youkuaiyun.com/lbllol365/article/details/105620100</link><guid>https://blog.youkuaiyun.com/lbllol365/article/details/105620100</guid><author>lbllol365</author><pubDate>Sun, 19 Apr 2020 19:04:13 +0800</pubDate><description><![CDATA[DispatcherServlet处理过程及源码分析
第一步
寻找WebApplicationContext并将其作为一个属性绑定到请求上，这样Controller和其他元素在处理过程中就可以使用它。默认它是绑定在DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE这个键上。

DispatcherServlet这个类里最重要的两个方法是doSer...]]></description><category></category></item><item><title><![CDATA[《WireShark网络分析的艺术》笔记]]></title><link>https://blog.youkuaiyun.com/lbllol365/article/details/105585693</link><guid>https://blog.youkuaiyun.com/lbllol365/article/details/105585693</guid><author>lbllol365</author><pubDate>Fri, 17 Apr 2020 18:02:21 +0800</pubDate><description><![CDATA[《WireShark网络分析的艺术》笔记
一个问题
某些iSCSI存储阵列在出现网络拥塞时处理不当，会严重影响VMware的读写性能。这和它们的TCP实现方式有关。
解决方式：在VMware和存储阵列上关闭延迟确认(Delayed ACK)
介绍iSCSI：
第17章 使用iSCSI服务部署网络存储。
简言之，这是一种将SCSI(Small Computer System Interface)和以...]]></description><category></category></item><item><title><![CDATA[DispatcherServlet配置及源码分析]]></title><link>https://blog.youkuaiyun.com/lbllol365/article/details/105300763</link><guid>https://blog.youkuaiyun.com/lbllol365/article/details/105300763</guid><author>lbllol365</author><pubDate>Fri, 03 Apr 2020 20:52:01 +0800</pubDate><description><![CDATA[DispatcherServlet配置及源码分析
DispatcherServlet是前端控制器，它负责拦截特定类型得请求并分发至对应的Controller。DispatcherServlet和其它Servlet一样，需要在Java配置类或者web.xml
里进行声明和配置映射。反过来，DispatcherServlet也利用Spring配置来寻找组件、视图解析或者异常处理等。
配置Dispatc...]]></description><category></category></item><item><title><![CDATA[代理模式及Spring AOP]]></title><link>https://blog.youkuaiyun.com/lbllol365/article/details/105188810</link><guid>https://blog.youkuaiyun.com/lbllol365/article/details/105188810</guid><author>lbllol365</author><pubDate>Sun, 29 Mar 2020 22:57:40 +0800</pubDate><description><![CDATA[代理模式及Spring AOP
代理模式：为其他对象提供一种代理以控制对这个对象的访问。

Subject：定义RealSubject和Proxy 的共用接口
RealSubject：定义Proxy所代理的实体
Proxy：保存一个指向真实实体的引用，并提供和真实实体相同的接口
Java实现：
    package com.lbl.pojo;
    
    public interface ...]]></description><category></category></item><item><title><![CDATA[Spring使用注解开发]]></title><link>https://blog.youkuaiyun.com/lbllol365/article/details/105188724</link><guid>https://blog.youkuaiyun.com/lbllol365/article/details/105188724</guid><author>lbllol365</author><pubDate>Sun, 29 Mar 2020 22:51:51 +0800</pubDate><description><![CDATA[Spring使用注解开发
注意：

在Spring4之后，使用注解开发，必须先导入AOP的包
需要在配置文件中导入context的约束，并增加对注解的支持（两处）

指定位置进行组件扫描，只有扫描到的包中的注解才会生效：
    &lt;context:component-scan base-package="com.lbl"/&gt;

@Component
相当于注册一个Bean
@Value...]]></description><category></category></item><item><title><![CDATA[Bean的自动装配]]></title><link>https://blog.youkuaiyun.com/lbllol365/article/details/105148606</link><guid>https://blog.youkuaiyun.com/lbllol365/article/details/105148606</guid><author>lbllol365</author><pubDate>Fri, 27 Mar 2020 19:34:36 +0800</pubDate><description><![CDATA[Bean的自动装配
ByName
自动在容器上下文中查找和对象Set方法名中的属性名相同的Bean id
使用注意：

Bean id需唯一
需要无参构造器
需要注入属性的Set方法
Bean的id值要与Set方法名中的属性名相同
Bean的id值必须全部为小写

例子：
假设有一个人，有一条狗和一只猫。
    package com.lbl.pojo;
    
    public clas...]]></description><category></category></item></channel></rss>