storm的TimeCacheMap

      我們經常會碰到具有生命週期的數據,比如key/value對子,很多人都使用線程掃描的方式。這種做法雖然簡單,但是並不高效。因爲每清理一次數據都要加鎖,這會影響正常的數據讀寫性能。
      storm實現了一種非常高效的map,它採用的算法可以在expirationSecs到expirationSecs * (1 + 1 / (numBuckets-1))時間內將過期數據刪除,而刪除一批過期數據只要加1次鎖。
 
    接下來讓我們看看它的實現原理:
 
    TimeCacheMap:

    

    TimeCacheMap使用了桶的數據結構,每個桶可以看成是1個hash map, 新數據全部會寫到第1個桶,假設過期時間是100秒,那100秒之後第一個桶就應該被全部刪掉,所以TimeCacheMap用了1個獨立的清理線程每隔25秒(過期時間/(桶數-1))將最後一個桶全部清理,然後將前面的4個桶往後挪,新建一個桶作爲第一個桶,而新來的數據總是寫到第一個桶。這樣,所有的數據都會在125秒之後被清理掉。因爲清理是以桶爲單位的,所以清理的效率非常高,只需要加1次鎖。
    實際上,這些所謂“過期”的數據並不一定是要刪除,而是做一些其他的處理,因此TimeCacheMap還提供了回調的接口,用戶可以自己決定怎麼處理“過期”的數據。
    其實採用桶的方式提升併發性能的例子很多,但中心思想都是減小鎖的粒度。在storm系統裏面,spout生成的消息全部保存在本地的TimeCacheMap裏面,當消息處理超時,這些過期的消息會自動被清理線程處理掉。

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章