2015-04-28 249 views
1

我有一个包含1000行和大约15列的CSV文件。我打算将每行存储为一个简单的JSON对象作为Redis值,并将CSV文件的行号存储为Redis关键字。但是,一旦我开始向Redis上传多个CSV文件,在数据库中区分一个CSV文件和另一个CSV文件的最佳方式是什么?除了不同的Redis数据库实例本身之外,是不是Redis只有没有其他大型结构的键值?我知道Redis在内存中,但即使如此......如果您拥有数百万条记录,那么去搜索所需的密钥效率不是很低下?我不明白。如果我上传了100万个CSV文件,并且每个文件都有1000行,那么将会有10亿条记录要搜索,即使是内存数据库也是如此。我应该以另一种方式来做。将CSV数据上传到Redis

我正在寻找一种方法,以高效且合理的方式在Redis中表示每个CSV文件,其中每个CSV文件行都有自己的唯一键,Redis值将是列标题和数据。

我该如何做到这一点?

一个解决方案是每个键代表整个CSV文件,但我期待着看看是否有另一种选择。

+1

什么是redis中数据的最佳关键取决于您将如何使用数据和数据的特征。你可以开始在你的csv中使用唯一的ID作为键。这篇文章http://openmymind.net/Data-Modeling-In-Redis/将帮助你有一个大概的想法。 – number5

回答

2

你很有创意。

您不指定保留所有CSV是否很重要,或者如果所有数据都可以集中到一个“组”类型的逻辑结构中(就像您在RDBMS中的表中那样) )。

操作,前提是所有的数据可以一起去,你可以保持一个键增加你的ID的全局计数器为每个“行”:

// synchronous for easy writing/reading 
var rowid = client.get('csv row counter'); 
rowid = rowid || 1; 

// `csv` is an array of your json objects 
for (var i=0; i<csv.length; i++) { 
    client.set('csv-'+(rowid+i), JSON.stringify(csv[i])); 
} 

client.set('csv row counter', rowid+i); 

如果需要使用此方法,只要确保rowid的范围是正确的,以便同时上传将适当增加。

相反,如果你需要分别跟踪每个CSV的,那么你只需要命名具有一定的参考它的CSV行:

// `csvname` is initialized with the chosen name for this csv 
for (var i=0; i<csv.length; i++) { 
    client.set(csvname+'-'+i, JSON.stringify(csv[i])); 
} 
+0

是的,您可以将整个CSV文件的所有数据放到一个键值对中,我只是在想这可能不是非常有效,尤其是对于搜索 –

+1

我并没有远程建议您应该将整个CSV文件合并为一个键值对,而是不同CSV的行的键不必在逻辑上分开(在第一个示例中)。如果你需要它们在逻辑上分离,你可以使用第二个例子。 – Jason

2

键值存储让您更换一个线性搜索对于数据结构中具有更快搜索(通常为O(log n))的CSV文件中的行。并且可能会给你关键值的范围查询。

仅使用作为密钥的文件名不会在使用将文件系统中的数据留在您身上。但是,{file name}.{row number},并将每行存储为一个值,可能是您需要的,具体取决于每行中的内容。

简而言之:存储较小的值;挑选你经常搜索的东西,而这在排序时是有意义的,作为关键。

相关问题