Redis如何从追加文件中恢复数据?

3
如果我们在redis.conf文件中启用了AppendFileOnly,那么每次更改redis数据库的操作都会记录在该文件中。
现在,假设Redis已经使用redis.conf文件中的“maxmemory”指令分配给它的所有内存。
为了存储更多数据,它开始通过redis.conf文件中指定的任何一种行为(如volatile-lru、allkeys-lru等)删除数据。
假设某些数据从主内存中删除了,但其日志仍然存在于AppendOnlyFile中(如果我错了,请纠正我)。我们能否使用这个AppendOnlyFile获取那些数据?
简单地说,我想问的是是否有办法将那些已删除的数据重新存储到主内存中?例如,我们可以将该数据存储到磁盘内存中,在需要时将该数据加载到主内存中。
2个回答

2

我从谷歌用户组中得到了这个答案,现在分享给大家。

----->

键的清除在AOF中被记录为显式DEL命令,所以当文件被完全重放时,始终保持一致性。

AOF仅用于在重新启动后恢复数据集,并且不用于Redis提供数据。如果该键仍然存在于其中(带有随后的清除DEL),则"恢复"它的唯一方法是手动编辑AOF以删除相应的删除操作并重新启动服务器。

-----> 另一个答案

AOF顾名思义是一个添加的文件。 它不是Redis搜索并删除创建记录的数据库。 我认为,这对于收益太小而导致工作量过大。

如前面所述,重新编写AOF的配置(请参见BGREWRITEAOF命令作为一个示例)将从AOF中删除任何已删除的键,现在您无法从AOF文件中恢复这些键。 AOF不是恢复删除键的最佳介质。 它旨在作为在崩溃之前恢复数据库的一种方式 - 没有任何已删除的键。

如果您想要能够在删除后恢复数据,则需要不同类型的备份。 更可能是快照(RDB)文件,该文件已存档为保存的日期/时间。 如果您发现需要恢复数据,请从您知道键存在的时间选择快照文件,将其加载到单独的Redis实例中,并使用RESTORE或GET等命令检索键。 如前所述,有可能解析RDB或AOF文件内容以从中提取数据,而无需将文件加载到运行中的Redis实例中。 这种方法的缺点是这些工具与Redis代码分开,可能不总是理解Redis服务器所理解的文件数据格式的更改。 您可以决定哪种方法能够以所需速度和可靠性工作。


1
但是它的日志仍然会在AppendOnlyFile中存在(如果我说错了,请纠正我)。我们能否使用这个AppendOnlyFile获取数据?
不行,你无法获取数据。当Redis驱逐一个键时,它也会将一个删除命令附加到AOF中。重写AOF后,与被驱逐的键有关的任何内容都将被删除。
如果有任何方法可以在主内存中获取已删除的数据吗?比如说,我们可以将数据存储到磁盘内存中,在需要时将数据加载到主内存中。
不行,你不能这样做。你必须采取另一个持久化数据存储(例如Mysql、Mongodb)来保存数据到磁盘,并使用Redis作为缓存。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接