<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[yangchenhui666的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/yangchenhui666</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; yangchenhui666]]></copyright><item><title><![CDATA[模版模式+策略模式重构订单]]></title><link>https://blog.youkuaiyun.com/yangchenhui666/article/details/120175273</link><guid>https://blog.youkuaiyun.com/yangchenhui666/article/details/120175273</guid><author>yangchenhui666</author><pubDate>Wed, 08 Sep 2021 10:58:54 +0800</pubDate><description><![CDATA[模版模式+策略模式重构订单
1、SOLID设计原则
S：Single Responsibility Principle（单一职责）
一个类只负责一个功能领域中的相应职责。
O：Open Closed Principle（开闭原则）
对扩展开放，对修改关闭。
L：Liskov Substitution Principle（里氏替换）
所有引用基类的地方必须能透明地使用其子类的对象。
I：Interface Segregation Principle（接口隔离）
类之间的依赖关系应该建立在最小的接口上。
D：D]]></description><category></category></item><item><title><![CDATA[Guava、Redis实现二级缓存]]></title><link>https://blog.youkuaiyun.com/yangchenhui666/article/details/108970061</link><guid>https://blog.youkuaiyun.com/yangchenhui666/article/details/108970061</guid><author>yangchenhui666</author><pubDate>Thu, 08 Oct 2020 23:33:55 +0800</pubDate><description><![CDATA[最近在重构老服务，在公共配置服务当中，博主自己设计了一个二级缓存的简易框架，支持一级缓存及二级缓存的技术替换，例如将Guava换成Caffeine，或者将Redis换成Memcached。

缓存是服务端提高接口访问速度和减轻数据库压力的利器，对于热点数据的缓存是很有必要的。

缓存也有分类：

本地缓存：Guava，Caffeine，Ehcache或者自己简单的使用HashMap实现；
	分布式缓存：Redis，Memcached等。
虽然分布式缓存（redis等）单节点QPS已经到达10W级别，但是相对]]></description><category></category></item><item><title><![CDATA[Redis数据结构String及Hash存储大小及读取性能对比]]></title><link>https://blog.youkuaiyun.com/yangchenhui666/article/details/108786196</link><guid>https://blog.youkuaiyun.com/yangchenhui666/article/details/108786196</guid><author>yangchenhui666</author><pubDate>Fri, 25 Sep 2020 00:46:10 +0800</pubDate><description><![CDATA[最近把公司的公共配置服务工程做了重构，并且在新的工程中加入了二级缓存，默认使用Guava和Redis实现。Guava作为本地一级缓存，Redis作为二级分布式缓存，并支持一二级缓存技术的替换。待工程完善之后，会再写一篇博客分享我在重构过程中的一些想法。

在使用Redis作为二级缓存的过程中，冒出了这么一个想法，我是不是可以将Hash的结构也通过String进行存储。因为Hash其实也可以转换成为String，如下图所示。



其实这样也可以通过String的数据类型达到Hash的效果，但是还是决定先从存]]></description><category></category></item><item><title><![CDATA[SpringCloud中Feign的基本使用]]></title><link>https://blog.youkuaiyun.com/yangchenhui666/article/details/108611156</link><guid>https://blog.youkuaiyun.com/yangchenhui666/article/details/108611156</guid><author>yangchenhui666</author><pubDate>Tue, 15 Sep 2020 22:37:40 +0800</pubDate><description><![CDATA[在使用SpringCloud生态的时候，微服务之间会进行调用，一般我们有两个选择。一是选择使用RestTemplate，二是使用Feign。

在RestTemplate上加上@LoadBalanced注解，即可生成Ribbon的代理对象，直接实现负载均衡。Feign直接使用声明式调用，更加符合大家平时写接口的习惯，下面主要针对Feign做下介绍。

1、依赖引入


&lt;dependency&gt;&lt;!-- consul 服务发现 --&gt;
    &lt;groupId&gt;org.sp]]></description><category></category></item><item><title><![CDATA[Spring源码（三）——循环依赖及Bean的初始化]]></title><link>https://blog.youkuaiyun.com/yangchenhui666/article/details/107745244</link><guid>https://blog.youkuaiyun.com/yangchenhui666/article/details/107745244</guid><author>yangchenhui666</author><pubDate>Sun, 02 Aug 2020 23:15:51 +0800</pubDate><description><![CDATA[上一篇博客（https://blog.youkuaiyun.com/yangchenhui666/article/details/107496324）已经讲到了XML文件是如何一步步变为BeanDefinition的。这篇主要讲解refresh()中另外一个非常重要的方法finishBeanFactoryInitialization(beanFactory)，该方法中会初始化所有的非惰性的Bean。







ps：（今天先将完整的图发出来，太困了，明天再写）












...]]></description><category></category></item><item><title><![CDATA[Spring源码（二）——从配置文件到BeanDefinition]]></title><link>https://blog.youkuaiyun.com/yangchenhui666/article/details/107496324</link><guid>https://blog.youkuaiyun.com/yangchenhui666/article/details/107496324</guid><author>yangchenhui666</author><pubDate>Wed, 22 Jul 2020 00:20:15 +0800</pubDate><description><![CDATA[上一篇博客（https://blog.youkuaiyun.com/yangchenhui666/article/details/107476319）中说到Spring上下文初始化中最重要的方法refresh()，这一篇来大概介绍下refresh()当中一个很重要的方法obtainFreshBeanFactory()，在这个方法中，会将配置文件中的配置信息或者配置类中的信息转化为BeanDefinition。

在学习Spring的时候，我们往往写过这样的代码：


ClassPathXmlApplicationCon]]></description><category></category></item><item><title><![CDATA[Spring源码（一）——Spring上下文ClassPathXmlApplicationContext]]></title><link>https://blog.youkuaiyun.com/yangchenhui666/article/details/107476319</link><guid>https://blog.youkuaiyun.com/yangchenhui666/article/details/107476319</guid><author>yangchenhui666</author><pubDate>Mon, 20 Jul 2020 23:10:46 +0800</pubDate><description><![CDATA[众所周知，Spring的两大基础特性是IOC（Inversion of control）和AOP（Aspect-oriented programming），IOC通常有两种实现方式，依赖查找和依赖注入。

依赖查找：需要容器提供查找方法，例如:BeanFactory#getBean(String name)
	依赖注入：不需要使用API，可以直接在配置文件中定义好通过名称或者类型进行自动注入
Spring中两种都有实现，同时依赖注入的时候，又可以分为构造器注入或者Setter方法注入。

在企业环境中，我们]]></description><category></category></item><item><title><![CDATA[三种观察者设计模式实现]]></title><link>https://blog.youkuaiyun.com/yangchenhui666/article/details/106558782</link><guid>https://blog.youkuaiyun.com/yangchenhui666/article/details/106558782</guid><author>yangchenhui666</author><pubDate>Thu, 04 Jun 2020 22:42:08 +0800</pubDate><description><![CDATA[观察者设计模式又被称作发布订阅模式，是定义对象之间一对多关系的一种设计模式。当一个对象A发生改变的时候，关注A的其他对象也会得到通知并发生改变。

观察者设计模式在项目中的使用是比较多的，例如一个经典的场景：用户注册成功之后，会发生赠送相应的积分（A），赠送优惠券（B），发送注册成功邮件（C）等动作。如果我们使用传统的调用，那么注册的这个接口，就要调用A，B，C三个接口。但是其实对于用户中心来说，是不关注积分赠送，优惠券赠送这类问题的。并且，如果以后产品又提了一个需求，用户注册成功之后，还得发送短信，生成一]]></description><category></category></item><item><title><![CDATA[Springboot项目集成Shedlock、Redis]]></title><link>https://blog.youkuaiyun.com/yangchenhui666/article/details/106082919</link><guid>https://blog.youkuaiyun.com/yangchenhui666/article/details/106082919</guid><author>yangchenhui666</author><pubDate>Tue, 12 May 2020 19:54:39 +0800</pubDate><description><![CDATA[在一个系统开发的初期，通常都是一个单体的架构，后面随着业务的发展，单体架构已经扛不住业务的压力。慢慢的会向微服务的方向去发展，在多节点的情况下，就会出现多个节点的定时任务可能会重复执行的情况。

1、Shedlock基本介绍

相对于xxl-job，Shedlock的集成更加的轻量，同时也不需要对服务进行过多的改造，我们当时在技术选型的时候就是使用Shedlock。

Shedlock从严格意义上来说，并不是一个分布式任务调度框架，设计的初衷也不是作为一个调度框架，而是一种分布式锁。所谓的分布式锁，解决的核]]></description><category></category></item><item><title><![CDATA[RocketMq相同topic不同tag踩坑]]></title><link>https://blog.youkuaiyun.com/yangchenhui666/article/details/104587147</link><guid>https://blog.youkuaiyun.com/yangchenhui666/article/details/104587147</guid><author>yangchenhui666</author><pubDate>Sun, 01 Mar 2020 09:54:04 +0800</pubDate><description><![CDATA[RocketMq在我们项目中一般用于系统间的解耦，有时候会使用不同的Consumer消费不同的tag，但是博主昨天踩了个坑。

情景如下：



两个consumer接收相同的topic，不同tag的消息，但是当处方系统发送tagA的消息的时候，consumer2消费了，本来consumer2应该是要丢弃掉的，但是却消费了，主要问题就是配置了相同的Group。

RocketMq消费者如果针对同一...]]></description><category></category></item><item><title><![CDATA[mysql执行计划及sql优化]]></title><link>https://blog.youkuaiyun.com/yangchenhui666/article/details/104456194</link><guid>https://blog.youkuaiyun.com/yangchenhui666/article/details/104456194</guid><author>yangchenhui666</author><pubDate>Sun, 23 Feb 2020 20:57:15 +0800</pubDate><description><![CDATA[sql优化主要就是针对表的索引进行优化，同时我们需要使用explain来看数据库到底是如何执行我们写的sql的。

为什么索引能够帮助我们提高sql的查询速度？如下图所示：



在mysql5.5之后，就默认使用InnoDB为存储引擎，InnoDB使用B+树实现，B+树的数据全部存储于叶子节点当中，查询任意数据的此处都为N（树的高度）。如上图所示，使用索引查找只需要3次寻找，通过索引当中的地址，...]]></description><category></category></item><item><title><![CDATA[Java锁基本使用及AQS]]></title><link>https://blog.youkuaiyun.com/yangchenhui666/article/details/104343029</link><guid>https://blog.youkuaiyun.com/yangchenhui666/article/details/104343029</guid><author>yangchenhui666</author><pubDate>Mon, 17 Feb 2020 16:27:31 +0800</pubDate><description><![CDATA[synchronized可以解决Java的并发问题，
































]]></description><category></category></item><item><title><![CDATA[Java线程状态及线程通信]]></title><link>https://blog.youkuaiyun.com/yangchenhui666/article/details/104244349</link><guid>https://blog.youkuaiyun.com/yangchenhui666/article/details/104244349</guid><author>yangchenhui666</author><pubDate>Mon, 10 Feb 2020 18:59:17 +0800</pubDate><description><![CDATA[目录

1、线程状态

2、线程终止

2.1、interrupt()

2.2、使用volatile标志位

3、线程通信

3.1、等待/通知机制

3.2、suspend()/resume()

3.3、wait()/notify()

3.4、LockSupport.park()/LockSupport.unpark()

3.5、Thread.join()

线程是系统调度的最小单元，c...]]></description><category></category></item><item><title><![CDATA[Java基本内存模型 & synchronized & volatile]]></title><link>https://blog.youkuaiyun.com/yangchenhui666/article/details/104209526</link><guid>https://blog.youkuaiyun.com/yangchenhui666/article/details/104209526</guid><author>yangchenhui666</author><pubDate>Sun, 09 Feb 2020 17:16:10 +0800</pubDate><description><![CDATA[目录

1、Java内存模型

1.1、方法区

1.2、堆内存

1.3、虚拟机栈

1.4、本地方法栈

1.5、程序计数器

2、volatile

2.1、volatile的特性

2.2、volatile的使用

3、synchronized

3.1、synchronized的特性

3.2、锁升级

4、volatile与synchronized的区别

synchronized在并...]]></description><category></category></item><item><title><![CDATA[Java BIO & Java NIO]]></title><link>https://blog.youkuaiyun.com/yangchenhui666/article/details/102779853</link><guid>https://blog.youkuaiyun.com/yangchenhui666/article/details/102779853</guid><author>yangchenhui666</author><pubDate>Mon, 28 Oct 2019 14:40:01 +0800</pubDate><description><![CDATA[Java BIO &amp; Java NIO

在JDK1.4之前，Java的所有socket通信都是基于同步阻塞（BIO）模式，BIO模式在性能和可靠性上存在这巨大的瓶颈，所以在JDK1.4推出了NIO类库，支持非阻塞IO。

1、BIO

Java BIO通信基于socket + io，其中serverScoket.accept()是一个阻塞方法，会一直等到有客户端socket连接进入才会返...]]></description><category></category></item><item><title><![CDATA[Paxos&Zookeeper ZAB协议]]></title><link>https://blog.youkuaiyun.com/yangchenhui666/article/details/98653137</link><guid>https://blog.youkuaiyun.com/yangchenhui666/article/details/98653137</guid><author>yangchenhui666</author><pubDate>Tue, 13 Aug 2019 16:14:25 +0800</pubDate><description><![CDATA[Paxos &amp; Zookeeper ZAB协议
小灰灰上一篇博客简单介绍了2PC和3PC分布式系统一致性协议（https://blog.youkuaiyun.com/yangchenhui666/article/details/98512432） ，但是最重要的分布式一致性协议还是Paxos协议。
Zookeeper中使用的ZAB协议就是Paxos的一个变种协议。
Paxos
在分布式系统当中，比较简...]]></description><category></category></item><item><title><![CDATA[分布式系统一致性协议：2PC&3PC]]></title><link>https://blog.youkuaiyun.com/yangchenhui666/article/details/98512432</link><guid>https://blog.youkuaiyun.com/yangchenhui666/article/details/98512432</guid><author>yangchenhui666</author><pubDate>Tue, 06 Aug 2019 15:54:25 +0800</pubDate><description><![CDATA[分布式系统一致性协议
在分布式系统当中，一致性，可用性，分区容错性排列组合，成为CAP理论中的三种情况，如果有不了解的同学可以先参照小灰灰之前写过的一篇博客简单了解一下（https://blog.youkuaiyun.com/yangchenhui666/article/details/92014829）。
对于一个分布式系统而言，分区容错性是一个最基本的要求。服务必然会被部署到不同的网络节点，否则就不存在所...]]></description><category></category></item><item><title><![CDATA[Zookeeper基本介绍&Zookeeper分布式锁]]></title><link>https://blog.youkuaiyun.com/yangchenhui666/article/details/98475104</link><guid>https://blog.youkuaiyun.com/yangchenhui666/article/details/98475104</guid><author>yangchenhui666</author><pubDate>Sun, 04 Aug 2019 22:39:26 +0800</pubDate><description><![CDATA[Zookeeper基本介绍
zookeeper应用场景

配置中心
命名服务
Master选举
集群管理
分布式队列
分布式锁

zookeeper数据模型
层次命名空间
从官网上可以看到zookeeper的数据模型图如下：


类似Linux文件系统，以（/）为 根
节点既可以存储数据，也可以可以存储子节点，所以可以认为zookeeper节点既是文件夹，其本身也是一个文件
节点的路径 总是表示为...]]></description><category></category></item><item><title><![CDATA[数据库事务隔离级别]]></title><link>https://blog.youkuaiyun.com/yangchenhui666/article/details/95800618</link><guid>https://blog.youkuaiyun.com/yangchenhui666/article/details/95800618</guid><author>yangchenhui666</author><pubDate>Sat, 13 Jul 2019 22:19:11 +0800</pubDate><description><![CDATA[之前一直说数据库的四个特性ACID，但是一直都不太明白，今天画了一幅图，结合实际代码，操作一遍，感觉清楚多了。

大家可以写个简单代码，打个断点调试下就清楚很多了。

...]]></description><category></category></item><item><title><![CDATA[分布式CAP理论简介]]></title><link>https://blog.youkuaiyun.com/yangchenhui666/article/details/92014829</link><guid>https://blog.youkuaiyun.com/yangchenhui666/article/details/92014829</guid><author>yangchenhui666</author><pubDate>Fri, 14 Jun 2019 22:32:14 +0800</pubDate><description><![CDATA[CAP
基本含义

1、一致性（Consistency）
对于单个节点，读操作总是能够读取到之前写入的值。
2、可用性（Available）
读写操作在单台机器发生故障的情况下仍然能够正常执行。返回成功或者失败都表示可用。
3、分区容错性（Partition  Tolerance）
机器故障、网络故障、机房停电等异常情况下仍然能够满足一致性和可用性。
问题
1、分区容错性和可用性有什么区别？
分区...]]></description><category></category></item></channel></rss>