总结 golang 对于 stream 的抽象 本文对 golang 标准库中的 stream 进行了一些总结。 Interfaces在 golang 中,通过几个基本的 interface 对流操作进行了抽象。 读写首先是最基本的Reader、Writer,定义了对于一个流来说最基本的操作:读、写。这两个 interface 定义在 io 包里。 12345678type Reader interface { Read(p 2016-07-18 #标准库 #golang #stream #io
并发难 | 池里究竟该放多少线程? 最近在项目里做了一个数据同步的功能。需要把两个数据库里的数据做同步,在业务不繁忙的时候跑一次,核对库里每一条数据,主要是为了保证数据最终一致,做的一个保底工作。之前项目里同步的代码是单线程的,我改成了基于线程池的,但是在上线前的一些问题却引起了我的思考。 现象程序的代码还是比较简单的,大概类似下面: 123456789101112131415161718192021222324252627282 2016-07-08 #并发 #思考
golang 垃圾回收机制 用任何带 GC 的语言最后都要直面 GC 问题。在以前学习 C# 的时候就被迫读了一大堆 .NET Garbage Collection 的文档。最近也学习了一番 golang 的垃圾回收机制,在这里记录一下。 常见 GC 算法趁着这个机会我总结了一下常见的 GC 算法。分别是:引用计数法、Mark-Sweep法、三色标记法、分代收集法。 1. 引用计数法原理是在每个对象内部维护一个整数值,叫做 2016-06-22 #golang #GC #垃圾回收
高可用可伸缩架构 最近在读一本书《大型网站技术架构》,收获颇多。这篇文章是对最近学习的一些总结,大多是一些结论性的内容,可以拿来就用的东西,对于大部分企业都比较适用。注意这些内容并不是我自己发明的,而是业界多年来的经验总结出的结论。 高性能1. 性能测试保证网站高性能的前提是做性能测试,如果连网站的性能指标都不知道,怎么判断一个网站“慢不慢”和“高性能”呢。 对一个网站做性能测试时,主要需要测试一下几项数据: 2016-06-21 #架构 #高可用 #可伸缩
跨源 HTTP 请求(CORS) 之前一直对跨域问题一知半解,今天看了些资料^cors总算把所有情况搞明白了。总的来说跨域请求分为两种:简单请求和复杂请求,下面来详细说明。 简单请求简单请求是指: 只使用 GET, HEAD 或者 POST 请求方法。如果使用 POST 向服务器端传送数据,则数据类型 (Content-Type,注意是 request 的 Content-Type) 只能是 application/ 2016-06-13 #HTTP #CORS #跨域
是时候用 apt 代替 apt-get 了! 最近无痛升级了 ubuntu 16.04 ,软件包和数据一点没丢。比上次 12.04 升级 14.04 舒服多了,直接 ssh 就搞定升级了。不得不说 ubuntu 已经成熟很多了。升级后我才发现多了个 apt 命令,用起来很符合我的审美,不过这个东西好像也存在比较久的一段时间了,实在是后知后觉了。 apt 这个命令行工具在功能上基本涵盖了以前 apt-get 和 apt-cache 的功能,在 2016-05-28 #运维 #linux #ubuntu
用 elasticsearch 给博客加上了搜索 博客从 Wordpress 迁移过来之后一直缺少一个搜索功能,这个博客我是当做笔记性质的,有时候脑子里突然想不起某个东西的时候就上来查一下。没有搜索还是很不方便的,所以费了点时间研究了下大名鼎鼎的 elasticsearch 配合 golang 给博客加上了搜索功能。 elasticsearch 介绍elasticsearch 是一个 java 编写的搜索和分析引擎,功能十分强大。但是并不意味着 2016-05-25 #golang #elasticsearch #搜索引擎
做了个 golang 安装包的镜像 国内下载 golang 安装包还是挺蛋疼的。虽然现在 docker 镜像是个比较好的选择,但还是有很多场景需要原始的 golang 环境的。所以抽空做了个 mirror ,定时拉取 golang 官网的安装包到我的服务器上。 包含了 golang 1.5 之后的所有版本,所有平台的安装包和源码包都放在里面,自行 control + f 搜一下吧。新版本的 golang release 之后,应该 2016-05-25 #闲扯 #golang
Linux Shell 编程中的 trap 的小坑 在 Shell 编程中,为了脚本的健壮性,一般会用到 trap 这个 builtin command。trap 命令类似 c 语言中的 signal 函数,可以注册一个函数,当程序收到信号时执行函数。但是 trap 命令也有一些比较坑的小细节,比如 trap 的执行时机。 在 c 语言中,程序收到信号之后会立即执行 signal 注册的信号处理函数。那么在 shell 程序中呢,信号究竟什么时候 2016-05-24 #linux #bash #shell #trap
CloudXNS-DDNS 动态域名客户端 docker 镜像 最近换上了 CloudXNS 的域名服务。以前使用花生壳的时候比较方便,大多数路由器都支持,而且还提供了 Linux 下的客户端源码供定制。换上 CloudXNS 之后这些方便的东西当然没有了,不过 CloudXNS 也提供了 API,作为程序员当然要自己写一个了。这篇文章是这个 CloudXNS DDNS 客户端的使用介绍。 客户端是使用 golang 开发的,放到了 github 上 ht 2016-05-14 #CloudXNS #DDNS #docker #动态DNS