将CSV数据上传到Redis

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

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

我如何做到这一点?

一个解决scheme将是每个键代表整个CSV文件,但我期待着看看是否有另一种select。

你有创意。

您不必指定是否将所有CSV分开,或者如果所有数据都可以集中到一个“组”types的逻辑结构(就像您在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,那么您只需对该行的名称进行一些引用即可:

 // `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])); } 

通过键值存储,您可以使用更快的search(通常为O(log n))replaceCSV文件中某行的线性search。 并且可能会给你关键值的范围查询。

使用文件名作为密钥,不会在使用文件系统中保留数据方面花费太多。 但{file name}.{row number} ,并将每行存储为一个值,可能是你所需要的,这取决于每行中的内容。

简而言之:存储小值; 挑选你经常search的东西,这个东西在sorting的时候是有意义的,作为关键。