2014-09-25 62 views
-1

我不確定這是否是一個好的電子郵件數據庫架構。電子郵件數據庫架構

我使用redis收件箱,存檔,發送列表爲每個用戶存儲對話ID(或線程ID)。每個對話ID指向消息ID的重新列表。每個消息ID都指向一個PostgreSQL消息表。無論何時發送或存檔或刪除郵件,我都會在redis列表中移動ID。

只有在跨消息進行搜索時,以及從線程獲取消息時,因爲必須始終檢查線程中的消息是否屬於您,有時候人們會在同一線程中進行回覆,但對於不同的用戶組。

這是一個很好的方法嗎?有更好的想法嗎?如何改善這一點?

+1

爲什麼這個模式的終點是PostgreSQL表? – Niloct 2014-09-25 21:20:53

+0

我無法爲自信而爭辯。我想如果我在Redis中存儲消息,它會佔用太多的內存。我不確定。 – 2014-09-26 06:11:19

回答

1

那麼,到底你的論點是正確的:)

http://redis.io/topics/faq

的Redis是一個內存中,但在磁盤上的數據庫中,所以它 代表了不同的權衡,其中非常高的寫和讀取速度 與的數據集的限制,即不能超過存儲器更大 實現

所以你不能在Redis中保存所有東西。另外,您不能方便地進行文本搜索,因此將實際的消息數據保存在PostgreSQL或其他數據庫(如Solr)中是必要的。

思考在您的案例中製作Redis圖層的真正用處是什麼。如果你保留Redis,它可以非常有效地處理ID,並且你也可以保留主題和電子郵件地址。做

最好的辦法是啓動一些用例:)

  • 顯示最新消息(通過時間戳下令TS

    > sadd messages 1 2 
    > hmset message:1 ts 1411783175 author_id 1 subject "An e-mail for starting things up" 
    > hmset message:2 ts 1411783150 author_id 2 subject "An early e-mail from the startup one" 
    > hmset author_id:1 name "Johnny" email "[email protected]" 
    > hmset author_id:2 name "Sarah" email "[email protected]" 
    > sort messages by message:*->ts get message:*->subject 
    1) "An early e-mail from the startup one" 
    2) "An e-mail for starting things up" 
    

在這種情況下, ts是每條消息的歷元時間

  • 列出線程中的用戶(例如,線#)

    > sadd thread:1:messages 1 2 
    > sort thread:1:messages get message:*->author_id store thread:1:authors 
    > sort thread:1:authors get author_id:*->name get author_id:*->email 
    1) "Johnny" 
    2) "[email protected]" 
    3) "Sarah" 
    4) "[email protected]" 
    

這裏螺紋:1:消息有消息ID,我們存儲在線程作者:1:作者關鍵。

根據我對Redis的經驗,您必須選擇一個好的客戶端(對於PHP來說無疑是PHPRedis [https://github.com/nicolasff/phpredis],因爲它是一個C編譯爲php模塊的擴展),並且在您的應用程序中也進行了大量處理。

希望是有用的。

相關問題