优化缓存读取性能

This commit is contained in:
GoEdgeLab
2021-01-13 16:11:28 +08:00
parent 15e4045ec9
commit 2c413ce039
2 changed files with 37 additions and 5 deletions

View File

@@ -16,6 +16,9 @@ type FileReader struct {
headerSize int headerSize int
bodySize int64 bodySize int64
bodyOffset int64 bodyOffset int64
bodyBufLen int
bodyBuf []byte
} }
func NewFileReader(fp *os.File) *FileReader { func NewFileReader(fp *os.File) *FileReader {
@@ -129,10 +132,12 @@ func (this *FileReader) ReadHeader(buf []byte, callback ReaderFunc) error {
return err return err
} }
headerSize := this.headerSize
for { for {
n, err := this.fp.Read(buf) n, err := this.fp.Read(buf)
if n > 0 { if n > 0 {
if n < this.headerSize { if n < headerSize {
goNext, e := callback(n) goNext, e := callback(n)
if e != nil { if e != nil {
isOk = true isOk = true
@@ -141,9 +146,13 @@ func (this *FileReader) ReadHeader(buf []byte, callback ReaderFunc) error {
if !goNext { if !goNext {
break break
} }
this.headerSize -= n headerSize -= n
} else { } else {
_, e := callback(this.headerSize) if n > headerSize {
this.bodyBuf = buf[headerSize:]
this.bodyBufLen = n - headerSize
}
_, e := callback(headerSize)
if e != nil { if e != nil {
isOk = true isOk = true
return e return e
@@ -173,7 +182,30 @@ func (this *FileReader) ReadBody(buf []byte, callback ReaderFunc) error {
} }
}() }()
_, err := this.fp.Seek(this.bodyOffset, io.SeekStart) offset := this.bodyOffset
// 直接返回从Header中剩余的
if this.bodyBufLen > 0 && len(buf) >= this.bodyBufLen {
offset += int64(this.bodyBufLen)
copy(buf, this.bodyBuf)
isOk = true
goNext, err := callback(this.bodyBufLen)
if err != nil {
return err
}
if !goNext {
return nil
}
if this.bodySize <= int64(this.bodyBufLen) {
return nil
}
}
// 开始读Body部分
_, err := this.fp.Seek(offset, io.SeekStart)
if err != nil { if err != nil {
return err return err
} }

View File

@@ -249,7 +249,7 @@ func (this *HTTPRequest) doCacheRead() (shouldStop bool) {
logs.Error(err) logs.Error(err)
return true return true
} }
} else { } else { // 没有Range
this.writer.WriteHeader(reader.Status()) this.writer.WriteHeader(reader.Status())
err = reader.ReadBody(buf, func(n int) (goNext bool, err error) { err = reader.ReadBody(buf, func(n int) (goNext bool, err error) {