将一些redis数据存档到磁盘

时间:2013-07-02 01:11:50

标签: redis archive

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

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

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

对此问题的任何帮助或意见将不胜感激!谢谢!

3 个答案:

答案 0 :(得分:2)

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

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

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

现在,将rdb文件保存在某个地方,以便廉价,安全地保存。如果您再次需要它,那么按照我上面的过程反过来将这些键重新放回主redis-server中将是相当简单的。

答案 1 :(得分:1)

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

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

请参阅https://github.com/sripathikrishnan/redis-rdb-tools

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

答案 2 :(得分:0)

给你一些建议......

  

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

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

  

因此,当我完成id 4时,我想“归档”所有键   匹配id_4 _ *

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

  

如果这是mysql,我会有不同的表格,而且非常   很容易将其转储到.sql文件,然后删除表。实际上   .sql文件对我没有直接用处,但我可以重新导入数据   如果/我什么时候需要它。

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

  

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

我不相信有选择性存档的方法;它是全部或全部。

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

希望有所帮助!...