redis-shake工具
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

71 lines
1.3 KiB

package rotate
import (
"RedisShake/internal/log"
"fmt"
"os"
)
const MaxFileSize = 1024 * 1024 * 1024 // 1G
type AOFWriter struct {
name string
dir string
file *os.File
offset int64
filepath string
filesize int64
}
func NewAOFWriter(name string, dir string, offset int64) *AOFWriter {
w := new(AOFWriter)
w.name = name
w.dir = dir
w.openFile(offset)
return w
}
func (w *AOFWriter) openFile(offset int64) {
w.filepath = fmt.Sprintf("%s/%d.aof", w.dir, w.offset)
var err error
w.file, err = os.OpenFile(w.filepath, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644)
if err != nil {
log.Panicf(err.Error())
}
w.offset = offset
w.filesize = 0
log.Debugf("[%s] open file for write. filename=[%s]", w.name, w.filepath)
}
func (w *AOFWriter) Write(buf []byte) {
_, err := w.file.Write(buf)
if err != nil {
log.Panicf(err.Error())
}
w.offset += int64(len(buf))
w.filesize += int64(len(buf))
if w.filesize > MaxFileSize {
w.Close()
w.openFile(w.offset)
}
err = w.file.Sync()
if err != nil {
log.Panicf(err.Error())
}
}
func (w *AOFWriter) Close() {
if w.file == nil {
return
}
err := w.file.Sync()
if err != nil {
log.Panicf(err.Error())
}
err = w.file.Close()
if err != nil {
log.Panicf(err.Error())
}
log.Infof("[%s] close file. filename=[%s], filesize=[%d]", w.name, w.filepath, w.filesize)
}