<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[xiaxiaoying的专栏]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/xiaxiaoying2012</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; xiaxiaoying2012]]></copyright><item><title><![CDATA[springboot+rediss实现分布式定时任务]]></title><link>https://blog.youkuaiyun.com/xiaxiaoying2012/article/details/133212178</link><guid>https://blog.youkuaiyun.com/xiaxiaoying2012/article/details/133212178</guid><author>xiaxiaoying2012</author><pubDate>Sat, 23 Sep 2023 17:41:56 +0800</pubDate><description><![CDATA[【代码】springboot+rediss实现分布式定时任务。]]></description><category></category></item><item><title><![CDATA[本地布隆过滤器同步至redis]]></title><link>https://blog.youkuaiyun.com/xiaxiaoying2012/article/details/125162660</link><guid>https://blog.youkuaiyun.com/xiaxiaoying2012/article/details/125162660</guid><author>xiaxiaoying2012</author><pubDate>Tue, 07 Jun 2022 11:58:25 +0800</pubDate><description><![CDATA[本地布隆过滤器值同步redis]]></description><category></category></item><item><title><![CDATA[快速排序法实现]]></title><link>https://blog.youkuaiyun.com/xiaxiaoying2012/article/details/124969898</link><guid>https://blog.youkuaiyun.com/xiaxiaoying2012/article/details/124969898</guid><author>xiaxiaoying2012</author><pubDate>Wed, 25 May 2022 17:11:22 +0800</pubDate><description><![CDATA[public class QuickSort {
    public static void main(String[] args) {
        Integer[] arrys = new Integer[]{13,11,10,3, 7, 1,14,1, 2, 6, 5, 4,9,12};
        sort(arrys, 0, arrys.length - 1);

        System.out.println(Arrays.asList(arrys));
    }

    .]]></description><category></category></item><item><title><![CDATA[spring里面的定时任务的理解]]></title><link>https://blog.youkuaiyun.com/xiaxiaoying2012/article/details/124802550</link><guid>https://blog.youkuaiyun.com/xiaxiaoying2012/article/details/124802550</guid><author>xiaxiaoying2012</author><pubDate>Mon, 16 May 2022 18:01:04 +0800</pubDate><description><![CDATA[在用spring自带的定时任务编写业务代码时，只需要在类上面加上@Scheduled注解并配上cron表达式即可完成一个定时任务的开发，那么这个注解的背后原理是什么样的呢？

其实spring并没有自创什么定时任务处理器，它也是用的java提供的ScheduledThreadPoolExecutor这个类实现的定时任务，所以搞清楚这个类的实现原理，也就明白了spring的定时任务的实现原理

首先看一下ScheduledThreadPoolExecutor的继承关系



可以看到这个类本身就是一个Thre]]></description><category></category></item><item><title><![CDATA[通过反射对比两个对象值是否相同]]></title><link>https://blog.youkuaiyun.com/xiaxiaoying2012/article/details/123882762</link><guid>https://blog.youkuaiyun.com/xiaxiaoying2012/article/details/123882762</guid><author>xiaxiaoying2012</author><pubDate>Thu, 31 Mar 2022 20:43:05 +0800</pubDate><description><![CDATA[适用情况：

两个对象属于同一个类，如果类没有重写equals方法，可通过反射对比对象属性值。如果对象的属性里面包含了数组、List、Set或者Map的时候，只会按顺序去对比这些集合里面的值，

比如里面对象里面有一个List属性，里面的值是 a、b，另外一个对象的属性值是b、a，虽然两个对象的List属性的值都是a、b，但是因为顺序不同，所以这里判断这两个对象值是不同的。




public class BeanCompareUtils {
    private static final Logger]]></description><category></category></item><item><title><![CDATA[spring事务理解]]></title><link>https://blog.youkuaiyun.com/xiaxiaoying2012/article/details/123052541</link><guid>https://blog.youkuaiyun.com/xiaxiaoying2012/article/details/123052541</guid><author>xiaxiaoying2012</author><pubDate>Mon, 21 Feb 2022 18:14:13 +0800</pubDate><description><![CDATA[spring事务使用方式：

1、通过注解的方式：@Transactional

在需要配置数据库事务的方法上加上上面的注解即可使用spring事务

2、使用事务模板代码创建事务

源码解读：

比如在使用@Transactional注解时候，spring框架通过aop的方式拦截带有@Transactional注解的方法，解析@Transactional注解里面配置的事务传播方式、事务隔离级别等信息

源码实现：org.springframework.transaction.interceptor.Tra]]></description><category></category></item><item><title><![CDATA[字符串转LocalDateTime]]></title><link>https://blog.youkuaiyun.com/xiaxiaoying2012/article/details/123046337</link><guid>https://blog.youkuaiyun.com/xiaxiaoying2012/article/details/123046337</guid><author>xiaxiaoying2012</author><pubDate>Mon, 21 Feb 2022 14:33:32 +0800</pubDate><description><![CDATA[在使用DateTimeFormatter将字符串转成LocalDateTime时，“时”要用“HH”表示，不然转换报错

例（成功）：


LocalDateTime dateTime=LocalDateTime.parse("2021-01-02 10:00:00", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));



如下则报错：


LocalDateTime dateTime=LocalDateTime.parse("2021-01-02 ]]></description><category></category></item><item><title><![CDATA[lettuce执行原理]]></title><link>https://blog.youkuaiyun.com/xiaxiaoying2012/article/details/120087321</link><guid>https://blog.youkuaiyun.com/xiaxiaoying2012/article/details/120087321</guid><author>xiaxiaoying2012</author><pubDate>Fri, 03 Sep 2021 18:06:57 +0800</pubDate><description><![CDATA[io.lettuce.core.protocol.AsyncCommand 命令
io.lettuce.core.FutureSyncInvocationHandler 执行具体command命令的地方
io.lettuce.core.protocol.CommandHandler 向redis服务器发送指令/从redis服务器那儿接收指令



lettuce客户端通过io.lettuce.core.protocol.CommandHandler向redis服务器发送指令，并接收redis服务器返回的消息]]></description><category></category></item><item><title><![CDATA[ReentrantLock获取锁和释放锁]]></title><link>https://blog.youkuaiyun.com/xiaxiaoying2012/article/details/119801187</link><guid>https://blog.youkuaiyun.com/xiaxiaoying2012/article/details/119801187</guid><author>xiaxiaoying2012</author><pubDate>Thu, 19 Aug 2021 14:25:26 +0800</pubDate><description><![CDATA[ReentrantLock分为公平锁和非公平锁，也就是FairSync(公平同步器)和NonfairSync(非公平同步器)这两个同步器来实现公平锁和非公平锁
FairSync和和NonfairSync都是集成AQS这个抽象队列同步器，主要是实现了AQS的tryAcquire这个方法，而这个方法就是获取锁资源，当这个方法返回true时表示当前线程获取到锁了，如果返回false则表示当前线程没有获取到锁，需要将当前线程加到获取锁的等待队列里面去。而FairSync和和NonfairSync这两个同步器的try]]></description><category></category></item><item><title><![CDATA[C#发送邮件]]></title><link>https://blog.youkuaiyun.com/xiaxiaoying2012/article/details/114633454</link><guid>https://blog.youkuaiyun.com/xiaxiaoying2012/article/details/114633454</guid><author>xiaxiaoying2012</author><pubDate>Wed, 10 Mar 2021 14:00:32 +0800</pubDate><description><![CDATA[///邮件内容实体类
public class Email
    {

        /// &lt;summary&gt;
        /// 接受人账号
        /// &lt;/summary&gt;
        public string[] To { get; set; }

        /// &lt;summary&gt;
        /// 抄送
        /// &lt;/summary&gt;
        public string[] CC { .]]></description><category></category></item><item><title><![CDATA[Spring AOP的底层原理分析]]></title><link>https://blog.youkuaiyun.com/xiaxiaoying2012/article/details/113743068</link><guid>https://blog.youkuaiyun.com/xiaxiaoying2012/article/details/113743068</guid><author>xiaxiaoying2012</author><pubDate>Sun, 07 Feb 2021 17:42:15 +0800</pubDate><description><![CDATA[一般我们在开发springboot项目的时候通过在类上面标注@Aspect这个注释就可以实现一个AOP的功能，那这背后的实现原理是什么呢？

首先我们来写一个小样例

1、新建一个Aspect拦截类


@Component
@Aspect
public class MyAspect {
    @Pointcut("execution(* y.com.testapp.*.*(..))")
    public void point(){}

    @Before("point()")
    publi]]></description><category></category></item><item><title><![CDATA[spring 异步编程之 @Async 的执行过程分析]]></title><link>https://blog.youkuaiyun.com/xiaxiaoying2012/article/details/113698548</link><guid>https://blog.youkuaiyun.com/xiaxiaoying2012/article/details/113698548</guid><author>xiaxiaoying2012</author><pubDate>Fri, 05 Feb 2021 17:35:32 +0800</pubDate><description><![CDATA[spring异步编程，通过在配置类上添加@EnableAsync注解，并在需要进行异步执行的方法上添加@Async注解即可实现异步变成。先上一个例子



测试

a、不获取异步方法的结果



先不获取异步方法的结果，看代码执行结果



可以看到主线程一下在就运行完了，等了3秒过后异步方法也执行完了，说明main方法所在的主线程和异步方法不在同一个线程上执行

b、当获取异步方法的结果



运行结果



可以看到当主线程获取异步方法的结果的时候，主线程会被阻塞。

2、分析

debug调试一下上面]]></description><category></category></item><item><title><![CDATA[Future实现一个简单的异步功能]]></title><link>https://blog.youkuaiyun.com/xiaxiaoying2012/article/details/113630479</link><guid>https://blog.youkuaiyun.com/xiaxiaoying2012/article/details/113630479</guid><author>xiaxiaoying2012</author><pubDate>Thu, 04 Feb 2021 11:27:03 +0800</pubDate><description><![CDATA[在使用ThreadPoolExecutor构建线程池的时候我们可以通过调用submit()方法得到一个Future的结果，这样就实现了一个异步调用方法的功能了，现在我们自己试着来实现一个简单的异步方法

1、首先来看一下Future这个接口里面有哪些内容



里面比较重点的有get()和get(long,TimeUnit)这个两个方法，这两个方法也就是我们异步得到执行结果的关键点咯

2、编写具体的实例


public class FutureTest {
    volatile boolean  i]]></description><category></category></item><item><title><![CDATA[Hystrix用到的几个技术]]></title><link>https://blog.youkuaiyun.com/xiaxiaoying2012/article/details/113624280</link><guid>https://blog.youkuaiyun.com/xiaxiaoying2012/article/details/113624280</guid><author>xiaxiaoying2012</author><pubDate>Thu, 04 Feb 2021 09:49:34 +0800</pubDate><description><![CDATA[首先Hystrix用到了AOP、动态代理、观察者模式、命令模式等几个技术和方案

首先来说说动态代理的实现

1、动态代理

a、新建一个被@HystrixCommand注解的服务类



b、新建一个Controller用来接收前端Request请求



上图中 HelloService利用spring的注解来生成实例

c、通过浏览器访问http://localhost:{port}/ribbon/test这个路径的请求，当请求进来是dubug看helloService实例对象



可以看到生成的.]]></description><category></category></item><item><title><![CDATA[装饰器模式和代理模式]]></title><link>https://blog.youkuaiyun.com/xiaxiaoying2012/article/details/113512783</link><guid>https://blog.youkuaiyun.com/xiaxiaoying2012/article/details/113512783</guid><author>xiaxiaoying2012</author><pubDate>Mon, 01 Feb 2021 14:03:45 +0800</pubDate><description><![CDATA[1、装饰器模式：动态地给一个对象添加一些额外的职责。重点是调用者主动给目标对象动态新增功能

2、代理模式：为其他对象提供一种代理以控制对这个对象的访问。重点是调用者不用知道目标对象是什么，是怎么创建的，只需要告诉代理对象自己需要什么。

实现方式：

a、装饰器模式：

 1、新增一个接口，接口就一个方法表示要向数据库插入数据


public interface DB {
    /**
     * 向数据库中插入一个记录
     * @param value
     */
    void ..]]></description><category></category></item><item><title><![CDATA[springboot--实现自定义包的自动注册bean功能]]></title><link>https://blog.youkuaiyun.com/xiaxiaoying2012/article/details/112246787</link><guid>https://blog.youkuaiyun.com/xiaxiaoying2012/article/details/112246787</guid><author>xiaxiaoying2012</author><pubDate>Tue, 05 Jan 2021 17:49:15 +0800</pubDate><description><![CDATA[当我们自己生成一个springboot项目的jar包的时候，假设我们在另外一个springboot项目里面引用我们生成的jar包，如何在这个项目启动的时候自动注册jar包里面的bean呢？

方式1：

在生成包的时候在META-INF这个文件夹里面生成一个spring.factories文件，在这个文件里面注册我们的config配置类

方式2：

使用@Enable注解的方式



实现过程

方式1：通过spring.factories文件注册

1、构建一个spring项目 autoconfigt.]]></description><category></category></item><item><title><![CDATA[多线程 状态 锁 的理解]]></title><link>https://blog.youkuaiyun.com/xiaxiaoying2012/article/details/105065771</link><guid>https://blog.youkuaiyun.com/xiaxiaoying2012/article/details/105065771</guid><author>xiaxiaoying2012</author><pubDate>Tue, 24 Mar 2020 10:46:12 +0800</pubDate><description><![CDATA[1、线程状态有：a、创建状态；b、就绪状态；c、运行状态；d、等待状态；e、阻塞状态；f、结束状态

其中等待状态和阻塞状态理解：当前线程调用了wait()、sleep()、join()等方法的时候会进入到等待状态。进入等待状态的线程没有机会获取cpu的使用权，只有执行了唤醒操作或者定时时间(执行了wait(时间)、sleep(时间)进入等待状态的)到了，等待状态的线程就会进入就绪状态，才有机会获...]]></description><category></category></item><item><title><![CDATA[NPOI实现 Excel导入导出]]></title><link>https://blog.youkuaiyun.com/xiaxiaoying2012/article/details/104796737</link><guid>https://blog.youkuaiyun.com/xiaxiaoying2012/article/details/104796737</guid><author>xiaxiaoying2012</author><pubDate>Wed, 11 Mar 2020 15:11:24 +0800</pubDate><description><![CDATA[实现对象集合写入到Excel和Excel数据读出到对象集合的功能

/// &lt;summary&gt;
  /// 自定义列属性
  /// &lt;/summary&gt;
  public class ColumnAttribute:Attribute
  {
    public string ColumnName { get; set; }

    p...]]></description><category></category></item><item><title><![CDATA[泛型T和通配符？的理解]]></title><link>https://blog.youkuaiyun.com/xiaxiaoying2012/article/details/104635259</link><guid>https://blog.youkuaiyun.com/xiaxiaoying2012/article/details/104635259</guid><author>xiaxiaoying2012</author><pubDate>Tue, 03 Mar 2020 16:55:51 +0800</pubDate><description><![CDATA[通过一个例子说明

新建一个动物基类 Animal


public class Animal {
}

新建两个子类（狗和猫）


public class Dog extends Animal {
}


public class Cat extends Animal {
}

新建一个动物类型（Animal）的的类集合（假设这个类集合实现了集合功能）


public  class Ani...]]></description><category></category></item><item><title><![CDATA[SignalR+Redis做横向扩展（集群）]]></title><link>https://blog.youkuaiyun.com/xiaxiaoying2012/article/details/103250350</link><guid>https://blog.youkuaiyun.com/xiaxiaoying2012/article/details/103250350</guid><author>xiaxiaoying2012</author><pubDate>Tue, 26 Nov 2019 10:21:25 +0800</pubDate><description><![CDATA[问题背景：当SignalR应用部署在一台服务器的时候，随着用户量的增加，服务器的承载能力肯定会达到瓶颈，这时候就需要考虑多部署几台服务器来缓解压力

解决办法：多台服务器部署SignalR应用，一台服务器部署Redis服务



如上图，一台SignalR服务器对应一个用户群，SignalR应用服务器和Redis服务器之间采用发布-订阅模式。当用户群1的用户向用户群2的用户发送消息的时候，消息先到...]]></description><category></category></item></channel></rss>