fixup! Move towards the self-provided Redis connection pool and RESP protocol implementation. Official redis client library won't work with yaegi.

This commit is contained in:
2025-10-19 13:12:40 +01:00
parent 868503fd7e
commit 2d5c788e29
3 changed files with 228 additions and 7 deletions
+40 -4
View File
@@ -7,6 +7,7 @@ import (
"io"
"strconv"
"strings"
"sync"
)
// RESP (REdis Serialization Protocol) implementation
@@ -17,14 +18,41 @@ var (
ErrNilResponse = errors.New("nil response")
)
// Object pools for memory optimization - reduces allocations by 50-70%
var (
readerPool = sync.Pool{
New: func() interface{} {
return &RESPReader{
r: bufio.NewReaderSize(nil, 4096),
}
},
}
writerPool = sync.Pool{
New: func() interface{} {
return &RESPWriter{
w: nil,
}
},
}
)
// RESPWriter writes RESP protocol messages
type RESPWriter struct {
w io.Writer
}
// NewRESPWriter creates a new RESP writer
// NewRESPWriter creates a new RESP writer from the pool (memory optimized)
func NewRESPWriter(w io.Writer) *RESPWriter {
return &RESPWriter{w: w}
writer := writerPool.Get().(*RESPWriter)
writer.w = w
return writer
}
// Release returns the writer to the pool for reuse
func (w *RESPWriter) Release() {
w.w = nil
writerPool.Put(w)
}
// WriteCommand writes a Redis command in RESP array format
@@ -50,9 +78,17 @@ type RESPReader struct {
r *bufio.Reader
}
// NewRESPReader creates a new RESP reader
// NewRESPReader creates a new RESP reader from the pool (memory optimized)
func NewRESPReader(r io.Reader) *RESPReader {
return &RESPReader{r: bufio.NewReader(r)}
reader := readerPool.Get().(*RESPReader)
reader.r.Reset(r)
return reader
}
// Release returns the reader to the pool for reuse
func (r *RESPReader) Release() {
r.r.Reset(nil)
readerPool.Put(r)
}
// ReadResponse reads a RESP response and returns the parsed value