2015-04-28 28 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},並將每行存儲爲一個值,可能是您需要的,具體取決於每行中的內容。

簡而言之:存儲較小的值;挑選你經常搜索的東西,而這在排序時是有意義的,作爲關鍵。

相關問題