Java--緩衝熱點資料,最近最少使用演算法,java--熱點

來源:互聯網
上載者:User

Java--緩衝熱點資料,最近最少使用演算法,java--熱點

1、最近最少使用演算法LRU (Least recently used,最近最少使用)

【實現】:最常見的是使用一個鏈表儲存快取資料

1、新資料插入到鏈表頭部;

2、每當快取命中(即快取資料被訪問),將資料移動到鏈表頭部;

3、當鏈表滿的時候將鏈表尾部的資料丟棄;

 

【代價】

命中時需要遍曆鏈表,找到命中的資料區塊索引,然後需要將資料移到頭部。

 

【改變】

基於以上代價,我們將維護的鏈表改為一個雙向鏈表(即每個節點都有個prev和next),另外需要再多維護一個map,將緩衝對象的引用放入map中;

1、新資料插入鏈表頭部,並且放入map中

2、每當需要使用緩衝時,首先通過key到map中尋找,命中緩衝後將資料移動到鏈表頭部(這個移動就非常好移動了,只需要把該節點的prev節點的next屬性賦值為該節點的next節點,同時把該節點的next節點的prev屬性賦值為該節點的prev節點,並且將該節點放入鏈表頭部就可以了)。

3、當鏈表滿的時候將鏈表尾部的資料丟棄,並且刪除map中對應的資料。

 

【結果】

基於以上改變的LRU演算法,完全去除了命中緩衝需要遍曆鏈表這個缺點,效能得到了大的提升。

 

2、使用redis快取資料,保證熱點資料的緩衝用法與原理

說一點:只要限制了redis佔用的記憶體,redis會根據自身資料淘汰策略,載入熱資料到記憶體。

【實現】:

通過redis本身的設定到期時間來實現緩衝熱點資料

1、緩衝每命中一次,就重新給該資料設定到期時間

2、那麼經常命中的緩衝始終不會到期,不會被刪除,而非熱點資料到期時間一到那麼就會被刪除掉,保證了redis中始終存在的是熱點資料。

 

【原理】

1、原理其實就是Java中延時阻塞隊列DelayQueue的原理

2、當對redis中快取資料設定到期時間,相當於將快取資料放入redis中維護的延時阻塞隊列DelayQueue。

3、DelayQueue會對放入的快取資料根據到期時間進行排序,時間短的在前面,時間長的在隊列後面。

4、會使用一個或者多個線程迴圈查詢DelayQueue,一旦能從DelayQueue擷取元素了就說明該快取資料到期了,就可以取出來並且刪除掉了。

5、當有多個線程都同時查詢DelayQueue的時候,只有一個線程能夠爭取到頭元素,其它線程將被阻塞。當頭元素被取走以後,會喚醒所有阻塞線程,線程競爭頭元素,競爭到頭元素的線程會查詢頭元素的剩餘delay時間,並且標記頭元素已經被該線程佔有,再根據delay時間wait自己,最後擷取頭元素後喚醒其它阻塞線程。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.