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 切换上下文损耗等)

参考资料

ringBuffer深入浅出