Cuckoo Filter详解

对于海量数据处理业务,我们通常需要一个索引数据结构,用来帮助查询,快速判断数据记录是否存在,这种数据结构通常又叫过滤器(filter)。考虑这样一个场景,上网的时候需要在浏览器上输入URL,这时浏览器需要去判断这是否一个恶意的网站,它将对本地缓存的成千上万的URL索引进行过滤,如果不存在,就放行,如果(可能)存在,则向远程服务端发起验证请求,并回馈客户端给出警告。

Read More

BloomFilter详解

什么是Bloom Filter

Bloom Filter是一种空间效率很高的随机数据结构,它的原理是,当一个元素被加入集合时,通过K个Hash函数将这个元素映射成一个位阵列(Bit array)中的K个点,把它们置为1。检索时,我们只要看看这些点是不是都是1就(大约)知道集合中有没有它了:如果这些点有任何一个0,则被检索元素一定不在;如果都是1,则被检索元素很可能在。这就是布隆过滤器的基本思想。

Read More

TCP/IP中TIME_WAIT状态详解

TCP的TIME_WAIT状态是什么?谁会有TIME_WAIT状态?TIME_WAIT状态的作用是什么?如何避免大量的TIME_WAIT状态占用过多的系统资源?

TIME_WAIT状态是TCP连接中主动关闭连接的一方会进入的状态,在发出最后一个ACK包之后,主动关闭方进入TIME_WAIT状态,从而确保ACK包到达对端,以及等待网络中之前迷路的数据包完全消失,防止端口被复用的时候收到迷路包从而出现收包错误。

TIME_WAIT状态会持续2MSL(max segment lifetime)的时间,一般1分钟到4分钟。在这段时间内端口不能被重新分配使用。

Read More

Java多线程 —— 线程池详解

合理利用线程池能够带来三个好处。

  1. 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
  2. 提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。
  3. 提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。

但是要做到合理的利用线程池,必须对其原理了如指掌。

Read More

使用GPB协议

为什么要使用GPB协议

GPB(Google Protocol Buffer)协议,与常用的数据通讯、存储方式相比,优点如下:

  • 跨平台(语言):相比于Java序列化、Python的pickle序列化工具,GPB是独立于语言的,如果项目对这方面有要求,GPB就脱颖而出了。序列化还有一个问题,如果你改了数据结构,很容易造成序列化失败。
  • 快:采用类似二进制的协议,更加高效。这一点主要是相比于XML、JSON这两种常用的数据标准而言的。
  • 扩展性、维护性:在后续扩展协议的时候,GPB可以很好的兼容;协议源文件跟随代码做版本控制,容易维护。

Read More

Java Stream详解

在讨论Stream之前,我们有必要介绍一下lambda的作用域,因为stream通常是与lambda搭配来使用的,并且最近在工作中也遇到了作用域上面的问题(无法访问接口的默认方法)。

Read More