1. 程式人生 > >本地緩存

本地緩存

nbsp 目前 heap 性能 限制 變更 來看 存儲 tro

為什麽要有本地緩存?

在系統中,有些數據,數據量小,但是訪問十分頻繁(例如國家標準行政區域數據),針對這種場景,需要將數據搞到應用的本地緩存中,以提升系統的訪問效率,減少無謂的數據庫訪問(數據庫訪問占用數據庫連接,同時網絡消耗比較大),但是有一點需要註意,就是緩存的占用空間以及緩存的失效策略。

為什麽是本地緩存,而不是分布式的集群緩存?

目前的數據,大多是業務無關的小數據緩存,沒有必要搞分布式的集群緩存,目前涉及到訂單和商品的數據,會直接走DB進行請求,再加上分布式緩存的構建,集群維護成本比較高,不太適合緊急的業務項目。

本地緩存在那個區域?

目前考慮的是占用了JVM的heap區域,再細化一點的就是heap中的old區,目前的數據量來看,都是一些小數據,加起來沒有幾百兆,放在heap區域最快最方便。後期如果需要放置在本地緩存的數據大的時候,可以考慮在off-heap區域,但是off-heap區域的話,需要考慮對象的序列化(因為off-heap區域存儲的是二進制的數據),另外一個的話就是off-heap的GC問題。其實,如果真的數據量比較大,那其實就可以考慮搞一個集中式的緩存系統,可以是單機,也可以是集群,來承擔緩存的作用。

有哪些本地緩存:

EhCache來構建緩存、引入guava的cacheBuilder來構建緩存(

Guava CacheConcurrentMap很相似,但也不完全一樣。最基本的區別是ConcurrentMap會一直保存所添加的元素,直到顯式的移除;Guava Cache為了限制內存的占用,通常都是設定為自動回收元素。在某些場景下,盡管LoadingCahe不回收元素,但是它還是很有用的,因為它會自動加載緩存。

  Guava Cache適用場景:

  • 你願意消耗一部分內存來提升速度;
  • 你已經預料某些值會被多次調用;
  • 緩存數據不會超過內存總量;

 Guava Cache是一個全內存的本地緩存實現

,它提供了線程安全的實現機制。整體上來說Guava cache 是本地緩存的不二之選,簡單易用,性能好

?集群內部,緩存的一致性如何保證?

如果采用ehcache的話,可以使用框架本身的JGroup來實現組內機器之間的緩存同步。

如果是采用google的cacheBuilder的話,需要自己實現緩存的同步。

A、非實時生效數據:數據的更新不會時時發生,應用啟動的時候更新即可,然後定時程序定時去清理緩存;

B、需要實時生效數據:啟動時可預熱也可不預熱,但是緩存數據變更後,集群之間需要同步

本地緩存