<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[pyd950812的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/pyd950812</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; pyd950812]]></copyright><item><title><![CDATA[mysql Left Join on条件 where条件的用法区别]]></title><link>https://blog.youkuaiyun.com/pyd950812/article/details/132432658</link><guid>https://blog.youkuaiyun.com/pyd950812/article/details/132432658</guid><author>pyd950812</author><pubDate>Tue, 22 Aug 2023 17:35:56 +0800</pubDate><description><![CDATA[执行结果。]]></description><category></category></item><item><title><![CDATA[Spring-Retry实现及原理]]></title><link>https://blog.youkuaiyun.com/pyd950812/article/details/131002046</link><guid>https://blog.youkuaiyun.com/pyd950812/article/details/131002046</guid><author>pyd950812</author><pubDate>Fri, 02 Jun 2023 10:38:47 +0800</pubDate><description><![CDATA[重试，其实我们其实很多时候都需要的，为了保证容错性，可用性，一致性等。一般用来应对外部系统的一些不可预料的返回、异常等，特别是网络延迟，中断等情况。还有在现在流行的微服务治理框架中，通常都有自己的重试与超时配置，比如dubbo可以设置retries=1，timeout=500调用失败只重试1次，超过500ms调用仍未返回则调用失败。如果我们要做重试，要为特定的某个操作做重试功能，则要硬编码，大概逻辑基本都是写个循环，根据返回或异常，计数失败次数，然后设定退出条件。]]></description><category></category></item><item><title><![CDATA[Java常用设计模式]]></title><link>https://blog.youkuaiyun.com/pyd950812/article/details/128000002</link><guid>https://blog.youkuaiyun.com/pyd950812/article/details/128000002</guid><author>pyd950812</author><pubDate>Wed, 23 Nov 2022 14:36:01 +0800</pubDate><description><![CDATA[Java23种设计模式]]></description><category></category></item><item><title><![CDATA[设计模式分享]]></title><link>https://blog.youkuaiyun.com/pyd950812/article/details/127321389</link><guid>https://blog.youkuaiyun.com/pyd950812/article/details/127321389</guid><author>pyd950812</author><pubDate>Mon, 17 Oct 2022 14:37:26 +0800</pubDate><description><![CDATA[Java常用设计模式介绍]]></description><category></category></item><item><title><![CDATA[MySQL特性两次写（double write）的在故障恢复时几种情况的分析【双写】【doublewrite buffer】]]></title><link>https://blog.youkuaiyun.com/pyd950812/article/details/126730937</link><guid>https://blog.youkuaiyun.com/pyd950812/article/details/126730937</guid><author>pyd950812</author><pubDate>Tue, 06 Sep 2022 18:34:32 +0800</pubDate><description><![CDATA[msql]]></description><category></category></item><item><title><![CDATA[Redis集群方案]]></title><link>https://blog.youkuaiyun.com/pyd950812/article/details/126121750</link><guid>https://blog.youkuaiyun.com/pyd950812/article/details/126121750</guid><author>pyd950812</author><pubDate>Tue, 02 Aug 2022 14:33:09 +0800</pubDate><description><![CDATA[redis集群整理]]></description><category></category></item><item><title><![CDATA[设计模式之观察者模式]]></title><link>https://blog.youkuaiyun.com/pyd950812/article/details/107150606</link><guid>https://blog.youkuaiyun.com/pyd950812/article/details/107150606</guid><author>pyd950812</author><pubDate>Mon, 06 Jul 2020 10:40:01 +0800</pubDate><description><![CDATA[一、观察者模式

 观察者模式（Observer），又叫发布-订阅模式（Publish/Subscribe），定义对象间一种一对多的依赖关系，使得每当一个对象改变状态，则所有依赖于它的对象都会得到通知并自动更新。UML结构图如下：

             

其中，Subject类是主题，它把所有对观察者对象的引用文件存在了一个聚集里，每个主题都可以有任何数量的观察者。抽象主题提供了一个接口，可以增加和删除观察者对象；Observer类是抽象观察者，为所有的具体观察者定...]]></description><category></category></item><item><title><![CDATA[Apache RocketMQ源码学习之生产者发送消息]]></title><link>https://blog.youkuaiyun.com/pyd950812/article/details/106554533</link><guid>https://blog.youkuaiyun.com/pyd950812/article/details/106554533</guid><author>pyd950812</author><pubDate>Thu, 04 Jun 2020 18:00:01 +0800</pubDate><description><![CDATA[一、消息发送方式

RocketMQ 支持常见的三种发送方式：SYNC、ASYNC、ONEWAY

SYNC : 同步的发送方式，会等待发送结果后才返回。

ASYNC : 异步的发送方式，发送完后，立刻返回。

ONEWAY : 发出去后，什么都不管直接返回。



二、RocketMQ生产者发送消息流程




...]]></description><category></category></item><item><title><![CDATA[Apache RocketMQ源码学习之生产者启动]]></title><link>https://blog.youkuaiyun.com/pyd950812/article/details/106551285</link><guid>https://blog.youkuaiyun.com/pyd950812/article/details/106551285</guid><author>pyd950812</author><pubDate>Thu, 04 Jun 2020 17:40:30 +0800</pubDate><description><![CDATA[一、RocketMQ核心组件以及关系

核心组件: producer：消息生产者，生产者的作用就是将消息发送到 MQ 
	producer group：生产者组，简单来说就是多个发送同一类消息的生产者称之为一个生产者组
	consumer ：消息消费者，简单来说，消费 MQ 上的消息的应用程序就是消费者 
	consumer group：消费者组，和生产者类似，消费同一类消息的多个 consumer 实例组成一个消费者组 
	topic：是一种消息的逻辑分类
	message : Message 是...]]></description><category></category></item><item><title><![CDATA[SpringBoot使用Sharding-JDBC分库分表实战]]></title><link>https://blog.youkuaiyun.com/pyd950812/article/details/106406898</link><guid>https://blog.youkuaiyun.com/pyd950812/article/details/106406898</guid><author>pyd950812</author><pubDate>Thu, 28 May 2020 16:08:23 +0800</pubDate><description><![CDATA[一、准备工作

1.准备两个database、4张table





二、引入相关maven


        &lt;!-- druid --&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;com.alibaba&lt;/groupId&gt;
            &lt;artifactId&gt;druid&lt;/artifactId&gt;
            &lt;version&gt;1.1.9&lt;/ve.]]></description><category></category></item><item><title><![CDATA[设计模式之责任链模式]]></title><link>https://blog.youkuaiyun.com/pyd950812/article/details/106207849</link><guid>https://blog.youkuaiyun.com/pyd950812/article/details/106207849</guid><author>pyd950812</author><pubDate>Tue, 19 May 2020 09:51:46 +0800</pubDate><description><![CDATA[概念

职责链模式（Chain of Responsibility）

使多个对象都有机会处理同一个请求，从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链，并沿着这条链传递该请求，直到有一个对象处理它为止。





责任链设计模式中的角色

Handler

抽象处理者（定义一个处理请求的接口，接口可以定义出一个方法，以设定和返回对下家的引用。通常由一个抽象类或接口实现）

Concrete Handler

具体处理者（具体请求者在接受到请求后，如果满足条件则自己处理请求，否则将请求传.]]></description><category></category></item><item><title><![CDATA[记一次Java并发本地内存、主内存相关]]></title><link>https://blog.youkuaiyun.com/pyd950812/article/details/105992403</link><guid>https://blog.youkuaiyun.com/pyd950812/article/details/105992403</guid><author>pyd950812</author><pubDate>Fri, 08 May 2020 13:50:57 +0800</pubDate><description><![CDATA[一、先上一段代码：


package com.wx.wxjob;

public class Test {
    
    public static void main(String[] args) {
        Aobing a = new Aobing();
        a.start();
        for (; ; ) {
            if (a.isFl...]]></description><category></category></item><item><title><![CDATA[代码优化之抽象类的引入]]></title><link>https://blog.youkuaiyun.com/pyd950812/article/details/104842641</link><guid>https://blog.youkuaiyun.com/pyd950812/article/details/104842641</guid><author>pyd950812</author><pubDate>Fri, 13 Mar 2020 16:00:46 +0800</pubDate><description><![CDATA[一、场景

  场景：有个给不同类型的数据打上标签的功能。不同数据类型生成的标签规则不一样。

二、编码实现

1、首先定义一个抽象类（统一需要实现的方法）


/**
 * FileName: AbstractMakeTagHandler
 * Author: pengyd
 * Date: 2020/3/13
 * function: 
 */
public abstract clas...]]></description><category></category></item><item><title><![CDATA[优雅的消除代码中的if-else]]></title><link>https://blog.youkuaiyun.com/pyd950812/article/details/103694242</link><guid>https://blog.youkuaiyun.com/pyd950812/article/details/103694242</guid><author>pyd950812</author><pubDate>Tue, 10 Mar 2020 16:46:18 +0800</pubDate><description><![CDATA[需求

假设有这么一个需求：

一个电商系统，当用户消费满1000 金额，可以根据用户VIP等级，享受打折优惠。
根据用户VIP等级，计算出用户最终的费用。


	普通会员 不打折
	
	
	白银会员 优惠50元
	
	
	黄金会员 8折
	
	
	白金会员 优惠50元，再打7折
	
编码实现


private static double getResult(long money, int ty...]]></description><category></category></item><item><title><![CDATA[SpringBoot项目整合Vue]]></title><link>https://blog.youkuaiyun.com/pyd950812/article/details/103784961</link><guid>https://blog.youkuaiyun.com/pyd950812/article/details/103784961</guid><author>pyd950812</author><pubDate>Tue, 31 Dec 2019 16:22:18 +0800</pubDate><description><![CDATA[一、首先需要安装vue所需环境以及基本项目架构（自行百度）

vue项目架构如图：



二、需要改动的页面

App.vue


&lt;template&gt;
  &lt;div id="app"&gt;
    &lt;img src="./assets/logo.png"&gt;
    &lt;router-view/&gt;
  &lt;/div&gt;
&lt;/templa...]]></description><category></category></item><item><title><![CDATA[catch中为什么不建议使用e.printStackTrace]]></title><link>https://blog.youkuaiyun.com/pyd950812/article/details/103717212</link><guid>https://blog.youkuaiyun.com/pyd950812/article/details/103717212</guid><author>pyd950812</author><pubDate>Thu, 26 Dec 2019 16:03:07 +0800</pubDate><description><![CDATA[为什么尽量不用e.printStackTrace

直接用e.printStackTrace来打印日志有错吗？当然不错，但是不好。主要原因有以下几点：

1、占用太多内存，造成锁死

要打印字符串输出到控制台上，需要字符串常量池所在的内存块有足够的空间。然而，因为e.printStackTrace() 语句要产生的字符串记录的是堆栈信息，太长太多，内存被填满了！大量线程产出字符串产出到一半，等待有...]]></description><category></category></item><item><title><![CDATA[利用反射重构代码]]></title><link>https://blog.youkuaiyun.com/pyd950812/article/details/103715841</link><guid>https://blog.youkuaiyun.com/pyd950812/article/details/103715841</guid><author>pyd950812</author><pubDate>Thu, 26 Dec 2019 15:10:39 +0800</pubDate><description><![CDATA[一、需求

先看代码：

两个方法几乎一模一样，唯一的区别就是传入的对象不同

二、改造

利用反射，将对象映射成map，看代码：


public Map&lt;String, Object&gt; class2Map(Object obj) {
        Class aClass = obj.getClass();
        Field[] declaredFields = a...]]></description><category></category></item><item><title><![CDATA[阿里RoceketMQ使用]]></title><link>https://blog.youkuaiyun.com/pyd950812/article/details/103715359</link><guid>https://blog.youkuaiyun.com/pyd950812/article/details/103715359</guid><author>pyd950812</author><pubDate>Thu, 26 Dec 2019 14:49:55 +0800</pubDate><description><![CDATA[一、配置文件


#该应用是否启用生产者
rocketmq:
  producer:
    isOnOff: on
    #发送同一类消息的设置为同一个group，保证唯一,默认不需要设置，rocketmq会使用ip@pid(pid代表jvm名字)作为唯一标示
    groupName: ${spring.application.name}
    #mq的nameserver地址
    ...]]></description><category></category></item><item><title><![CDATA[工厂+策略模式消除if-else]]></title><link>https://blog.youkuaiyun.com/pyd950812/article/details/103700115</link><guid>https://blog.youkuaiyun.com/pyd950812/article/details/103700115</guid><author>pyd950812</author><pubDate>Thu, 26 Dec 2019 10:59:13 +0800</pubDate><description><![CDATA[需求

代码改造：


JSONArray result = new JSONArray();
        switch (code) {
            case SUBJECT_IFACE_CODE:
                for (int i = 0, size = values.size(); i &lt; size; i++) {
                 ...]]></description><category></category></item><item><title><![CDATA[SQL中关于IN和EXISTS的用法]]></title><link>https://blog.youkuaiyun.com/pyd950812/article/details/103233324</link><guid>https://blog.youkuaiyun.com/pyd950812/article/details/103233324</guid><author>pyd950812</author><pubDate>Mon, 25 Nov 2019 10:12:57 +0800</pubDate><description><![CDATA[一、执行历程

sql语句：select * from student s where EXISTS(select stuid from score ss where ss.stuid = s.stuid)

执行顺序：

 （1）先执行：select * from student s

 （2）再执行：EXISTS(select stuid from score ss where ss.st...]]></description><category></category></item></channel></rss>