Go 结构体函数调用底层实现

《Go 语言嵌入和多态机制对比》一文中我们了解了 Go 语言的类型系统特征,下面,我们就来了解一下 Go 语言是如何实现上述类型系统特性的,我们将会深入到 Go 语言运行时和最终机器码层面对 Go 语言的结构体、嵌入、抽象接口实现以及函数动态绑定原理进行了解。

上文已经提及,Go 语言结构体并非 Java 和 C++ 语言中 class 的概念,下面我们来了解一下结构体变量声明和相关函数调用在机器码或汇编层面的体现。我们以下面代码为案例进行分析。

func (u User) addAgeVal(a int32) int32 {

Read More
Share

Go 语言嵌入和多态机制对比

简介

面向对象语言设计最早可以追溯到 SIMULA 67,但直到 1980 年的 Smalltalk80 将其完善,并随着 Java 的崛起而全面流行起来。面向对象设计的语言大多都支持三个关键的语言特性:抽象数据类型、继承以及多态(方法动态派发)。

本文将以 Go 语言为主,讲解一下 Go 语言在面向对象领域的一些特性以及高级编程语言的一些通用领域知识。

继承

在面向对象语言中,继承是代码复用和部分修改的常见手段之一。通过继承,子类型可以获得父类型的属性和行为,并且子类型的实例可以被当做父类的实例使用。

继承一般分为基于原型的继承(prototype-based inheritance)和基于类的继承(class-based inheritance),Javascript语言就实现了基于原型的继承,而其他场景后端语言多是实现了基于类的继承。

Go 语言并未实现上述两种意义上的继承,而是提供嵌入机制。嵌入可以理解为一种组合或者代理模式的自动语法糖。

Read More
Share

ElasticSearch 如何配置Uptime 监控组件可用性

本文收录至《Elastic Stack 实战手册》,欢迎和我一起解锁开发者共创书籍,系统学习 Elasticsearch,地址点我

现在互联网架构随着用户的增加,而越来越复杂,可能要有成千上万个不同的组件和不同的实例,对这些组件可用性的监控是提供高可用服务的关键之一,Elastic 为此推出了 Uptime App。

Elasticsearch 使用 Heartbeat 进行组件的监控。

Heartbeat 也就是我们通常所说的心跳,通过 Hearteat 我们可以判断一个网络组件,当前是否存活,是否可以对外正常提供服务。

Read More
Share

ElasticSearch 如何使用 TDigest 算法计算亿级数据的百分位数?

大家好,我是历小冰。

ElasticSearch 作为一个分布式的开源搜索和分析引擎,不仅能够进行全文匹配搜索,还可以进行聚合分析。

今天,我们就来了解一下其聚合分析中较为常见的 percentiles 百分位数分析。n 个数据按数值大小排列,处于 p% 位置的值称第 p 百分位数。比如说,ElasticSearch 记录了每次网站请求访问的耗时,需要统计其 TP99,也就是整体请求中的 99% 的请求的最长耗时。

近似算法

当数据量较小或者数据集中存储在同一位置时,进行类似 TP99 这样的百分位数分析就很容易。但当数据量不断增长时,对于数据进行聚合分析就需要在数据量,精确度和实时性三个方面进行取舍,只能满足其中两项。

不可能三角

Read More
Share

ElasticSearch 如何使用 ik 进行中文分词?

大家好,我是历小冰。在《为什么 ElasticSearch 比 MySQL 更适合复杂条件搜索》 一文中,我们讲解了 ElasticSearch 如何在数据存储方面支持全文搜索和复杂条件查询,本篇文章则着重分析 ElasticSearch 在全文搜索前如何使用 ik 进行分词,让大家对 ElasticSearch 的全文搜索和 ik 中文分词原理有一个全面且深入的了解。

全文搜索和精确匹配

ElasticSearch 支持对文本类型数据进行全文搜索和精确搜索,但是必须提前为其设置对应的类型:

  • keyword 类型,存储时不会做分词处理,支持精确查询和分词匹配查询;
  • text 类型,存储时会进行分词处理,也支持精确查询和分词匹配查询。
Read More
Share

MySQL读写分离,写完读不到问题如何解决

大家好,我是历小冰。

今天我们来详细了解一下主从同步延迟时读写分离发生写后读不到的问题,依次讲解问题出现的原因,解决策略以及 Sharding-jdbc、MyCat 和 MaxScale 等开源数据库中间件具体的实现方案。

写后读不到问题

MySQL 经典的一主两从三节点架构是大多数创业公司初期使用的主流数据存储方案之一,主节点处理写操作,两个从节点处理读操作,分摊了主库的压力。

但是,有时候可能会遇到执行完写操作后,立刻去读发现读不到或者读到旧状态的尴尬场景。这是由于主从同步可能存在延迟,在主节点执行完写操作,再去从节点执行读操作,读取了之前旧的状态。

mysql_proxy

Read More
Share

为什么 ElasticSearch 比 MySQL 更适合复杂条件搜索

熟悉 MySQL 的同学一定都知道,MySQL 对于复杂条件查询的支持并不好。MySQL 最多使用一个条件涉及的索引来过滤,然后剩余的条件只能在遍历行过程中进行内存过滤,对这个过程不了解的同学可以先行阅读一下《MySQL复杂where条件分析》

上述这种处理复杂条件查询的方式因为只能通过一个索引进行过滤,所以需要进行大量的 I/O 操作来读取行数据,并消耗 CPU 进行内存过滤,导致查询性能的下降。

而 ElasticSearch 因其特性,十分适合进行复杂条件查询,是业界主流的复杂条件查询场景解决方案,广泛应用于订单和日志查询等场景。

下面我们就一起来看一下,为什么 ElasticSearch 适合进行复杂条件查询。

ElasticSearch 简介

Elasticsearch 是开源的实时分布式搜索分析引擎,内部使用 Lucene 做索引与搜索。它提供”准实时搜索”能力,并且能动态集群规模,弹性扩容。

Read More
Share

编程小技巧之 Linux 文本处理命令(二)

合格的程序员都善于使用工具,正所谓君子性非异也,善假于物也。合理的利用 Linux 的命令行工具,可以提高我们的工作效率。

本篇文章是《Linux 文本处理命令》 续篇,在前文的基础上再介绍几款有用的 Linux 命令行工具和使用场景。

再啰嗦几句,工具能提供效率,但是有一定的学习曲线和学习成本。很多同学临时想用时,可能会陷入了不会用的尴尬境地,再去网上搜索学习,最终要花费更长时间,还不如使用笨方法处理,这是很多同学不使用这些工具的原因之一。

而且更难的是,思维上改变原有的做事习惯,一个文件中有20多行数据要生成 SQL,好像用手工处理也就是1,2分钟;快捷键记不住,我鼠标移动一下点点也挺快。但是当行数量变大或者复杂性提高时,这些手段的弊端就会显现,逼迫我们去使用正确的手段。

所以,为什么不一开始就使用更快,而且可以处理更加复杂场景的手段呢?

Read More
Share

一万字详解 Redis Cluster Gossip 协议

Redis Cluster Gossip 协议

今天来讲一下 Reids Cluster 的 Gossip 协议和集群操作,文章的思维导图如下所示。

xmind

集群模式和 Gossip 简介

对于数据存储领域,当数据量或者请求流量大到一定程度后,就必然会引入分布式。比如 Redis,虽然其单机性能十分优秀,但是因为下列原因时,也不得不引入集群。

  • 单机无法保证高可用,需要引入多实例来提供高可用性
Read More
Share

MySQL的join功能弱爆了?

大家好,我是历小冰,今天我们来学习和吐槽一下 MySQL 的 Join 功能。

关于MySQL 的 join,大家一定了解过很多它的“轶事趣闻”,比如两表 join 要小表驱动大表,阿里开发者规范禁止三张表以上的 join 操作,MySQL 的 join 功能弱爆了等等。这些规范或者言论亦真亦假,时对时错,需要大家自己对 join 有深入的了解后才能清楚地理解。

下面,我们就来全面的了解一下 MySQL 的 join 操作。

正文

在日常数据库查询时,我们经常要对多表进行连表操作来一次性获得多个表合并后的数据,这是就要使用到数据库的 join 语法。join 是在数据领域中十分常见的将两个数据集进行合并的操作,如果大家了解的多的话,会发现 MySQL,Oracle,PostgreSQL 和 Spark 都支持该操作。本篇文章的主角是 MySQL,下文没有特别说明的话,就是以 MySQL 的 join 为主语。而 Oracle ,PostgreSQL 和 Spark 则可以算做将其吊打的大boss,其对 join 的算法优化和实现方式都要优于 MySQL。

MySQL 的 join 有诸多规则,可能稍有不慎,可能一个不好的 join 语句不仅会导致对某一张表的全表查询,还有可能会影响数据库的缓存,导致大部分热点数据都被替换出去,拖累整个数据库性能。

Read More
Share