2

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

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

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

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

4

3 回答 3

3

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

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

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

现在,将 rdb 文件保存在某个地方,以便便宜、安全地保存。而且,如果您再次需要它,与我上面的过程相反,将这些键重新放入您的主键redis-server将相当简单。

于 2016-07-03T16:51:51.977 回答
1

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

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

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

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

于 2013-07-02T12:06:14.460 回答
0

给你几个建议...

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

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

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

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

如果这是 mysql,我将拥有不同的表,并且很容易将其转储到 .sql 文件,然后删除表。实际的 .sql 文件对我没有直接用处,但我可以在需要时重新导入数据。

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

有没有办法制作一个作为数据子集的 rdb 或 aof 文件?

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

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

希望有帮助!...

于 2013-07-02T03:31:16.010 回答