2014-05-04 54 views
0

我的應用程序功能與Cassandra集成時遇到了一些問題。我正在嘗試爲我的users創建內容Feed。用戶可以創建帖子,反過來,該帖子的字段爲user_id。我將Redis用於整個社交圖,並僅將Cassandra列用於對象。在Redis中,用戶1擁有一組名爲user:1:followers的所有他/她的關注者ID。這些關注者id與posts表中的users表和user_ids中的Cassandra id相對應。Cassandra/Redis:創建沒有Cassandra'IN'二級索引的feed的方法?

我的目標本來是簡單地從這個Redis的設置成將使用FROM posts WHERE user_id IN (user_ids here)並抓住所有的職位從二級索引user_id查詢插上所有的user_id S的。問題在於Cassandra故意在二級索引中沒有supportIN運算符,因爲該索引會強制Cassandra搜索其所有節點的值。我剩下的只有兩個選項,我可以看到:爲郵件ID創建一個user:1:follow_feed的Redis列表,然後在單個查詢中爲這些帖子搜索Cassandra的主索引,或者按照現在的方式保留它,並運行單個查詢每user_iduser:1:follower集。

由於我已經在Redis中擁有大量的圖形數據,並且這個選項會爲每個用戶添加一個新列表,所以我真的偏向第一個選項。第二種方式更糟糕。我會對Cassandra施加大量的讀取負載,並且需要很長時間才能爲一組ID標記運行單個查詢。據我所知,我被困在一塊岩石和一塊堅硬的地方之間。有沒有辦法用多個值查詢二級索引?如果沒有,與更多的Redis列表或多個Cassandra查詢的選項相比,是否有更高效的方式來加載這些內容提要(RAM和速度方面)?提前致謝。

回答

1

不知道帖子表(最好是其他人)的模式,真的很難提出任何有用的建議。

我不清楚爲什麼你需要將user_id作爲輔助索引,而不是主鍵。

一般來說,對於像創建它的用戶那樣的關鍵內容是非常有用的,因爲它允許您非常有效地執行諸如檢索所有帖子(可選地在給定範圍內,假設它們按時間順序排序)。

使用Cassandra,如果您發現某個表可以有效地回答您希望執行的某些查詢而不是其他的查詢,那麼通常您最好使該表非常規化並創建另一個具有不同結構的表以保持您的查詢到單個CQL分區和節點。

CREATE TABLE posts (
    user_id int, 
    post_id int, 
    post_text text, 
    PRIMARY KEY (user_id, post_id) 
) WITH CLUSTERING ORDER BY (post_id DESC) 

這個表可以解答疑問,例如:

select * from posts where user_id = 1234; 

select * from posts where user_id = 1 and post_id = 53; 

select * from posts where user_id = 1 and post_id > 5321 and post_id < 5400; 

上POST_ID反向集羣是通過親身他們在分區的開頭內進行檢索中最近發表的最有效的SSTable。

在該示例中,user_id是分區列,意思是「具有此user_id的所有cql行將被哈希到相同的分區,因此是相同的物理節點,最終是相同的sstables。這就是爲什麼它可能

  1. 檢索與該user_id的所有帖子,因爲他們店連續
  2. 通過POST_ID
  3. 做一個遠程查詢檢索它們切片通過提供兩個分區檢索單個職位列(user_id)和聚類列(post_id)

實際上,這成爲散列映射查找的散列映射。但是,一個主要的警告是,當使用分區和集羣列時,您需要在查詢中提供從左到右的所有列,而不會跳過任何列。因此,在這種情況下,這意味着如果不知道post_id所屬的user_id,則無法檢索單個帖子。這在用戶代碼中是可尋址的(通過存儲反向映射並在必要時執行查找,或者通過將user_id編碼爲在您的應用程序周圍傳遞的post_id),但絕對要考慮。

+0

有趣,所以主鍵可以是user_id和post_id? – user3181113

+1

主鍵可以是分區鍵的組合(任何PRIMARY KEY子句中的第一項*和*集羣鍵(所有PRIMARY KEY子句中的其餘項)。 –

相關問題