Goal: Dump Redis keys to a json file and restore them to a different Redis db.
I tried:
func dumpToFile(keys []string, client *redis.Client, filename string) {
f, err := os.Create(filename)
if err != nil {
log.Fatal("Couldn't open file")
}
defer f.Close()
data := make(map[string]string)
for _, key := range keys {
resp := client.Dump(context.Background(), key)
if resp.Error() != nil {
log.Printf("error dumping key %s: %s", key, err.Error())
continue
}
data[key] = resp.Val()
}
marshaledBytes, err := json.Marshal(data)
if err != nil {
log.Fatalf("Write failed: %s", err.Error())
}
err = ioutil.WriteFile(filename, marshaledBytes, 0644)
if err != nil {
log.Fatalf("error writing to file: %s", err.Error())
}
}
func restoreFromFile(filename string, client *redis.Client) {
content, err := ioutil.ReadFile(filename)
if err != nil {
log.Fatal(err)
}
data := make(map[string]string)
err = json.Unmarshal(content, &data)
if err != nil {
log.Fatal(err)
}
for key, value := range data {
newKey := key + "New"
log.Println("value=", value)
err = client.Restore(context.Background(), newKey, value)
if err != nil {
log.Printf("error restoring key %s: %s", key, err.Error())
}
}
}
Output:
The dump works fine and I get a file that looks like:
{"key1":"\u0000\u0004val1\t\u0000\ufffdgBR\u0010\u0019\ufffd\ufffd"}
(my redis instance has just 1 key named "key1" with value "val1").
However, restore throws this error:
error restoring key key1: ERR DUMP payload version or checksum are wrong
I checked other answers and issues on github that mention removing the new line at the end of the dumped value when using redis-cli. However, I don't see any new line when using the golang client.
Why does it still throw this error?