RingBuffer
RingBuffer(环形缓冲区)常用做高速缓冲队列,采用环形复用(缓存区写满之后,从首地址重新写入),使用较小的实际物理内存实现了线性缓存。例如著名的Disruptor 高性能的主要原因就是使用了 RingBuffer。
实现原理
- 存在读写2个序号
- 读/写序号一直累加
- 读/写序号取模buffer长度等于当前当前读写指针位置
- buffer里面的数据不需要删除,覆盖即可
- RingBuffer采用数组实现,对 CPU 高速缓存友好(cache line 会加载相邻元素,数组元素天生相邻),访问速度比链表快。
使用场景
- 依赖一个优惠券的查询接口,假设该接口提供分页查询能力。单次最多返回100张优惠优惠券,单次 rt 是20ms
- 优惠券的扩展信息是另一个接口,该接口性能提供批量查询能力,单次做多支持30张优惠券,单次 rt 是30ms
- 假设某个用户有500张优惠券,如果是串行调用,则整体时间是
(500/100)*20 + (500/30)*30
。采用 RingBuffer 解耦两个接口依赖,则优化后的 rt 时间, 理论上可以缩减至30ms左右(排除 CPU 切换上下文损耗等)