server.(Restorer) 介面定義一個 server.(Restorer) 介面,並且實作 server.(*aofRestorer):
// file: ./internal/server/restorer.go
package server
import (
"context"
"errors"
"io"
"olivine/internal/service"
)
type Restorer interface {
LoadFromDisk() error
}
func NewRestorer(aof service.AOF, handler Handler) Restorer {
return &aofRestorer{aof: aof, handler: handler}
}
type aofRestorer struct {
aof service.AOF
handler Handler
}
func (r *aofRestorer) LoadFromDisk() error {
for {
cmd, err := r.aof.Read()
if err != nil {
if errors.Is(err, io.EOF) {
return nil
}
return err
}
if _, err := r.handler.Exec(context.Background(), cmd); err != nil {
return err
}
}
}
server.(Restorer)在目前的 server.(Server) 介面中新增一個 RestoreFromDisk():
// file: ./internal/server/server.go
type Server interface {
ListenAndServe() error
RestoreFromDisk() error
}
並且在 server.(*simpleSrv) 中加入 server.(Restorer) 並實現 RestoreFromDisk():
type simpleSrv struct {
handler Handler
restorer Restorer
listener net.Listener
}
func (s *simpleSrv) RestoreFromDisk() error {
return s.restorer.LoadFromDisk()
}
在 main.NewApp() 中加入對 server.(Restorer) 的初始化:
// file: ./cmd/olivine/app.go
func NewApp() (*App, error) {
aof, err := service.NewAOF(AOFPath)
if err != nil {
return nil, err
}
handler := server.NewHandler(cmd.NewCommands(repo.NewStorage()), server.NewAOFMiddleware(aof))
return &App{
srv: server.NewServer(
handler,
server.NewRestorer(aof, handler),
),
}, nil
}
自此,我自已經完成了一個 Redis 的基本功能:
而從明天開始,將會進入比較進階的篇章。