來源:互聯網
上載者:User
關鍵字
php
redis
mysql
緩衝設計
緩衝
最近在做一個類似貼吧一樣的東西,在資料上想用redis緩衝,但是現在有兩個想法,不知道哪個更實際一些,求大家指點。
所有內容都會存mysql這個沒的說
貼文清單永駐redis這個也沒的說
問題是文章內容怎麼辦。
一種想法是存一定數量的文章內容到緩衝裡,比如1000條。使用者訪問時根據所在頁面和條數,前1000條的請求都從redis中讀取,超過1000條之後的舊資料就從mysql中讀取。有新文章且緩衝達到1000條時就LPUSH新的RPOP舊的。
另一種想法是所有新增的貼文數據都存在redis中,並且都設定一個到期時間,比如24小時。使用者有訪問過就將這條資料的到期時間增加到24小時,如果沒有訪問過就從redis中刪除。使用者訪問的時候先查redis,查不到再去mysql中查,順便再寫入redis。
這兩種辦法哪個好一些?
回複內容:
最近在做一個類似貼吧一樣的東西,在資料上想用redis緩衝,但是現在有兩個想法,不知道哪個更實際一些,求大家指點。
所有內容都會存mysql這個沒的說
貼文清單永駐redis這個也沒的說
問題是文章內容怎麼辦。
一種想法是存一定數量的文章內容到緩衝裡,比如1000條。使用者訪問時根據所在頁面和條數,前1000條的請求都從redis中讀取,超過1000條之後的舊資料就從mysql中讀取。有新文章且緩衝達到1000條時就LPUSH新的RPOP舊的。
另一種想法是所有新增的貼文數據都存在redis中,並且都設定一個到期時間,比如24小時。使用者有訪問過就將這條資料的到期時間增加到24小時,如果沒有訪問過就從redis中刪除。使用者訪問的時候先查redis,查不到再去mysql中查,順便再寫入redis。
這兩種辦法哪個好一些?
可以說明使用者規模。
我認為第二種好,因為通用性強。
第一種如果業務變大,訪問增多,就要改代碼
第二種當然更實用一些,代碼也容易實現。第一個邏輯複雜一些不太好弄。。。。。
不過第二個,你還可以改進一下:
在緩衝失效的時候,需要先查詢redis,找不到資料,再查詢MySQL,最後再寫入redis。這裡更新緩衝的時候會多出兩次redis查詢。
比不使用緩衝還要慢。。。
緩衝失效的時候,如果有並發請求,則會重複更新redis緩衝。
你可以參考我用Python實現的一個類解決了第一點https://github.com/lloydzhou/StaleRedisCache
給緩衝多設定一段緩衝時間
若在緩衝期內,直接使用到期資料,並使用非同步任務更新緩衝。
你還可以借用redis實現一個記憶體鎖,解決上面第二點的並發問題。
(我項目中沒有做,是因為外面有nginx頁面緩衝,在裡面應用程式層很難遇到並發問題)
我說說自己的設計,當然前提是直接查詢DB是不可行的情況下,不然也沒必要折騰。
首先緩衝是必然,優先考慮使用者在瀏覽貼吧時常看的基本就是前10頁(舉例),那麼完全沒必要緩衝全量資料,最好是僅緩衝前10頁即可,這個設計無論訪問量多大都不會有太大問題,只要不出現大量的使用者訪問10頁之後的資料。對於這個緩衝其實我們只需要緩衝貼文清單,而非文章具體內容,所以不會佔用太大記憶體。
對於文章內容可以採用熱點方式解決,即LRU,因為被查看的文章基本都是固定的,即熱點文章,緩衝只需要緩衝這些文章內容即可。
綜上,其實就是題主的兩種方案的結合,其實這兩種方案並不是針對同一個問題的解決方案。
第一種吧,如果使用者更新了文章,同樣要更新對應的資料緩衝,一般文章,舊文章翻的人很少的。
第一種。我在樂視做評論時,就用的第一種
緩衝文章內容,用mysql或redis還不如使用mongodb