國內外三個不一樣領域巨頭分享的Redis實戰經驗及使用場景(二)

摘要:隨着數據體積的激增,MySQL+memcache已經知足不了大型互聯網類應用的需求,許多機構也紛紛選擇Redis做爲其架構上的補充,下面就一覽新浪微博、Pinterest及Viacom的實踐分享。html

Pinterest:Reids維護上百億的相關性

Pinterest已經成爲硅谷最瘋故事之一,在2012年,他們基於PC的業務增長1047%,移動端採用增長1698%, 該年3月其獨立訪問數量更飆升至533億。在Pinterest,人們關注的事物以百億記——每一個用戶界面都會查詢某個board或者是用戶是否關注的行爲促成了異常複雜的工程問題。這也讓Redis得到了用武之地。通過數年的發展,Pinterest已經成爲媒體、社交等多個領域的佼佼者,其輝煌戰績以下:ios

  • 得到的推薦流量高於Google+、YouTube及LinkedIn三者的總和redis

  • 與Facebook及Twitter一塊兒成爲最流行的三大社交網絡數據庫

  • 參考Pinterest進行購買的用戶比其它網站更高( 更多詳情後端

如您所想,基於其獨立訪問數,Pinterest的高規模促成了一個很是高的IT基礎設施需求。緩存

 

經過緩存來優化用戶體驗網絡

近日,Pinterest工程經理Abhi Khune對其公司的用戶體驗需求及Redis的使用經驗 進行了分享。即便是滋生的應用程序打造者,在分析網站的細節以前也不會理解這些特性,所以先大體的理解一下使用場景:首先,爲每一個粉絲進行說起到的預檢查;其次,UI將準確的顯示用戶的粉絲及關注列表分頁。高效的執行這些操做,每次點擊都須要很是高的性能架構。多線程

不能免俗,Pinterest的軟件工程師及架構師已經使用了MySQL及memcache,可是緩存解決方案仍然達到了他們的瓶頸;所以爲了擁有更好的用戶體驗,緩存必須被擴充。而在實際操做過程當中,工程團隊已然發現緩存只有當用戶sub-graph已經在緩存中時纔會起到做用。所以。任何使用這個系統的人都須要被緩存,這就致使了整個圖的緩存。同時,最多見的查詢「用戶A是否關注了用戶B」的da案常常是否認的,然而這卻被做爲了緩存丟失,從而促成一個數據庫查詢,所以他們須要一個新的方法來擴展緩存。最終,他們團隊決定使用Redis來存儲整個圖,用以服務衆多的列表。架構

使用Redis存儲大量的Pinterest列表memcached

Pinterest使用了Redis做爲解決方案,並將性能推至了內存數據庫等級,爲用戶保存多種類型列表:

  • 關注者列表

  • 你所關注的board列表

  • 粉絲列表

  • 關注你board的用戶列表

  • 某個用戶中board中你沒有關注的列表

  • 每一個board的關注者及非關注者

Redis爲其7000萬用戶存儲了以上的全部列表,本質上講能夠說是儲存了全部粉絲圖,經過用戶ID分片。鑑於你能夠經過類型來查看以上列表的數據,分析概要信息被用看起來更像事務的系統儲存及訪問。Pinterest當下的用戶like被限制爲10萬,初略進行統計:若是每一個用戶關注25個board,將會在用戶及board間產生17.5億的關係。同時更加劇要的是,這些關係隨着系統的使用天天都會增長。

Pinterest的Reids架構及運營

經過Pinterest的一個創始人瞭解到,Pinterest開始使用Python及訂製的Django編寫應用程序,並一直持續到其擁有1800萬用戶級日410TB用戶數據的時候。雖然使用了多個存儲對數據進行儲存,工程師根據用戶id使用了8192個虛擬分片,每一個分片都運行在一個Redis DB之上,同時1個Redis實例將運行多個Redis DB。爲了對CPU核心的充分使用,同一臺主機上同時使用多線程和單線程Redis實例。

鑑於整個數據集運行在內存當中,Redis在Amazon EBS上對每秒傳輸進來的寫入都會進行持久化。擴展主要經過兩個方面進行:第一,保持50%的利用率,經過主從轉換,機器上運行的Redis實例一半會轉譯到一個新機器上;第二,擴展節點和分片。整個Redis集羣都會使用一個主從配置,從部分將被當作一個熱備份。一旦主節點失敗,從部分會馬上完成主的轉換,同時一個新的從部分將會被添加,ZooKeeper將完成整個過程。同時他們每一個小時都會在Amazon S3上運行BGsave作更持久的儲存——這項Reids操做會在後端進行,以後Pinterest會使用這些數據作MapReduce和分析做業。(更多內容見原文)

Viacom:Redis在系統中的用例盤點

Viacom是全球最大的傳媒集體之一,同時也遭遇了當下最大的數據難題之一:如何處理日益劇增的動態視頻內容。

着眼這一挑戰的上升趨勢,咱們會發現:2010年世界上全部數據體積達到ZB級,而單單2012這一年,互聯網產生的數據就增長了2.8個ZB,其中大部分的數據都是非結構化的,包括了視頻和圖片。

覆蓋MVN(之前稱爲MTV Networks、Paramount及BET),Viacom是個名副其實的傳媒巨頭,支持衆多人氣站點,其中包括The Daily Show、osh.0、South Park Studios、GameTrailers.com等。做爲媒體公司,這些網站上的文檔、圖片、視頻短片都在無時無刻的更新。長話短說,下面就進入Viacom高級架構師Michael Venezia 分享的Redis實踐:

Viacom的網站架構背景

對於Viacom,橫跨多個站點傳播內容讓必須專一於規模的需求,同時爲了將內容竟可能快的傳播到相應用戶,他們還必須聚焦內容之間的關係。然而即便The Daily Show、Nickelodeon、Spike或者是VH1 這些單獨的網站上,日平均PV均可以達到千萬,峯值時流量更會達到平均值的20-30倍。同時基於對實時的需求,動態的規模及速度已成爲架構的基礎之一。

除去動態規模以外,服務還必須基於用戶正在瀏覽的視頻或者是地理位置來推測用戶的喜愛。好比說,某個頁面可能會將一個獨立的視頻片斷與本地的促銷,視頻系列的額外部分,甚至是相關視頻聯繫起來。爲了能讓用戶能在網站上停留更長的時間,他們創建了一個能基於詳細元數據自動創建頁面的軟件引擎,這個引擎能夠根據用戶當下興趣推薦額外的內容。鑑於用於興趣的隨時改變,數據的類型很是普遍——相似graph-like,實際上作的是大量的join。

這樣作有利於減小相似視頻的大致積文件副本數,好比數據存儲中一個獨立的記錄是Southpark片斷「Cartman gets an Anal Probe」,這個片斷可能也會出如今德語的網站上。雖然視頻是同樣的,可是英語用戶搜索的可能就是另外一個不一樣的詞語。元數據的副本轉換成搜索結果,並指向相同的視頻。所以在美國用戶搜索真實標題的狀況下,德國瀏覽者可能會使用轉譯的標題——德國網站上的「Cartman und die Analsonde」。

這些元數據覆蓋了其它記錄或者是對象,同時還能夠根據使用環境來改變內容,經過不一樣的規則集來限制不一樣地理位置或者是設備請求的內容。

Viacom的實現方法

儘管許多機構經過使用ORM及傳統關係型數據庫來解決這個問題,Viacom卻使用了一個迥然不一樣的方法。

本質上,他們徹底承擔不了對數據庫的直接訪問。首先,他們處理的大部分都是流數據,他們偏向於使用Akamai從地理上來分配內容。其次,基於頁面的複雜性可能會取上萬個對象。取如此多的數據顯然會影響到性能,所以JSON在1個數據服務中投入了使用。固然,這些JSON對象的緩存將直接影響到網站性能。同時,當內容或者是內容之間的關係發生改變時,緩存還須要動態的進行更新。

Viacom依靠對象基元和超類解決這個問題,繼續以South Park爲例:一個私有的「episode」類包含了全部該片斷相關信息,一個「super object」將有助於發現實際的視頻對象。超類這個思想確實很是有益於建設低延遲頁面的自動建設,這些超類能夠幫助到基元對象到緩存的映射及保存。

Viacom爲何要使用Redis

每當Viacom上傳一個視頻片斷,系統將創建一個私有的對象,並於1個超類關聯。每一次修改,他們都須要重估私有對象的每一個改變,並更新全部複合對象。同時,系統還須要無效Akamail中的URL請求。系統現有架構的組合及更敏捷的管理方法需求將Viacom推向了Redis。

基於Viacom主要基於PHP,因此這個解決方案必須支持PHP。他們首先選擇了memcached作對象存儲,可是它並不能很好的支持hashmap;同時他們還須要一個更有效的進行無效步驟的重估,即更好的理解內容的依賴性。本質上說,他們須要時刻跟進無效步驟中的依賴性改變。所以他們選擇了Redis及Predis的組合來解決這個問題。

他們團隊使用Redis給southparkstudios.com和thedailyshow.com兩個網站建設依賴性圖,在取得了很大的成功後他們開始着眼Redis其它適合場景。

Redis的其它使用場景

顯而易見,若是有人使用Redis來建設依賴性圖,那麼使用它來作對象處理也是說得通的。一樣,這也成了架構團隊爲Redis選擇的第二使用場景。Redis的複製及持久化特性同時也征服了Viacom的運營團隊,所以在幾個開發週期後,Redis成爲他們網站的主要數據及依賴性儲存。

後兩個用例則是行爲追蹤及瀏覽計數的緩衝,改變後的架構是Redis每幾分鐘向MySQL中儲存一次,而瀏覽計數則經過Redis進行存儲及計數。同時Redis還被用來作人氣的計算,一個基於訪問數及訪問時間的得分系統——若是某個視頻最近被訪問的次數越多,它的人氣就越高。在如此多內容上每隔10-15分鐘作一次計算絕對不是相似MySQL這樣傳統關係型數據庫的強項,Viacom使用Redis的理由也很是簡單——在1個存儲瀏覽信息的Redis實例上運行Lua批處理做業,計算出全部的得分表。信息被拷貝到另外一個Redis實例上,用以支持相關的產品查詢。同時還在MySQL上作了另外一個備份,用以之後的分析,這種組合會將這個過程耗費的時間下降60倍。

Viacom還使用Redis存儲一步做業信息,這些信息被插入一個列表中,工做人員則使用BLPOP命令行在隊列中抓取頂端的任務。同時zsets被用於從衆多社交網絡(好比Twitter及Tumblr)上綜合內容,Viacom經過Brightcove視頻播放器來同步多個內容管理系統。

橫跨這些用例,幾乎全部的Redis命令都被使用——sets、lists、zlists、hashmaps、scripts、counters等。同時,Redis也成爲Viacom可擴展架構中不可或缺的一環。

相關文章
相關標籤/搜索