2016-05-16 77 views
4

我有像Job,JobInfo表。我想執行下面的查詢 -如何設計Redis數據結構以執行類似於redis中數據庫查詢的查詢?

「SELECT JJIDID FROM Job J,JobInfo B WHERE B.JobID = J.JobID AND BatchID = 5850 AND B.Status = 0 AND J.JobType <> 2」

我該如何編寫我的redis數據類型,以便我可以將這些查詢映射到redis?

如果我嘗試在redis散列中映射表作業的行,例如(hash j jobid 1 status 2)&同樣,表JobInfo中的行再次作爲redis hash作爲(hash jinfo jobid 1 jobtype 3)。

所以我的表可以是一組散列。工作表可設置的條目JobSet:JOBID & JOBINFO表可以像JobInfoSet項設置:JOBID

但我在的時候我會做JobSet & JobInfoSet燒結困惑。我將如何查詢該散列來獲取密鑰?在設置jobSet的散列內容與表JobInfoSet的散列內容不相同(它們可能具有不同的鍵值對)

那麼我究竟會得到什麼結果作爲SINTER的輸出?以及我將如何查詢該輸出鍵值對?

所以表將Redis的集合散列

回答

3

Redis的目的不是要構建在SQL的方式的數據。除了一個內存鍵值存儲,它支持五種類型的數據結構:字符串,哈希,列表,集合和排序集合在高層次上,這充分表明Redis旨在解決由於關係數據模型中的高計算而出現的性能問題。但是,如果要在內存結構中執行sql查詢,則可能需要查看memsql

1

讓我們將SQL語句分解爲不同的組件,我將嘗試說明redis如何完成各個部分。

從Job J中選擇J.JobID,J.JobName;

我們使用SQL主索引作爲redis中的redis自然索引,將「Job」中的每一行轉換爲redis中的哈希。 例如: SQL

==JobId==|==Name== 
123  Fred 

Redis的 HSET的工作:123名弗雷德 可以概括爲

Job-123 => {"Name":"Fred"} 

因此,我們可以存儲在Redis的哈希字段列,

比方說,我們爲JobInfo做同樣的事情。每個JOBINFO對象都有自己的ID

JobInfo-876 => {"meta1": "some value", "meta2": "bla", "JobID": "123"} 

在SQL通常我們會用我們維持自己的二級指標上JobInfo.JobID但在土地的NoSql輔助索引。

Sorted Sets對此很好。 因此,當我們想通過一些字段抓取JOBINFO對象的JobId在這種情況下,我們可以將其添加到有序集合這樣 ZADD JOBINFO-作業ID 123 JOBINFO-876

這與1個元件產生一組在其{JobInfo-876}得分爲123.我意識到強制所有JobID進入浮點範圍是一個不好的主意,但在這裏和我一起工作。

現在,當我們想要查找給定JobID的所有JobInfo對象時,我們只需要在索引中執行一個日誌(N)查找。 ZRANGEBYSCORE JOBINFO,作業ID 123 123 返回「JOBINFO-876」

我們實現簡單連接,我們簡單地通過他們的JobIDs存儲作業鍵重用這個JOBINFO-作業ID索引。 ZADD JOBINFO-作業ID 123工作-123

做到 SELECT J.JobID,J.Name,B.meta1從作業一些類似於時,JOBINFO USING(作業ID)。因此。

這將轉化爲掃描JobInfo-JobID二級索引並重新組織Job和JobInfo返回的對象。 ZRANGEBYSCORE JOBINFO-的JobID -inf + INF WITHSCORES 5 - >(作業-123,JOBINFO-876)

這些對象都有着相同的JobID。客戶端然後你會異步獲取所需的字段。或者你可以將這些查找嵌入到lua腳本中。這個lua腳本可能會讓redis掛起很長時間。通常情況下,redis會試圖公平對待客戶,並且希望您擁有短批量查詢而不是長查詢。

現在我們遇到了一個很大的問題,如果我們想要結合二級索引怎麼辦。假設我們在JobInfo.Status上有一個二級索引,而在Job.JobType上有另一個索引。 如果我們使用正確的JobType創建一組所有作業,並將它用作JobInfo-JobID共享二級索引上的過濾器,那麼我們不僅消除了錯誤的Job元素,還消除了每個JobInfo元素。我們可以,我猜想在交集處獲取分數(JobID),並用這些分數重新獲取所有JobInfo對象,但是我們失去了一些我們所做的過濾。

正是在這裏redis崩潰。

這裏是關於redis自己的創建者的二級索引的文章:http://redis.io/topics/indexes 他爲了過濾目的而觸及多維索引。正如你所看到的,他以一種非常靈活的方式設計了數據結構。最具吸引力的一個事實是,具有相同分數的排序集合元素按照字典順序存儲。因此,您可以輕鬆地讓所有元素的得分爲0,並搭載Redis的速度,並更像cockroachDB,它依賴全局命令來實現許多SQL功能。

+0

CORRECTION:ZRANGEBYSCORE JOBINFO-的JobID -inf + INF WITHSCORES 5 - >(作業-123,JOBINFO-876) – Brian

+0

CORRECTION: ZRANGEBYSCORE JOBINFO-的JobID -inf + INF WITHSCORES 123 - >(作業-123,JOBINFO -876) – Brian

1

對方回答是Redis的完全正確的最高版本爲3.4

Redis的最新版本,從4.0版開始,包括支持模塊。

模塊是非常強大的,它發生了,我只是寫了一個小的模塊,將SQLite嵌入到redis本身; rediSQL

使用該模塊,您實際上可以在您的redis instace中使用全功能的SQL數據庫。