2017-04-24 80 views
2

所以我一直在嘗試使用Jedis將我們的數據庫從MySQL遷移到Redis。我明白在Redis上,一切都是關鍵和價值。但我沒有幾個基本問​​題。SQL插入和選擇使用JEDIS

1)比方說,我有一個哺乳動物類,它有eyes,ears,nose,hand,legs作爲成員。所以現在我可以有多個值,例如

2,2,1,2,2 

2,3,1,1,2 

1,2,1,6,2 

每行表示它們的數量。 2隻眼睛,2只耳朵,1只鼻子,2隻手,2只腿。

我想存儲這些數據,就像我們以前在mySQL上那樣,每列都會有它們的值。但是使用Jedis我該如何實現這一目標?

我嘗試使用自動遞增鍵值和使用jedis.sadd(jedis.get("counter"),stringg_value)

存儲所有的人都當我嘗試使用索引打印任何價值,我可以很清楚的看到,在 值不在的順序我補充說。如果我將字符串值添加爲「一,二,三,四」,結果將是「四,二,三,一」。這是非常隨機的,並不是所有的值都是以這種格式存在的,它們也改變了。

我的問題是如何將csv格式的數據存儲到Redis中?

2)如何根據多個條件從Jedis獲取數據。就像一隻有2只耳朵,2隻眼睛和4隻手的哺乳動物。我應該使用什麼方法?

+0

RDBMS和關鍵值存儲區是不同的東西。你正在觀察一些差異。使用正確的工具來完成正確的工作。從MySQL遷移到Redis就像將您的汽車轉換成小船一樣。 – Kayaman

+0

我明白你在說什麼,但是我有一個要求,我必須選擇插入選擇一些數據匹配模式。在那邊,SQL花費了太多時間,但我相信在這種情況下,redis將像魅力一樣工作。 – driftking9987

+0

我試圖優化SQL方面,但最常見或不是,我得到某種鎖,並最終最終放慢了系統。整個計算大約需要150ms,但是這些SQL連接最終需要大約250ms才能完成。我仍在探索選項。 – driftking9987

回答

2

存儲值的一種方法是使用Redis散列類型來存儲每個行。使用散列,您可以擁有靈活的模式並按名稱存儲每個屬性。你還需要一個唯一的鍵來查找每一行,可能是名字。該代碼看起來像這樣:

Map<String,String> row = new HashMap<>(); 

row.put("eyes", String.valueOf(2)); 
row.put("ears", String.valueOf(2)); 

... 

jedis.hmset("wombat", row); 

查詢是困難的。 Redis不提供像SQL一樣的通用查詢語言。您需要預先確定您的查詢,並根據您的查詢維護二級索引結構或將行數據映射到不同的數據結構。

查看可用數據類型的Redis.io。根據您的查詢,您可能會發現採用完全不同的方法來存儲數據更有意義。

您可能需要重構數據以創建具有特定屬性的不同動物的集合。

ears_2 = ('wombat', 'dragon') 
ears_3 = ('mutant wombat', 'mutant dragon') 
legs_4 = ('wombat', 'dragon') 

然後,您可以使用交集模擬你和查詢。

+0

但是,如果有人使用redis,他/她需要存儲以及查詢。如果redis只能幫助存儲,那麼它有什麼用處?這是否意味着一個人將不得不使用redis和另一個RDBMS數據庫? – driftking9987

+1

如果您對通用查詢語言有強烈的需求,並且無法枚舉應用程序中的查詢,那麼使用Redis存儲和查詢數據可能不是最佳解決方案。另一種可能會給你帶來更好結果的方法是在Redis中緩存查詢結果並努力優化你的MySQL。 –