<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[不能说的秘密的博客]]></title><description><![CDATA[求知若饥，虚心若愚]]></description><link>https://blog.youkuaiyun.com/canot</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; canot]]></copyright><item><title><![CDATA[JVM 调优经验总结]]></title><link>https://blog.youkuaiyun.com/canot/article/details/128901558</link><guid>https://blog.youkuaiyun.com/canot/article/details/128901558</guid><author>canot</author><pubDate>Tue, 07 Feb 2023 09:51:20 +0800</pubDate><description><![CDATA[JVM调优记]]></description><category></category></item><item><title><![CDATA[最终一致分布式事务方案解析]]></title><link>https://blog.youkuaiyun.com/canot/article/details/128845814</link><guid>https://blog.youkuaiyun.com/canot/article/details/128845814</guid><author>canot</author><pubDate>Thu, 02 Feb 2023 12:15:50 +0800</pubDate><description><![CDATA[在微服务架构中，随着服务的逐步拆分，数据库私有已经成为共识，这也导致所面临的分布式事务问题成为微服务落地过程中一个非常难以逾越的障碍，但是目前尚没有一个完整通用的解决方案。为了保证分布式事务一致性目前业内成熟的解决方案之一为最终一致分布式事务方案]]></description><category></category></item><item><title><![CDATA[Mysql(InnoDB)的SQL加锁分析]]></title><link>https://blog.youkuaiyun.com/canot/article/details/104925841</link><guid>https://blog.youkuaiyun.com/canot/article/details/104925841</guid><author>canot</author><pubDate>Tue, 17 Mar 2020 18:19:01 +0800</pubDate><description><![CDATA[一、背景
工作经常遇到在编写并发场景sql时考虑欠缺，造成过一些bug和sql死锁。于是乎，笔者查阅了不少相关资料。 本文就MySQL/InnoDB的加锁问题，展开较为深入的分析与讨论，主要是介绍一种思路，运用此思路，拿到任何一条SQL语句，都能完整的分析出这条语句会加什么锁？会有什么样的使用风险？甚至是分析线上的一个死锁场景，了解死锁产生的原因。
注：MySQL是一个支持插件式存储引擎的数据库系...]]></description><category></category></item><item><title><![CDATA[Mysql 调优记： INNER JOIN查询 Using temporary; Using filesort 问题优化]]></title><link>https://blog.youkuaiyun.com/canot/article/details/104920558</link><guid>https://blog.youkuaiyun.com/canot/article/details/104920558</guid><author>canot</author><pubDate>Tue, 17 Mar 2020 15:44:11 +0800</pubDate><description><![CDATA[近期笔者在生产环境中发现一条执行非常慢的sql。大概时间为5s左右，于是乎对改SQL场景进行EXPLAIN 分析，发现一个在执行过程中出现对“Using temporary; Using filesort ”。即在执行过程中产生了临时表来存储结果，并在排序时根据连接类型以及存储排序键值和匹配条件的全部行的行指针来排序。经过合理对优化，最终EXPLAIN后，没有再发现明细对SQL性能瓶颈，并且SQL...]]></description><category></category></item><item><title><![CDATA[Java为什么要将String设置为不可变对象？]]></title><link>https://blog.youkuaiyun.com/canot/article/details/103754370</link><guid>https://blog.youkuaiyun.com/canot/article/details/103754370</guid><author>canot</author><pubDate>Sun, 29 Dec 2019 16:03:58 +0800</pubDate><description><![CDATA[在探讨为什么要将String设置为不可变对象前，先考虑不可变对象有什么好处，在什么情况下应该用。
相对于可变对象，不可变对象有很多优势：


不可变对象可以提高对象的效率和安全性。如果你知道一个对象是不可变的，那么需要拷贝这个对象的内容时，就不用复制它的本身而只是复制它的地址，复制地址(通常一个指针的大小)需要很小的内存效率也很高。对于同时引用这个对象的其他变量也不会造成影响。


不可变对象对于...]]></description><category></category></item><item><title><![CDATA[美团开源分布式ID生成系统——Leaf源码阅读笔记（Leaf的号段模式）]]></title><link>https://blog.youkuaiyun.com/canot/article/details/102781591</link><guid>https://blog.youkuaiyun.com/canot/article/details/102781591</guid><author>canot</author><pubDate>Thu, 31 Oct 2019 22:14:51 +0800</pubDate><description><![CDATA[Leaf 最早期需求是各个业务线的订单ID生成需求。在美团早期，有的业务直接通过DB自增的方式生成ID，有的业务通过redis缓存来生成ID，也有的业务直接用UUID这种方式来生成ID。以上的方式各自有各自的问题，因此我们决定实现一套分布式ID生成服务来满足需求。具体Leaf 设计文档见：  leaf 美团分布式ID生成服务 。
出于对该中间件的研究笔者建议下载源码阅读：github源码地址。
L...]]></description><category></category></item><item><title><![CDATA[高性能的异步处理框架Disruptor(五)——Disruptor2.0的应用]]></title><link>https://blog.youkuaiyun.com/canot/article/details/102626404</link><guid>https://blog.youkuaiyun.com/canot/article/details/102626404</guid><author>canot</author><pubDate>Fri, 18 Oct 2019 15:33:21 +0800</pubDate><description><![CDATA[前文讲了那么多理论，原理。现在通过实际的代码，来看看Disruptor2.0的几种实际应用代码。
Event事件定义：
/**
 * Event，RingBuffer的数据 
 * @author wangxi
 * @date 2019-10-16 16:31
 */
@Slf4j
public class DisruptorEvent implements Serializable {

  ...]]></description><category></category></item><item><title><![CDATA[高性能的异步处理框架Disruptor(四)——Disruptor2.0的优化]]></title><link>https://blog.youkuaiyun.com/canot/article/details/102542699</link><guid>https://blog.youkuaiyun.com/canot/article/details/102542699</guid><author>canot</author><pubDate>Mon, 14 Oct 2019 14:29:14 +0800</pubDate><description><![CDATA[现在读者应该能理解如下运行流程图了。如何还看不懂，则需要回顾上篇文章	Disruptor消费者的依赖关系

Disruptor2.0主要变化有 3 点:


更贴切的命名;
把 producer barrier(生产者屏障)整合进了 ring buffer;
将 Disruptor Wizard 加入了主代码库。


对于上图的实现方案，在新版本的结构图大概如下:

可以看到新版本更加简约，Pro...]]></description><category></category></item><item><title><![CDATA[高性能的异步处理框架Disruptor(三)——Disruptor消费者的依赖关系]]></title><link>https://blog.youkuaiyun.com/canot/article/details/102470300</link><guid>https://blog.youkuaiyun.com/canot/article/details/102470300</guid><author>canot</author><pubDate>Wed, 09 Oct 2019 22:08:45 +0800</pubDate><description><![CDATA[前文解释了Disruptor的生产者，消费者的简单工作流程。接下来学习当Disruptor的多个消费者存在依赖关系时，Disruptor对RingBuffer中的消息如何按照消费者的依赖关系来处理。
Disruptor系统的最初设计是为了支持需要按照特定的顺序发生的阶段性类似流水线事件，这种需求在企业应用系统开发中很常见。

如上图所示，对于独立的一个生产者和三个消费者。一个比较常见的依赖结构是:...]]></description><category></category></item><item><title><![CDATA[高性能的异步处理框架Disruptor(二)——Disruptor对RingBuffer的读写策略]]></title><link>https://blog.youkuaiyun.com/canot/article/details/102455638</link><guid>https://blog.youkuaiyun.com/canot/article/details/102455638</guid><author>canot</author><pubDate>Wed, 09 Oct 2019 11:01:35 +0800</pubDate><description><![CDATA[前文了解了Disruptor与RingBuffer的基础知识后，接下来了解Disruptor对 ringbuffer的访问控制策略。
Disruptor对RingBuffer的读取策略
假设消费者(Consumer)是一个想从 Ring Buffer 里读取数据的线程，它可以访问 ConsumerBarrier对象——这个 对象由 RingBuffer 创建并且代表消费者与 RingBuffer ...]]></description><category></category></item><item><title><![CDATA[高性能的异步处理框架Disruptor(一)——认识RingBuffer与Disruptor]]></title><link>https://blog.youkuaiyun.com/canot/article/details/102417161</link><guid>https://blog.youkuaiyun.com/canot/article/details/102417161</guid><author>canot</author><pubDate>Wed, 09 Oct 2019 10:31:51 +0800</pubDate><description><![CDATA[Disruptor是什么
Disruptor 是一个高性能的异步处理框架。
可以认为是最快的消息框架(轻量的 JMS)，也可以认为是一个观察者模式的实现，或者事件监听模式的实现。它允许开发者使用多线程技术去创建基于任务的工作流。Disruptor 能用来并行创建任务，同时保证多个处理过程的有序性。Disruptor 的目标就是快，高效。
ArrayBlockingQueue也是一个非常优秀的有界队...]]></description><category></category></item><item><title><![CDATA[Redis官方分布式锁的实现-Redlock实现原理]]></title><link>https://blog.youkuaiyun.com/canot/article/details/100569263</link><guid>https://blog.youkuaiyun.com/canot/article/details/100569263</guid><author>canot</author><pubDate>Thu, 05 Sep 2019 23:22:46 +0800</pubDate><description><![CDATA[前文笔者介绍了目前市面上见的比较多的Redis+lua分布式锁的实现，大概有如下三个要点：


set命令要用 setkey value px milliseconds nx；保证原子性
value要具有唯一性，释放锁时要验证value值，不能误解锁；
解锁要使用lua脚本，也是为了保证原子性


Redis官方也指出该方法有安全隐患就是在主从复制模式下会导致两个线程可能会同时持有一个锁，如果业务...]]></description><category></category></item><item><title><![CDATA[《Rabbit MQ 实战》读书笔记 (二：事务与消息确认模式)]]></title><link>https://blog.youkuaiyun.com/canot/article/details/93366104</link><guid>https://blog.youkuaiyun.com/canot/article/details/93366104</guid><author>canot</author><pubDate>Sun, 23 Jun 2019 00:39:14 +0800</pubDate><description><![CDATA[AMQP协议的一个亮点就是对消息的可靠性投递-事务。
事务在AMQP-0-9-1中正式成为规范的一部分。虽然AMQP事务保证了在信道开启了事务模式后，全部命令的执行成功。但AMQP事务大大降低了Rabbit的吞吐量，性能极低。同时使用AMQP事务使得生产者与应用程序之间产生同步。
为了解决这个可靠性投递和性能的兼容性问题。RabbitMQ提供了发送方确认模式。
在客户端与Rabbit服务端的链接信...]]></description><category></category></item><item><title><![CDATA[《Rabbit MQ 实战》读书笔记 (一：认识AMQP模型)]]></title><link>https://blog.youkuaiyun.com/canot/article/details/93325667</link><guid>https://blog.youkuaiyun.com/canot/article/details/93325667</guid><author>canot</author><pubDate>Sat, 22 Jun 2019 17:15:54 +0800</pubDate><description><![CDATA[最近在读RabbitMQ实战这本书，开个帖子。记录一下读书笔记吧。
一、AMQP模型
Advanced Message Queuing Protocol-高级消息队列协议是一个进程间传递异步消息的网络协议。
AMQP模型描述了一套模块化的组件以及这些组件之间进行连接的标准规则。
在服务器中，三个主要功能模块连接成一个处理链完成预期的功能：


“exchange”接收发布应用程序发送的消息，并根据...]]></description><category></category></item><item><title><![CDATA[Redis原理(二) Redis的对象类型及其内部编码]]></title><link>https://blog.youkuaiyun.com/canot/article/details/85238256</link><guid>https://blog.youkuaiyun.com/canot/article/details/85238256</guid><author>canot</author><pubDate>Mon, 24 Dec 2018 19:56:27 +0800</pubDate><description><![CDATA[Redis 支持 5 种对象类型，而每种结构都有至少两种编码。
这样做的好处在于：一方面接口与实现分离，当需要增加或改变内部编码时，用户使用不受影响，另一方面可以根据不同的应用场景切换内部编码，提高效率。
Redis 各种对象类型支持的内部编码官网描述：

Strings can be encoded as raw (normal string encoding) or int (strings ...]]></description><category></category></item><item><title><![CDATA[Redis原理(一) redis的内存模型]]></title><link>https://blog.youkuaiyun.com/canot/article/details/85235338</link><guid>https://blog.youkuaiyun.com/canot/article/details/85235338</guid><author>canot</author><pubDate>Mon, 24 Dec 2018 16:31:37 +0800</pubDate><description><![CDATA[Redis最为常用的数据类型主要有以下五种：


String 字符串
Hash  哈希
List  列表
Set  集合
Sorted set 有序集合


丰富的类型是 Redis 相对于 Memcached 等的一大优势
redis 内部的存储结构如图示：

在了解上文的基础上，进一步了解Redis 的内存模型，对 Redis 的使用有很大帮助。如：


估算 Redis 内存使用量,选择合...]]></description><category></category></item><item><title><![CDATA[从Spring AOP的原理理解@Transactional失效问题]]></title><link>https://blog.youkuaiyun.com/canot/article/details/80855439</link><guid>https://blog.youkuaiyun.com/canot/article/details/80855439</guid><author>canot</author><pubDate>Fri, 29 Jun 2018 13:25:17 +0800</pubDate><description><![CDATA[在正确配置了Spring事务管理后，或许在某些场景下，你可以写出如下代码：



class T {

    public int createFirst(){
       //dosometing....
       try {
           this.createSecond();
       }catch (Exception e){
          throw e;
 ...]]></description><category></category></item><item><title><![CDATA[主流的hash算法概述及在JDK Map中的应用]]></title><link>https://blog.youkuaiyun.com/canot/article/details/80393423</link><guid>https://blog.youkuaiyun.com/canot/article/details/80393423</guid><author>canot</author><pubDate>Mon, 21 May 2018 15:59:57 +0800</pubDate><description><![CDATA[hash算法的应用场景

Java中的Map实际是一个“散列表”的数据结构，散列表是逻辑上由一系列可存放词条(或其引用)的单元组成，故这些单元也称作桶(bucket) —— 一般都使用线性表来实现。

一组词条在散列表内部的具体分布，取决于所谓的散列(hashing)方案：事先在词条与桶地址之间约定的某种映射关系，可描述为从关键码空间到桶数组地址空间的函数: hash() 。

这里的hash()...]]></description><category></category></item><item><title><![CDATA[Java NIO学习笔记(四) 使用JDK 1.7 NIO2.0 实现客户端与服务器的通信]]></title><link>https://blog.youkuaiyun.com/canot/article/details/80377131</link><guid>https://blog.youkuaiyun.com/canot/article/details/80377131</guid><author>canot</author><pubDate>Sat, 19 May 2018 19:28:53 +0800</pubDate><description><![CDATA[JDK1.7 提供了全新的异步NIO模式。称为：NIO2.0或AIO。该模式引入了新的异步通道的概念，并提供了异步文件通道和异步套接字通道的实现。异步通道提供两种方式获取获取操作结果。分别是：


  
  通过java.util.concurrent.Future类来表示异步操作的结果；
  CompletionHandler接口的实现类作为操作完成的回调。
  


NIO2.0的异步套接字通...]]></description><category></category></item><item><title><![CDATA[索引使用策略及优化]]></title><link>https://blog.youkuaiyun.com/canot/article/details/80217503</link><guid>https://blog.youkuaiyun.com/canot/article/details/80217503</guid><author>canot</author><pubDate>Sun, 06 May 2018 19:45:22 +0800</pubDate><description><![CDATA[MySQL的优化主要分为结构优化（Scheme optimization）和查询优化（Query optimization）。本文讨论的高性能索引策略主要属于结构优化范畴。本章的内容完全基于上文B+树在数据库索引中的应用的理论基础，一旦理解了索引背后的机制，那么选择高性能的策略就变成了纯粹的推理，并且可以理解这些策略背后的逻辑。

示例数据库 
为了讨论索引策略，需要一个数据量不算小的数据库作为示...]]></description><category></category></item></channel></rss>