初识Ring Buffer
September 19, 2019
使用场景 #
一个服务器程序可能会收到多个客户端的网络数据流,在每个数据流上实际上有多个独立的数据包,只有一个数据包接收完整了才能做进一步的处理。如果在一个网络连接上数据包并不完整,就需要暂时缓存住尚未接收完的数据包。
解决以上场景的方法肯定不止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
}