Random walk to my blog

my blog for sharing my knowledge,experience and viewpoint

0%

Golang的FAQ中,解释了为什么goroutine是匿名的,没有暴露出ID等状态信息,主要是因为如果一个特定的goroutine有了名字(ID),开发者就会忽略使用多个goroutine来处理信息的可能,从而限制库的使用。

但是,有时候开发者也需要获取goroutine来进行特定的操作。本文介绍如何从堆栈信息中获取goroutine信息

阅读全文 »

缓存(cache)利用是空间局部性(Locality of reference):最近被访问的元素很有可能在将来也被访问,从而将结果缓存起来,避免更加耗时的查询(例如,数据库的查询操作,网页图片,网页格式的加载等)。
本文主要讲对数据库查询的缓存。

阅读全文 »

本文代码在我的Github仓库,欢迎给star。
代码实现参考了hyperloglog的维基百科

去重计数(Count distinct)

日常开发中,有时候需要对大量的数据集进行去重计数的工作,这是非常耗费计算资源的。比如说,需要计算某个视频/文章的观看用户数,由于同个用户可能在一天之内多次观看,使用要进行去重操作。如果使用一个hash集合保存用户的id,不仅耗费大量存储空间,也耗费计算的时间。

HyperLogLog适用于数量很大,能容忍少量错误率的去重计数操作,它使用的存储空间非常小,几十字节就能对百万以上的数据进行去重计数。

阅读全文 »

布隆过滤器简介

布隆过滤器(Bloom Filter)是一个基于hash的概率性的数据结构,它实际上是一个很长的二进制向量,可以检查一个元素可能存在集合中,和一定不存在集合中。它的优点是空间效率高,但是有一定false positive(元素不在集合中,但是布隆过滤器显示在集合中)。

阅读全文 »

分布式哈希(Distributed Hashing)

分布式环境中,需要进行分布式哈希来进行负载均衡,减少忙碌服务器的负载。例如,对一个键(key)做了哈希后,需要确定它保存在哪个服务器上面。一致性散列(consistent hash)函数的特点是,当函数范围(例如,服务器的数量)变化,它变化的最少。
一个对一致性哈希的典型应用是Memcached.

阅读全文 »