Redis計數在新浪微博的應用

來源:互聯網
上載者:User

標籤:

微博業務的迅速發展,對基礎架構層面的要求也越來越高。新浪作為國內最早使用redis,並且是國內最大的redis使用者,在redis的使用上,也在逐步最佳化和提高。

作為微博中一項重要的資料,計數類業務在微博業務中占的比重和重要性逐步提高。計數結果的準確度直接影響使用者體驗,並且很容易引起使用者的投訴。在計數業務上,在不斷的最佳化和改進中,我們主要經曆了以下三個階段:

初級階段

從2010年開始,使用redis-2.0版本。在最初業務資料比較少的時候,表現相當不錯。但隨著資料量和請求量的不斷增加,一些問題逐漸暴露出來。

主從同步問題

  • 首先遇到的是主從的同步問題。它的原理是當master接收到slave的同步請求後,把記憶體的資料fork出一個子進程dump出來,形成rdb檔案,然後傳到slave,slave再把這個檔案載入到記憶體,之後的累加式更新由master在執行完每條修改命令後立即同步給slave。 在網路出現問題時,比如瞬斷,會導致slave裡的資料全部重傳。對單個連接埠來說,如果資料量小,那麼這個影響不大,而如果資料量比較大的話,就會導致網路流量暴增,同時slave在載入rdb時無法響應任何請求。

  • 持久化問題

    計數業務中多數使用redis作為儲存,因此都開啟了aof,並配置為每秒做一次fsync操作將寫操作重新整理到磁碟。隨著aof的增長,需要定期rewrite。Rewrite的機制和產生rdb的過程類似,都是fork出一個子進程來完成的,子進程對於磁碟的持續寫入會導致父進程的 fsync操作阻塞,造成大量請求逾時。

  • 版本升級問題

    由於redis在使用初期bug較多,版本迭代頻繁,而版本升級需要關閉redis進程並重新載入aof。對於大量使用redis的微博業務來講,這樣的升級成本也越來越難以承受。

  • 記憶體使用量問題

    2.0版本的redis,在記憶體使用量上相對比較粗放,對於計數這樣一個簡單的key-value,佔用的記憶體達到100位元組以上,存在比較多的最佳化空間。

進階階段

針對redis使用初期存在的問題,我們逐個進行了改進。主從複製參考mysql的同步方式,使用rdb+aof結合的方式,解決了網路瞬斷引起的重傳問題,同時限制子進程做後台dump時對磁碟的寫入,期間暫停主進程的fsync操作,解決了慢請求的問題。

針對計數業務,我們開發了專用的版本redisscounter,單個key-value佔用的記憶體key的長度加4個位元組的value,將記憶體的使用量降低到原來的1/4以下。通過預先分配記憶體數組和double hash技術,消除了redis中hash表的大量指標開銷。

對於版本升級的問題,我們將redis的核心處理邏輯封裝到動態庫,記憶體中的資料儲存在全域變數裡,通過外部程式來調用動態庫裡的相應函數來讀寫資料。版本升級時只需要替換成新的動態庫檔案即可,無須重新載入資料。通過這樣的方式,版本升級只需執行一條指令,即可在毫秒層級完成代碼的升級,同時對用戶端請求無任何影響。

有了上面的改進後,新版本開始大量應用,多數業務都可以作為完整的儲存替代以前的mysql+memcached組合。對於微博的評論數和轉寄數,由於微博條目不斷增加,無法儲存全量資料,因此採用mysql+redisscounter組合的方式,mysql儲存全量資料,使用兩組 redisscounter儲存最近幾個月的熱資料,通過定期滾動兩組redisscounter裡的資料來清理冷資料。

進階階段

隨著微博的發展,針對單條微博的計數也不斷增加,從原來的評論數、轉寄數,又增加了表態數,2013年還上線了閱讀數。Redisscounter 不能很好的解決這類擴充問題,同時上面的mysql+redisscounter的滾動方式也過於複雜,週期性滾動操作很容易出現問題。針對這類問題,我們再度做出改進,將key由原先的字串改成微博id,同時對於每條微博的評論轉寄等計數,我們統計發現,絕大多數微博的計數都可以用10~15個bit 來儲存,因此可以將多個計數儲存到一個4位元組的value裡,過大的計數值在記憶體中另外開闢一塊空間來儲存。這樣通過一條get命令即可擷取該微博的所有計數。同時針對微博業務的特點,越老的微博被訪問的次數就會越少,在記憶體使用量多個數組儲存不同範圍的微博,記憶體不足時將最老的一組微博dump到ssd 上,內部自動實現的滾動可以保證熱微博全部在記憶體裡。對於落到ssd上的老資料的訪問,通過非同步io線程來讀寫,經過這樣的改進後,去掉了原先的 mysql儲存,降低了業務開發成本和營運成本。

從redis在計數業務上的發展經曆可以看出,技術的進步是由業務的需求推動的。隨著業務的發展,還會遇到更多新的挑戰。希望我們走過的這些改進之路對於讀者在使用redis的過程中能有所協助。

Redis計數在新浪微博的應用

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.