`
September 19, 2019 本文阅读量

初识Ring Buffer

Ring Buffer是一个圆形的,首尾相接的数据结构,可以用作缓存。

使用场景

一个服务器程序可能会收到多个客户端的网络数据流,在每个数据流上实际上有多个独立的数据包,只有一个数据包接收完整了才能做进一步的处理。如果在一个网络连接上数据包并不完整,就需要暂时缓存住尚未接收完的数据包。

解决以上场景的方法肯定不止RingBuffer这一种,同理RingBuffer也不只是这一个使用场景,这里只是介绍下RingBuffer在这种场景下的使用。

实现方式

RingBuffer结构定义:

const A = 10
// Byts ...
type Byts []byte

// RingBuffer . not concurrent safe
type RingBuffer struct {
	data   []*Byts
	pRead  uint
	pWrite uint
	size   uint
}

// NewRingBuffer . at least 2
func NewRingBuffer(size uint) *RingBuffer {
	if size <= 1 {
		panic("too small size")
	}
	return &RingBuffer{
		data:   make([]*Byts, size),
		pRead:  0,
		pWrite: 0,
		size:   size,
	}
}

RingBuffer方法定义:


func (buf *RingBuffer) Write(d Byts) error {
	if (buf.pWrite+1)%buf.size == buf.pRead {
		return errFull
	}
	buf.data[buf.pWrite] = d
	buf.pWrite = (buf.pWrite + 1) % buf.size
	return nil
}

func (buf *RingBuffer) Read() (*Byts, error) {
	if buf.pRead == buf.pWrite {
		return nil, errEmpty
	}
	d := buf.data[buf.pRead]
	buf.pRead = (buf.pRead + 1) % buf.size
	return &d, nil
}

// Reset . drop all data
func (buf *RingBuffer) Reset() {
	buf.pRead = 0
	buf.pWrite = 0
}

参考文献

  1. Ring-Buffer in disroptor Introduction
  2. Goim Ring Buffer实现
  3. Ring Buffer 应用