5 不能说的秘密go

尚未进行身份认证

求知若饥,虚心若愚

等级
TA的排名 2k+

美团开源分布式ID生成系统——Leaf源码阅读笔记(Leaf的号段模式)

Leaf 最早期需求是各个业务线的订单ID生成需求。在美团早期,有的业务直接通过DB自增的方式生成ID,有的业务通过redis缓存来生成ID,也有的业务直接用UUID这种方式来生成ID。以上的方式各自有各自的问题,因此我们决定实现一套分布式ID生成服务来满足需求。具体Leaf 设计文档见: leaf 美团分布式ID生成服务 。出于对该中间件的研究笔者建议下载源码阅读:github源码地址。L...

2019-10-28 15:14:19

高性能的异步处理框架Disruptor(五)——Disruptor2.0的应用

前文讲了那么多理论,原理。现在通过实际的代码,来看看Disruptor2.0的几种实际应用代码。Event事件定义:/** * Event,RingBuffer的数据 * @author wangxi * @date 2019-10-16 16:31 */@Slf4jpublic class DisruptorEvent implements Serializable { ...

2019-10-18 15:29:06

高性能的异步处理框架Disruptor(四)——Disruptor2.0的优化

现在读者应该能理解如下运行流程图了。如何还看不懂,则需要回顾上篇文章 Disruptor消费者的依赖关系Disruptor2.0主要变化有 3 点:更贴切的命名;把 producer barrier(生产者屏障)整合进了 ring buffer;将 Disruptor Wizard 加入了主代码库。对于上图的实现方案,在新版本的结构图大概如下:可以看到新版本更加简约,Pro...

2019-10-14 10:12:47

高性能的异步处理框架Disruptor(三)——Disruptor消费者的依赖关系

前文解释了Disruptor的生产者,消费者的简单工作流程。接下来学习当Disruptor的多个消费者存在依赖关系时,Disruptor对RingBuffer中的消息如何按照消费者的依赖关系来处理。Disruptor系统的最初设计是为了支持需要按照特定的顺序发生的阶段性类似流水线事件,这种需求在企业应用系统开发中很常见。如上图所示,对于独立的一个生产者和三个消费者。一个比较常见的依赖结构是:...

2019-10-09 21:24:00

高性能的异步处理框架Disruptor(二)——Disruptor对RingBuffer的读写策略

前文了解了Disruptor与RingBuffer的基础知识后,接下来了解Disruptor对 ringbuffer的访问控制策略。Disruptor对RingBuffer的读取策略假设消费者(Consumer)是一个想从 Ring Buffer 里读取数据的线程,它可以访问 ConsumerBarrier对象——这个 对象由 RingBuffer 创建并且代表消费者与 RingBuffer ...

2019-10-09 10:36:30

高性能的异步处理框架Disruptor(一)——认识RingBuffer与Disruptor

Disruptor是什么Disruptor 是一个高性能的异步处理框架。可以认为是最快的消息框架(轻量的 JMS),也可以认为是一个观察者模式的实现,或者事件监听模式的实现。它允许开发者使用多线程技术去创建基于任务的工作流。Disruptor 能用来并行创建任务,同时保证多个处理过程的有序性。Disruptor 的目标就是快,高效。ArrayBlockingQueue也是一个非常优秀的有界队...

2019-10-08 22:40:27

Redis官方分布式锁的实现-Redlock实现原理

前文笔者介绍了目前市面上见的比较多的Redis+lua分布式锁的实现,大概有如下三个要点:set命令要用setkeyvaluepxmillisecondsnx;保证原子性value要具有唯一性,释放锁时要验证value值,不能误解锁;解锁要使用lua脚本,也是为了保证原子性Redis官方也指出该方法有安全隐患就是在主从复制模式下会导致两个线程可能会同时持有一个锁,如果业务...

2019-09-05 23:18:17

《Rabbit MQ 实战》读书笔记 (二:事务与消息确认模式)

AMQP协议的一个亮点就是对消息的可靠性投递-事务。事务在AMQP-0-9-1中正式成为规范的一部分。虽然AMQP事务保证了在信道开启了事务模式后,全部命令的执行成功。但AMQP事务大大降低了Rabbit的吞吐量,性能极低。同时使用AMQP事务使得生产者与应用程序之间产生同步。为了解决这个可靠性投递和性能的兼容性问题。RabbitMQ提供了发送方确认模式。在客户端与Rabbit服务端的链接信...

2019-06-23 00:39:14

《Rabbit MQ 实战》读书笔记 (一:认识AMQP模型)

最近在读RabbitMQ实战这本书,开个帖子。记录一下读书笔记吧。一、AMQP模型Advanced Message Queuing Protocol-高级消息队列协议是一个进程间传递异步消息的网络协议。AMQP模型描述了一套模块化的组件以及这些组件之间进行连接的标准规则。在服务器中,三个主要功能模块连接成一个处理链完成预期的功能:“exchange”接收发布应用程序发送的消息,并根据...

2019-06-22 17:15:54

Redis原理(二) Redis的对象类型及其内部编码

Redis 支持 5 种对象类型,而每种结构都有至少两种编码。这样做的好处在于:一方面接口与实现分离,当需要增加或改变内部编码时,用户使用不受影响,另一方面可以根据不同的应用场景切换内部编码,提高效率。Redis 各种对象类型支持的内部编码官网描述:Strings can be encoded as raw (normal string encoding) or int (strings ...

2018-12-24 19:56:27

Redis原理(一) redis的内存模型

Redis最为常用的数据类型主要有以下五种:String 字符串Hash 哈希List 列表Set 集合Sorted set 有序集合丰富的类型是 Redis 相对于 Memcached 等的一大优势redis 内部的存储结构如图示:在了解上文的基础上,进一步了解Redis 的内存模型,对 Redis 的使用有很大帮助。如:估算 Redis 内存使用量,选择合...

2018-12-24 16:31:37

从Spring AOP的原理理解@Transactional失效问题

在正确配置了Spring事务管理后,或许在某些场景下,你可以写出如下代码:classT{publicintcreateFirst(){//dosometing....try{this.createSecond();}catch(Exceptione){throwe;...

2018-06-29 13:25:17

主流的hash算法概述及在JDK Map中的应用

hash算法的应用场景Java中的Map实际是一个“散列表”的数据结构,散列表是逻辑上由一系列可存放词条(或其引用)的单元组成,故这些单元也称作桶(bucket) —— 一般都使用线性表来实现。一组词条在散列表内部的具体分布,取决于所谓的散列(hashing)方案:事先在词条与桶地址之间约定的某种映射关系,可描述为从关键码空间到桶数组地址空间的函数: hash() 。这里的hash()...

2018-05-21 15:59:57

Java NIO学习笔记(四) 使用JDK 1.7 NIO2.0 实现客户端与服务器的通信

JDK1.7 提供了全新的异步NIO模式。称为:NIO2.0或AIO。该模式引入了新的异步通道的概念,并提供了异步文件通道和异步套接字通道的实现。异步通道提供两种方式获取获取操作结果。分别是: 通过java.util.concurrent.Future类来表示异步操作的结果; CompletionHandler接口的实现类作为操作完成的回调。 NIO2.0的异步套接字通...

2018-05-19 19:28:53

索引使用策略及优化

MySQL的优化主要分为结构优化(Scheme optimization)和查询优化(Query optimization)。本文讨论的高性能索引策略主要属于结构优化范畴。本章的内容完全基于上文B+树在数据库索引中的应用的理论基础,一旦理解了索引背后的机制,那么选择高性能的策略就变成了纯粹的推理,并且可以理解这些策略背后的逻辑。示例数据库 为了讨论索引策略,需要一个数据量不算小的数据库作为示...

2018-05-06 19:45:22

B+树在数据库索引中的应用

目前大部分数据库系统及文件系统都采用B-Tree或其变种B+Tree作为索引结构(更少的磁盘I/O操作次数的渐进复杂度)一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上。这样的话,索引查找过程中就要产生磁盘I/O消耗,相对于内存存取,I/O存取的消耗要高几个数量级,所以评价一个数据结构作为索引的优劣最重要的指标就是在查找过程中磁盘I/O操作次数的渐进复...

2018-05-05 14:37:19

红黑树的特性和实现

平衡二叉搜索树的形式多样,且各具特色。比如,伸展树实现简便、无需修改节点 结构、分摊复杂度低,但可惜最坏情况下的单次操作需要n时间,故难以适用于对可靠性和稳定性要求极高的场合。 反之,AVL树尽管可以保证最坏情况下的单次操作速度,但需在节点中嵌入平衡因子等标识;更重要的是,删除操作之后的重平衡可能需做多达logn次旋转,从而频繁地导致全树整体拓扑结构的大幅度变化。红黑树即是针对后一不足的改进...

2018-04-23 00:13:34

搜索树之B-/B+树的特性与实现

现代计算机中,在内存与外存(磁盘)组成的二级存储系统中,数据全集往往存放于外存中,计算过程中则可将内存作为外存的高速缓存,存放最常用数据项的复本。借助高效的调度算法,如此便可将内存的“高速度”与外存的“大容量”结合起来。两个相邻存储级别之间的数据传输,统称I/O操作。各级存储器的访问速度相差悬殊,故应尽可能地减少I/O操作。仍以内存与磁盘为例,其单次访问延迟大致分别在纳秒(ns)和毫秒(m...

2018-04-19 00:59:21

伸展树的特性及实现

除了AVL树,本章将按照二叉搜索树的介绍,继续介绍平衡二叉搜索树家族中的另一个成员—Splay伸展树。相对于AVL,Splay的实现更为简捷。伸展树无需时刻都严格地保持全树的平衡,但却能够在任何足够长的真实操作序列中,保持分摊意义上的高效率。伸展树也不需要对基本的二叉树节点结构,做任何附加的要求或改动,更不需要记录平衡因子或高度之类的额外信息,故适用范围更广。通常在任意数据结构的生命期内,...

2018-04-16 23:59:17

使用redis+lua脚本实现分布式锁

分布式锁的应用场景当多个机器(多个进程)会对同一条数据进行修改时,并且要求这个修改是原子性的。这里有两个限定: 多个进程之间的竞争,意味着JDK自带的锁失效; 原子性修改,意味着数据是有状态的,修改前后有依赖。 本文将先介绍Redis的实现方式,后面笔者会介绍分布式锁的其他实现。在学习Redis实现分布式锁的过程中,笔者首先参考了Redis的官方文档实现Red...

2018-04-15 00:05:30

查看更多

勋章 我的勋章
  • 专栏达人
    专栏达人
    授予成功创建个人博客专栏的用户。专栏中添加五篇以上博文即可点亮!撰写博客专栏浓缩技术精华,专栏达人就是你!
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
  • 勤写标兵Lv1
    勤写标兵Lv1
    授予每个自然周发布1篇到3篇原创IT博文的用户。本勋章将于次周周三上午根据用户上周的博文发布情况由系统自动颁发。