<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[lixld的专栏]]></title><description><![CDATA[记录成长路上的点滴]]></description><link>https://blog.youkuaiyun.com/lixld</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; lixld]]></copyright><item><title><![CDATA[macOS big sur Navicat Premium12.1.15 无法正常启动]]></title><link>https://blog.youkuaiyun.com/lixld/article/details/112476966</link><guid>https://blog.youkuaiyun.com/lixld/article/details/112476966</guid><author>lixld</author><pubDate>Mon, 11 Jan 2021 16:56:41 +0800</pubDate><description><![CDATA[提示信息：

“Navicat Premium”因为出现问题而无法打开

错误日志提示

Dyld Error Message:
 dyld: Using shared cache: 1E362DBC-F66C-3135-BCA0-C1BBAE12BC7C
Library not loaded: @executable_path/../Frameworks/libpq.5.dylib
 Referenced from: /Applications/Navicat Premium.app/Contents..]]></description><category></category></item><item><title><![CDATA[关于rebase]]></title><link>https://blog.youkuaiyun.com/lixld/article/details/110114311</link><guid>https://blog.youkuaiyun.com/lixld/article/details/110114311</guid><author>lixld</author><pubDate>Wed, 25 Nov 2020 10:52:01 +0800</pubDate><description><![CDATA[场景复现：

本来要在refund分支上的修改的代码，结果由于分支太多写在了queue分支上

如何恢复queue分支到提交之前的版本？？

1.git log (找到commitid)

2.git reset --hard &lt;commitid&gt;

3.任意修改一个文件

4.commit and push 此时会提示merge或者rebase

选择rebase即可
...]]></description><category></category></item><item><title><![CDATA[排序算法总结]]></title><link>https://blog.youkuaiyun.com/lixld/article/details/109702828</link><guid>https://blog.youkuaiyun.com/lixld/article/details/109702828</guid><author>lixld</author><pubDate>Sun, 15 Nov 2020 13:07:29 +0800</pubDate><description><![CDATA[原文链接https://mp.weixin.qq.com/s/HQg3BzzQfJXcWyltsgOfCQ
]]></description><category></category></item><item><title><![CDATA[有关git cherry-pick]]></title><link>https://blog.youkuaiyun.com/lixld/article/details/109294125</link><guid>https://blog.youkuaiyun.com/lixld/article/details/109294125</guid><author>lixld</author><pubDate>Tue, 27 Oct 2020 09:14:07 +0800</pubDate><description><![CDATA[事情的经过：

本来要上hotfix的代码，结果写在了其他分支 B

所以要把修改在分支B上的代码，merge到hotfix

步骤1：在分支B上执行

命令：git log

列出所以的提交日志，然后找到之前的提交的hash值类型这样

f39751209fe3371ebc16950dd3b80e2e7ee7fd69



步骤2. 切换到分支hotfix

命令 ：git cherry-pick f39751209fe3371ebc16950dd3b80e2e7ee7fd69


完美
...]]></description><category></category></item><item><title><![CDATA[二叉查找树的算法总结]]></title><link>https://blog.youkuaiyun.com/lixld/article/details/109104063</link><guid>https://blog.youkuaiyun.com/lixld/article/details/109104063</guid><author>lixld</author><pubDate>Thu, 15 Oct 2020 19:56:15 +0800</pubDate><description><![CDATA[import java.util.LinkedList;

public class BinarySearchTree {
    private Node tree;//已经准备好的二叉查找树

    //快速查找
    public Node find(int data) {
        Node p = tree;
        while (p != null) {
            if (data &lt; p.data) p = p.left;
            el..]]></description><category></category></item><item><title><![CDATA[有关于@Around @Before @After @AfterThrowing @AfterReturning执行顺序]]></title><link>https://blog.youkuaiyun.com/lixld/article/details/107449304</link><guid>https://blog.youkuaiyun.com/lixld/article/details/107449304</guid><author>lixld</author><pubDate>Sun, 19 Jul 2020 18:36:16 +0800</pubDate><description><![CDATA[其实就这么回事
]]></description><category></category></item><item><title><![CDATA[Design-pattern 创建型设计模式-Builder建造者模式]]></title><link>https://blog.youkuaiyun.com/lixld/article/details/107311507</link><guid>https://blog.youkuaiyun.com/lixld/article/details/107311507</guid><author>lixld</author><pubDate>Mon, 13 Jul 2020 12:02:03 +0800</pubDate><description><![CDATA[建造者模式|构建者模式|生成器模式

实际上，建造者模式的原理和代码实现非常简单，掌握起来并不难，难点在于应用场景。

比如，你有没有考虑过这样几个问题：直接使用构造函数或者配合 set 方法就能创建对象，为什么还需要建造者模式来创建呢？

建造者模式和工厂模式都可以创建对象，那它们两个的区别在哪里呢？

当创建一个对象是，构造函数参数很多，并且参数之间有逻辑关系。此时构造函数列表列表变的很长，代码在可读性和易用性上变差。在使用构造函数的时候，容易搞错各参数的顺序。传递进去错误的参数值，导致非常隐蔽的bug]]></description><category></category></item><item><title><![CDATA[网络编程]]></title><link>https://blog.youkuaiyun.com/lixld/article/details/106555376</link><guid>https://blog.youkuaiyun.com/lixld/article/details/106555376</guid><author>lixld</author><pubDate>Fri, 05 Jun 2020 18:58:03 +0800</pubDate><description><![CDATA[TCP|UDP 协议

高性能编程专题

OSI 网络七层模型

为了使不同计算机厂商的计算机能够相互通信，以便在更大范围内建立计算机网络。有必要建立一个国际范围的网络体系标注


]]></description><category></category></item><item><title><![CDATA[消息中间件选型]]></title><link>https://blog.youkuaiyun.com/lixld/article/details/106144459</link><guid>https://blog.youkuaiyun.com/lixld/article/details/106144459</guid><author>lixld</author><pubDate>Fri, 15 May 2020 16:28:24 +0800</pubDate><description><![CDATA[当然在选择之前一般也会做一些调研，不一样的选择意味着未来踩不一样的坑
公司也会选择直接购买MQ的云服务，这不失为省钱的一个好办法
RabbitMQ是采用Erlang语言实现的AMQP协议的消息中间件，最初起源于金融系统，用于在分布式系统中存储转发消息
Kafka起初是由LinkedIn公司采用Scala语言开发的一个分布式、多分区、多副本且基于zookeeper协调的分布式消息系统，它是一种高吞吐量的分布式发布订阅消息系统,以可水平扩展和高吞吐率而被广泛使用。

选型参考维度：

1.功能

子维度：
a.]]></description><category></category></item><item><title><![CDATA[mock +springboot 测试基本概念]]></title><link>https://blog.youkuaiyun.com/lixld/article/details/106037914</link><guid>https://blog.youkuaiyun.com/lixld/article/details/106037914</guid><author>lixld</author><pubDate>Mon, 11 May 2020 19:00:26 +0800</pubDate><description><![CDATA[单元测试

我们只需关心三样东西:

设置测试数据，
	设定预期结果，
	验证结果。
并不是所有的测试都包含着三样，有的只涉及设置测试数据，有的只涉及设定预期结果和验证.

模拟替换外部依赖、执行测试代码、验证执行结果是否符合预期。简称3A原则：Arrange、Act、Assert

集成测试

接触单元测试的时候，一直很迷惑，我的业务逻辑那么多那么复杂，这要怎么做单元测试呢？比如说一个登陆功能，虽然它仅仅是一个登陆功能，但它背后要干的事情可不少：验证用户名，验证密码，判断网络，发起网络请求，等待请求结果，]]></description><category></category></item><item><title><![CDATA[zookeeper占用8080端口]]></title><link>https://blog.youkuaiyun.com/lixld/article/details/104937833</link><guid>https://blog.youkuaiyun.com/lixld/article/details/104937833</guid><author>lixld</author><pubDate>Wed, 18 Mar 2020 09:52:33 +0800</pubDate><description><![CDATA[mac

用brew安装的zookeeper，并做了启动时开启服务（包括后台admin）

今天发现启动项目，一直提示8080端口被占用

后来想到了应该是zookeeper启动占用了这个端口。果然

去重新修改一个新的端

1.修改文件zoo.cfg

文件路径

ls /usr/local/etc/zookeeper/

末尾添加：

admin.serverPort=9000

2.重启：...]]></description><category></category></item><item><title><![CDATA[分布式锁--zookeeper实现]]></title><link>https://blog.youkuaiyun.com/lixld/article/details/104878793</link><guid>https://blog.youkuaiyun.com/lixld/article/details/104878793</guid><author>lixld</author><pubDate>Mon, 16 Mar 2020 09:59:59 +0800</pubDate><description><![CDATA[zookeeper典型应用场景
	数据发布订阅
	命名服务
	Master选举
	集群管理
	分布式队列
	分布式锁


用zookeeper实现分布式锁逻辑

特性：同父的子节点不可重名

所有的线程都连都同一个zookeeper上，创建同名的节点。并注册他的watcher监控





所以使用临时节点，因为持久节点可能发生死锁

下面的代码，有些异常，只是为了说明问题


package...]]></description><category></category></item><item><title><![CDATA[配置中心 ---zookeeper实现]]></title><link>https://blog.youkuaiyun.com/lixld/article/details/104862397</link><guid>https://blog.youkuaiyun.com/lixld/article/details/104862397</guid><author>lixld</author><pubDate>Sat, 14 Mar 2020 17:27:42 +0800</pubDate><description><![CDATA[为什么需要配置中心：

1.配置文件存在哪些问题：

【麻烦】集群/分布式下修改配置文件，要重启，每台服务器重新部署

【安全】敏感信息泄露，（开发接触的东西越少越好）

【不实时】对于高并发下面，一些关键配置，需要及时更新

2.统一配置中心是什么

config-center分离

配置信息和业务系统分离

配置中心存储配置信息，业务系统找配置中心获取配置

配置中心存储到 数据库/文件

...]]></description><category></category></item><item><title><![CDATA[java自带的注解@ PostConstruct]]></title><link>https://blog.youkuaiyun.com/lixld/article/details/104863279</link><guid>https://blog.youkuaiyun.com/lixld/article/details/104863279</guid><author>lixld</author><pubDate>Sat, 14 Mar 2020 17:08:48 +0800</pubDate><description><![CDATA[java注解@PostConstructor

1.spring项目加载数据字典
@PostConstruct注解的方法在项目启动的时候执行这个方法，也可以理解为在spring容器启动的时候执行，可作为一些数据的常规化加载，比如数据字典之类的。

2.spring项目的定时任务
spring自带的@schedule，没有开关，项目启动总会启动一个线程；
做项目的时候就使用Java的timer，这个...]]></description><category></category></item><item><title><![CDATA[Lambda表达式]]></title><link>https://blog.youkuaiyun.com/lixld/article/details/104855499</link><guid>https://blog.youkuaiyun.com/lixld/article/details/104855499</guid><author>lixld</author><pubDate>Sat, 14 Mar 2020 16:15:26 +0800</pubDate><description><![CDATA[1、Java8的Lambda特性


1、Lambda 表达式，也可称为闭包，它是推动 Java 8 发布的最重要新特性。
2、Lambda 允许把函数作为一个方法的参数（函数作为参数传递进方法中）。
3、使用 Lambda 表达式可以使代码变的更加简洁紧


2、Lambda表达式的语法

(arg1, arg2...) -&gt; { body }
(type1 arg1, type2 arg...]]></description><category></category></item><item><title><![CDATA[MySQL 四种事务隔离级别 + 锁]]></title><link>https://blog.youkuaiyun.com/lixld/article/details/104558787</link><guid>https://blog.youkuaiyun.com/lixld/article/details/104558787</guid><author>lixld</author><pubDate>Fri, 28 Feb 2020 17:12:31 +0800</pubDate><description><![CDATA[一、事务的基本要素（ACID）

　　1、原子性（Atomicity）：事务开始后所有操作，要么全部做完，要么全部不做，不可能停滞在中间环节。事务执行过程中出错，会回滚到事务开始前的状态，所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体，就像化学中学过的原子，是物质构成的基本单位。

　　2、一致性（Consistency）：事务开始前和结束后，数据库的完整性约束没有被破坏 。比如A...]]></description><category></category></item><item><title><![CDATA[MySQL 技巧：数据库实现   乐观锁 (版本控制/条件过滤)| 悲观锁(for update)]]></title><link>https://blog.youkuaiyun.com/lixld/article/details/104542570</link><guid>https://blog.youkuaiyun.com/lixld/article/details/104542570</guid><author>lixld</author><pubDate>Thu, 27 Feb 2020 18:56:53 +0800</pubDate><description><![CDATA[使用 MySQL 5.7 做测试，数据库引擎为 InnoDB，数据库隔离级别为可重复读（REPEATABLE-READ），读读共享，读写互斥。在这个隔离级别下，在多事务并发的情况下，还是会出现数据更新的冲突问题。

先分析一下更新冲突的问题是如何产生的。

假设我们有一张销量表 goods_sale ，表结构如下：

字段
			数据类型
			说明
		goods_sale_id
			varc...]]></description><category></category></item><item><title><![CDATA[springboot 拦截器配置]]></title><link>https://blog.youkuaiyun.com/lixld/article/details/104493858</link><guid>https://blog.youkuaiyun.com/lixld/article/details/104493858</guid><author>lixld</author><pubDate>Tue, 25 Feb 2020 11:26:12 +0800</pubDate><description><![CDATA[1.准备拦截器 extends HandlerInterceptorAdapter

2.注册拦截器 implements WebMvcConfig

override方法addInterceptors(InterceptorRegister register)

register.addInterceptor(上面的拦截器)
...]]></description><category></category></item><item><title><![CDATA[有关于幂等操作--redis实现]]></title><link>https://blog.youkuaiyun.com/lixld/article/details/104463145</link><guid>https://blog.youkuaiyun.com/lixld/article/details/104463145</guid><author>lixld</author><pubDate>Sun, 23 Feb 2020 17:11:29 +0800</pubDate><description><![CDATA[1.写一个标注

2，在需要幂等的方法上加上这个标注

3.用拦截器，拦截每一个请求，从请求中获取参数，如果带有标注则进行幂等检查，如果没有则不作

4.具体幂等检查（根据请求中的token和url来作为key,检查redis中是否存在

然后设置该key在redis中有效期，比如2秒）

代码如下

标注：


@Inherited
@Target(ElementType.METHOD)
@Re...]]></description><category></category></item><item><title><![CDATA[在线swagger文档本地化步骤]]></title><link>https://blog.youkuaiyun.com/lixld/article/details/104372498</link><guid>https://blog.youkuaiyun.com/lixld/article/details/104372498</guid><author>lixld</author><pubDate>Tue, 18 Feb 2020 12:09:05 +0800</pubDate><description><![CDATA[核心步骤：把在线的json文件转为yaml格式



在线网站：https://www.json2yaml.com/

把json转yaml文件保存到本地

swagger文档查看方式：
step1:浏览器打开地址：https://editor.swagger.io/?_ga=2.14359024.611737151.1565754758-74017250.1565754758
step2:fi...]]></description><category></category></item></channel></rss>