代码拉取完成,页面将自动刷新
canal 支持到redis2.x到 5.x 和向前兼容且具有mixed(rdb+aof)协议的复制工具
模拟redis slave,然后去dump redis master的rdb和aof(后续补上架构设计图)
go get github.com/yametech/canal
package main
import (
"github.com/yametech/canal"
"log"
"os"
"time"
)
type printer struct{}
func (p *printer) Command(cmd *canal.Command) error {
log.Printf("[PRINTER] cmd=%v\n", cmd)
return nil
}
func main() {
log.SetOutput(os.Stdout)
cfg, err := canal.NewConfig(
"127.0.0.1:6379",
canal.DialKeepAlive(time.Hour*16800),
canal.DialWithLocalPort(6379), // 使用本地固定端口作为slave
)
if err != nil {
panic(err)
}
repl, err := canal.NewCanal(cfg)
if err != nil {
panic(err)
}
defer repl.Close()
if err := repl.Run(&printer{}); err != nil {
panic(err)
}
}
// starting from the location of an instance example
package main
import (
"github.com/yametech/canal"
"log"
"os"
"time"
)
type printer struct{}
func (p *printer) Command(cmd *canal.Command) error {
log.Printf("[PRINTER] cmd=%v\n", cmd)
return nil
}
func main() {
log.SetOutput(os.Stdout)
cfg, err := canal.NewConfig(
"127.0.0.1:8888",
canal.DialKeepAlive(time.Minute*5),
)
if err != nil {
panic(err)
}
repl, err := canal.FromOffsetCanal(cfg, "0cc79e52c7cdcaa58535bb2ce23f46ee1343246c", 111)
if err != nil {
panic(err)
}
defer repl.Close()
if err := repl.Run(&printer{}); err != nil {
panic(err)
}
}
//
type printer struct{}
func (p *printer) Command(cmd *canal.Command) error {
// log.Printf("[PRINTER] cmd=%s\n", cmd.String())
return nil
}
func main() {
log.SetOutput(os.Stdout)
cfg, err := canal.NewConfig(
"127.0.0.1:6379",
canal.DialKeepAlive(time.Minute*5),
// canal.DialPassword(""),
)
if err != nil {
panic(err)
}
// 自动找主
cfg.ReplMaster()
repl, err := canal.NewCanal(cfg)
if err != nil {
panic(err)
}
defer repl.Close()
if err := repl.Run(&printer{}); err != nil {
panic(err)
}
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。