Coup de Grace

君技术本当上手1805

标题算 neta 一下日本语本当上手.

最近忙的幸福感比较低,趁着项目发布验收抽时间整理了1800多条 Reading List.

书没怎么读也没什么输出.

都会使用 Linnk 将文章快照免得丢失.


ELO RATING SYSTEM IMPLEMENTED IN SINGLE SQL SELECT

地址


高性能队列Disruptor

地址

日志场景应用

Disruptor通过以下设计来解决队列速度慢的问题:

环形数组结构
为了避免垃圾回收,采用数组而非链表。同时,数组对处理器的缓存机制更加友好。

元素位置定位
数组长度2^n,通过位运算,加快定位的速度。下标采取递增的形式。不用担心index溢出的问题。index是long类型,即使100万QPS的处理速度,也需要30万年才能用完。

无锁设计
每个生产者或者消费者线程,会先申请可以操作的元素在数组中的位置,申请到之后,直接在该位置写入或者读取数据。

其实这种无锁设计会有种指令式跟终态形式的感觉.

多个生产者的情况下,会遇到“如何防止多个线程重复写同一个元素”的问题。Disruptor的解决方法是,每个线程获取不同的一段数组空间进行操作。这个通过CAS很容易达到。只需要在分配元素的时候,通过CAS判断一下这段空间是否已经分配出去即可。

但是会遇到一个新问题:如何防止读取的时候,读到还未写的元素。Disruptor在多个生产者的情况下,引入了一个与Ring Buffer大小相同的buffer:available Buffer。当某个位置写入成功的时候,便把availble Buffer相应的位置置位,标记为写入成功。读取的时候,会遍历available Buffer,来判断元素是否已经就绪。

应用场景:


二维码的生成细节和原理

地址

推特上偶得这一张动图,看了看原理真是太长了..

记得下标记区,数据区,纠错码就不错了.