讓我們將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功能。
CORRECTION:ZRANGEBYSCORE JOBINFO-的JobID -inf + INF WITHSCORES 5 - >(作業-123,JOBINFO-876) – Brian
CORRECTION: ZRANGEBYSCORE JOBINFO-的JobID -inf + INF WITHSCORES 123 - >(作業-123,JOBINFO -876) – Brian