当前位置: 首页 > 面试题库 >

如何使用redis的DUMP和RESTORE(离线)?

汪晨
2023-03-14
问题内容

我尝试了redis的DUMP命令,重定向到文件(或管道),但是RESTORE报告此错误:

$ redis-cli dump test > /tmp/test.dump
$ cat /tmp/test.dump | redis-cli -x restore test1 0
(error) ERR DUMP payload version or checksum are wrong
$ redis-cli dump test | redis-cli -x restore test1 0
(error) ERR DUMP payload version or checksum are wrong

我知道MIGRATE可以在线执行此操作,但是MIGRATE也会从原始服务器中删除该密钥,并且我不希望我的Redis暴露于公共互联网中。

有一些第三方选件,Redis的-RDB的工具,例如,但毕竟,究竟如何做DUMPRESTORE工作?


问题答案:

实际上,转储/还原命令不是为从命令行使用而设计的,因为序列化格式是二进制的(与用于RDB转储的格式相同)。由于外壳程序倾向于解释那些字符(即使使用“可打印”格式时),这也带来了不便。

这是“可打印”格式:

$ redis-cli lpush test 1 2 3 4 5
(integer) 5
$ redis-cli dump test
"\n\x15\x15\x00\x00\x00\x12\x00\x00\x00\x05\x00\x00\xf6\x02\xf5\x02\xf4\x02\xf3\x02\xf2\xff\x06\x00\x1c\x8a\xda\x0e}\xcb\xe1."

“可打印”格式不能用作-x选项的输入,该选项确实需要实际数据。这是redis-cli的误导行为。

但是,有一种简单的方法来获取原始格式:

$ redis-cli --raw dump test | hexdump -C
00000000  0a 15 15 00 00 00 12 00  00 00 05 00 00 f6 02 f5  |................|
00000010  02 f4 02 f3 02 f2 ff 06  00 1c 8a da 0e 7d cb e1  |.............}..|
00000020  2e 0a                                             |..|

现在,由于最后一个字符是错误的,因此无法直接通过管道将-raw dump的结果传递给-x还原。比较–raw和printable转储的输出。您会注意到–
raw选项在末尾添加了一个额外的\ n。原始选项不是100%原始;-)

必须先删除此多余的字符,然后才能通过-x选项处理数据。最后,在恢复中通过管道传输转储输出的正确命令(在GNU / Linux系统上)是:

$ redis-cli --raw dump test | head -c-1 | redis-cli -x restore test1 0
OK

不好看 我希望大多数人会依靠perl / python / ruby​​脚本而不是shell来执行此类任务。



 类似资料:
  • Redis-Dump 是一个将 Redis 数据导入/导出为 json 格式数据的小工具,目前还在Alpha版本,目前提供两个命令,将Redis数据层出成json的redis-dump命令,以及将json文件导入到redis中的redis-load命令,喜欢尝鲜的同学可以试玩一下。 另外个人认为这也是一个适合新手的Redis数据结构学习工具,通过将Redis几种数据结构dump成json,可以让我

  • rsync 命令 rsync -avz /etc/ ~/etc.bak #将目录同步到另一个目录,目录后有 / 代表只同步目录内的数据,没有 / 代表包括目录本身 rsync -avz source_dir username@host:PATH #同步数据到其他服务器 rsync -av username@host:PATH destination #将远程主机的数据同步到本地 dump 命

  • 本文向大家介绍redis中使用redis-dump导出、导入、还原数据实例,包括了redis中使用redis-dump导出、导入、还原数据实例的使用技巧和注意事项,需要的朋友参考一下 redis的备份和还原,借助了第三方的工具,redis-dump 1、安装redis-dump 2、redis-dump导出数据 3、redis-load还原数据

  • 据我所知,spring启动和spring会话为我们提供了一站式自动配置,但当我的应用程序使用会话redis和应用程序缓存redis时,它们不是同一个redis服务器;我如何配置它,非常感谢您的回复!

  • 现在,我意识到当前的master没有太多内存,所以我在这个特定的服务器上停止了sentinel和redis实例。并在一台新机器上进行了相同的设置。所以,我仍然有相同的部署,3个redis实例和3个哨兵。 问题是,现在哨兵们说,主人倒下了,因为他们认为主人是我移除的服务器。我应该做些什么来告诉sentinel它不需要在循环中包括服务器。

  • RESTORE key ttl serialized-value 反序列化给定的序列化值,并将它和给定的 key 关联。 参数 ttl 以毫秒为单位为 key 设置生存时间;如果 ttl 为 0 ,那么不设置生存时间。 RESTORE 在执行反序列化之前会先对序列化值的 RDB 版本和数据校验和进行检查,如果 RDB 版本不相同或者数据不完整的话,那么 RESTORE 会拒绝进行反序列化,并返回一