将一些 redis 数据归档到磁盘

Posted

技术标签:

【中文标题】将一些 redis 数据归档到磁盘【英文标题】:archiving some redis data to disk 【发布时间】:2013-07-02 01:11:49 【问题描述】:

我最近一直在使用 redis,真的很喜欢它。我最熟悉持久性(rdb 和 aof)。我确实有一个担心。一旦不再重要,我希望能够有选择地将我的一些数据“归档”到磁盘(或更便宜的存储)。我真的不想删除它,因为它在某些时候可能很有价值。

我所有的密钥都命名为id_<id>_<someattribute>。因此,当我完成 id 4 后,我想“归档”所有匹配 id_4_* 的键。我可以用命令行很容易地查看它们,但我不能对它们做任何事情,persay。我有很多与这个数据集相关的数据(非常大的位图),坦率地说,一旦 id 不再相关或不再重要,我就负担不起空间。

如果这是 mysql,我将拥有不同的表,并且很容易将其转储到 .sql 文件,然后删除表。实际的 .sql 文件对我没有直接用处,但我可以在需要时重新导入数据。或者也许我必须使用 mysql 数据库,并且我想将一个表移动到另一个数据库。这些过程是否有 redis 推论?有没有办法制作一个作为数据子集的 rdb 或 aof 文件?

任何关于此事的帮助或意见将不胜感激!谢谢!

【问题讨论】:

添加评论有点老问题,但是您有选择地归档密钥的解决方案是什么?我将使用位图存储分析数据,并且我可能想要存档位图键,其中包含旧/非活动内容的访问者统计信息。 我刚刚在下面发布了我所做的作为答案。希望对您有所帮助! 【参考方案1】:

@Hoseong Hwang 最近问我做了什么,所以我发布了我最终做了什么。

其实很简单。我受益于我的密钥空间被不同的用户分割的事实。我所有的密钥都是user_<USERID>_<OTHERVALUES> 的结构。我的归档需求是基于用户的,一些用户的数据不再需要保存在 redis 中。

所以,我在本地的另一个端口(6380?)或另一台机器上启动了redis-server 的另一个实例,这没有区别。然后,我写了一个简短的脚本,基本上只叫KEYS user_<USERID>_*(我理解KEYS的阻塞性质,我的密钥空间太小没关系,如果这对你来说是个问题,你可以使用SCAN .) 然后,对于每个键,我 MIGRATED 将它们添加到新的 redis-server 实例。在他们都做完之后。我做了一个SAVE 以确保该实例的 rdb 文件是最新的。现在我有了那个 rdb,这正是我想要归档的内容。然后我终止了那个临时的redis-server,内存被回收了。

现在,将 rdb 文件保存在便宜且安全的地方。如果您再次需要它,执行与我上面的过程相反的操作以将这些密钥返回到您的主 redis-server 将相当简单。

【讨论】:

感谢您的快速回答!这似乎是一个聪明的方法。就我而言,我需要实时恢复存档的密钥 - 可能是关系数据库或 S3 等外部存储。【参考方案2】:

我的建议是从转储文件中提取数据,而不是尝试从实时 Redis 实例中提取数据。

运行 bgsave 命令生成转储,然后使用 redis-rdb-tools 提取您感兴趣的密钥 - 您可以轻松地将结果作为 json 文件获取。

见https://github.com/sripathikrishnan/redis-rdb-tools

您可以将 json 数据保存在平面文件中,或者如果您需要对它们进行索引以进行检索,请尝试将它们存储到关系数据库或文档存储中。

【讨论】:

【参考方案3】:

给你一些建议...

我希望能够有选择地将我的一些数据“归档”到 磁盘(或更便宜的存储)一旦不再重要。我不 真的很想删除它,因为它在某些时候可能很有价值。

如果此类数据如此有价值,请使用传统数据库进行存储。尽管 redis 支持快照到磁盘和 AOF 日志,但您应该将其视为主要是易失性存储。 redis 的主要用例是减少延迟,而不是有价值数据的持久性。

所以当我完成 id 4 后,我想“归档”所有 匹配 id_4_*

什么构成完成?你需要问自己这个问题;这是否意味着1天后数据可能会从redis中掉出来?如果是这样,只需使用 TTL 和过期时间让 redis 从内存中删除对象。如果您再次需要它,请回退到数据库并将对象拉回redis。第一个客户端将从数据库中提取,但后续请求将被缓存。如果 done 表示与特定持续时间无关的内容,则您必须手动从 redis 中删除项目以节省内存空间。

如果这是 mysql,我会有不同的表,并且会非常 轻松地将其转储到 .sql 文件,然后删除表。实际上 .sql 文件对我没有直接用处,但我可以重新导入数据 如果/当我需要它。

我们在我的公司也这样做。重要数据从作为按需作业执行的 rdbms 导入 redis。我们不删除表,我们只是选择性地将数据库中的数据导入redis;没有错。

有没有办法制作一个 rdb 或 aof 文件,它是 数据?

我不相信有办法进行选择性归档;要么全部,要么没有。

IMO,多花点时间玩 redis。我强烈建议利用开箱即用的功能,而不是重新发明和/或过度设计解决方案以满足您的需求。

希望对您有所帮助!...

【讨论】:

感谢您的想法。但是 redis 支持更复杂的数据结构,而不仅仅是一个简单的键/值,都表示为字符串。他们有哈希和位图。我真的不知道如何在 mysql 中轻松存储位图。 redis.io/commands/setbit我经常使用这个命令在redis中创建位图

以上是关于将一些 redis 数据归档到磁盘的主要内容,如果未能解决你的问题,请参考以下文章

请教horizon7 永久磁盘备份恢复方案

Redis常用命令

redis 常用命令

redis 常用命令

Oracle数据库的归档日志写满磁盘空间解决办法

rac集群归档磁盘组原理