4月 11

golang map的元素遍历为什么是随机的

golang的map的元素遍历是随机的?为什么这样做?怎么做的?

为什么这样做

大部分的编程语言,对于固定的数据集合,map的元素遍历是顺序,但是golang为什么要搞成随机的呢?

golang的设计哲学是:没有过于灵活地允许马马虎虎的代码,Go强迫你从一开始就把事情弄得直接一点。Go程序员参考里面说如果他们的程序可以编译(而且代码符合Go的风格),那么代码有很大的可能可以像预期的那样工作,这种模模糊糊却不错的感觉也有Go严谨性的贡献。没有诡异的类型bug,丢失分号等等错误。

尤其是,在Andrew的参考文章中,他指出这是Go的设计者们所作出的改变。他们不再允许人们依赖于那些破破烂烂的假设。我最痛恨的一点就是那些破烂的,到处是bug的功能(这发生在交付的产品中,或者是编程语言,等等很多地方),通过权衡,接受,从而变成了一个特性,另外尝试修复这些”特性”真的是很恶心。

怎么实现

如果每输出一个元素都随机的话,一是性能问题,而且还要标记某个元数是否访问到。所以很可能是随机生成一个访问点然后,进行顺序扫描(猜测的,没有看源码,不一定正确),看下面程序的运行结果,推出结论可能是先随机到一个桶的一个位置,然后顺序访问:

Continue reading

2月 23

数据库自增列

简介

自增列的主要目的是自动生成行的唯一ID,对于不同的数据库或是存储引擎,还有一些特别的意义。

大部分数据库的使用者会使用自增列做为聚簇索引,以innodb为例,在内存中数据存放到B+Tree的一个页子结点上,数据按照主键顺序存放,每次插入数据时,会根据主键插入适当的位置。如果使用自增ID,数据插入相当于顺序插入,不会移动现有数据的位置;如果不使用自增ID,则有可能为了插入数据而移动数据,如果内存页已经回写的磁盘,则需要从磁盘上读回来,同时,频繁的移动和分页,会带来大量的碎片。

自增ID,一般使用一个整数来表示,而其它的一些方案,如UUID等一般会使用一个长字符串来表示(一般为16字节),存储空间和网络都会有一些浪费。

现在业务中接触到的很多客户,可能是习惯或是方便,一般不指定与某个有实际意义的字段为主键,而是使用自增列,其它维度查询列建索引,如果存储系统接口不支持的话,它们就会用UUID来代替,不会考虑与之相关的一些问题。

本文主要是了解一下自增列的实现原理

Continue reading

10月 21

golang goroutine id的相关问题

关于goroutine id

C++ 中我们经常使用线程号来打日志,方便排查问题。golang1.4之前支持goroutine id的,但是在后面的版本将这个接口去掉了。

goroutine id主要有两个用途:

  • 打日志,方便排查问题
  • 因为golang是不支持Thread Local Storage,所以也可以使用goroutine id来实现Goroutine Local Storage

Continue reading

10月 08

每周技术文章推荐(二)

golang使用感受

 

golang使用感受

个人评价

9分

简介

自已使用golang已经3个月了,也是从C++转过来了,自已的感觉和作者差不多,这句话,说的很有道理:“你可以说出一万个有自动垃圾回收的语言的好处,但我也能说出一个自己管理内存的好处:自由”
 

Linux 挖坑不埋指南

 

Linux 挖坑不埋指南

个人评价

8分

简介

Linux 世界的缔造者是务实主义,它的文化也就是务实的文化,它的精神也就是务实的精神。我觉得,只有务实的人才能真正的用好 Linux,而那些实用主义者的立场太不坚定,他们很容易变成某种意义上的投机主义者。
 

对比 Redis 与 Memcached

 
对比 Redis 与 Memcached

个人评价

6分

简介

从功能和网络搜索热度两个方面,对 Redis 和 Memcached 进行详细的对比

9月 26

每周技术文章推荐(一)

深度剖析golang interface

 
深度剖析golang interface

个人评价

9分

简介

详细介绍了golang interface的用法和实现原理,使用部分解释的很好,实现原理写的不是很好理解.
 

go语言简介(上):语法

 
go语言简介(上):语法

个人评价

10分

简介

go语言迅速入门教程,简洁易懂。
 

go语言简介(下):特性

 
go语言简介(下):特性

个人评价

10分

简介

包含了几乎所有的常用用法,channel,timer,http,lock等
 

分布式MySQL数据库TDSQL架构分析

 
分布式MySQL数据库TDSQL架构分析

个人评价

9分

简介

基于mysql的分布式实现方案,基本上是通用的作法,架构中scheduler的设计不错,打算引入到我们的系统;扩容的第一种方案有些复杂,感觉实现比较麻烦。写的还算比较实在,没有乱吹。多机聚合问题的处理方法,也可以引用到我们的系统。

9月 09

日志使用的四种场景

转载自: 基于日志构建大规模分布式系统

存储引擎

以最常见的B树为例:B树由页组成,每个页都包含指针指向其他页。当你打算向B树插入Key Value对时,如果需要插入的页未满,那么很方便,反之,就需要当前页分裂产生两个独立页。当分裂发生时,你需要至少三次写入磁盘:两次是分裂后产生的独立页,还需要更新父页,因为里边对应的指针需要修改。这就产生问题了:如果只有部分页面写入磁盘的时候,数据库崩溃了,这就会发生悲剧,因为B树可能同时包含分裂前和分裂后的页数据,换句话,数据库的索引这时已毁坏。

存储引擎,解决方案是采用WAL(Write Ahead Log),这能够确保B树的数据可靠:当数据添加到WAL日志后数据库崩溃,没有问题,B树还没有发生修改,只需要根据日志把未写入数据存入B树即可;如果B树更新时数据库崩溃,也没有问题,因为根据日志很容易判定哪些数据还没写入完成,只需要把这部分数据在B树中重做即可。
 

Continue reading

9月 08

Golang自动生成版本信息

需求

golang程序在build时自动生成版本信息,使用 ./helloworld –version可以查看版本和build时间

实现原理

使用链接选项-X设置一个二进制文件中可以访问的变量
 

实例1:

 

实例2

 

参考资料

golang-auto-build-versioning

6月 07

oceanbase回忆录(3)–简单工具的使用

去年,领导一直催让我整理一个排查性能问题和查BUG的文档,我一直拖着,因为很很想到一套体系把所有问题串连起来,而且大部分排查也是出于经验。

前一段时间翻译过一骗很好的性能排查与优化的文章:

最近又读了一篇关于linux常用工具的文章linux-performance-monitoring-tools,感觉不错,结合自己的经历,描述一下,可能不全面,以后再补充。

sa

oceanbase一些重要应用上会部署sar后台运行,主要是为了分析一天的网络和磁盘性能数据,方便性能问题提成查。曾经一个合并问题,导致网络流量过大的问题,就是通过sar来辅助排查的。不过sar使用的时候,会写大量记录,所以最好选择一个单独的盘来用,不要影响正常的业务磁盘。

sar是sysstat包的一部分,sar可以做两件事情

  • 监控系统实时性能(CPU,内存,I/O)
  • 在后台收集数据,分析历史数据来查找性能瓶颈

sar详细功能说明

  • 收集cpu利用率
  • 单个cpu统计
  • 内存使用率
  • swap使用率
  • 系统的全部IO活动
  • 单个设备的IO活动
  • 上下文切换
  • 运行队列和load
  • 网络状态

sar使用实例

  • sar -b 1 3
    -b: 报告io状态
    1: 每一秒执行一次
    3: 总共汇报3次

Continue reading