回覆列表
  • 1 # Java識堂

    介紹

    所謂快取,就是將程式或系統經常要呼叫的物件存在記憶體中,一遍其使用時可以快速呼叫,不必再去建立新的重複的例項。這樣做可以減少系統開銷,提高系統效率。

    快取主要可分為二大類:

    一、透過外部中介軟體快取,如Redis,Memcached

    二、透過系統內部的Map或者引入的第三方jar包來進行快取,如Google Guava Cache

    第一大類不會佔用系統的記憶體,快取的資料可以進行持久化,而第二類會佔用系統的快取,快取的資料不能進行持久化,分享一下這兩大類的主要區別和應用場景

    Redis

    1.1 資料庫

    在Redis裡,資料庫簡單的使用一個數字編號來進行辨認,預設資料庫的數字編號是0。如果你想切換到一個不同的資料庫,你可以使用select命令來實現。在命令列介面裡鍵入select 1,Redis應該會回覆一條OK的資訊,然後命令列介面裡的提示符會變成類似redis 127.0.0.1:6379[1]>這樣。如果你想切換回預設資料庫,只要在命令列介面鍵入即可

    1.2 命令、關鍵字和值

    Redis不僅僅是一種簡單的關鍵字-值型儲存,從其核心概念來看,Redis的5種資料結構中的每一個都至少有一個關鍵字和一個值

    關鍵字(Keys)是用來標識資料塊,值(Values)是關聯於關鍵字的實際值,可以是字串、整數、序列化物件(使用JSON、XML或其他格式)

    Redis命令的基本構成,如:set users:leto "{name: leto, planet: dune, likes: [spice]}"

    關鍵字和值的是Redis的基本概念,而get和set命令是對此最簡單的使用

    1.3 Redis查詢

    對於Redis而言,關鍵字就是一切,而值是沒有任何意義。Redis不允許透過值來進行查詢

    1.4 儲存器和持久化

    Redis是一種持久化的儲存器記憶體儲(in-memory persistent store)預設情況下,Redis會根據已變更的關鍵字數量來進行判斷,然後在磁盤裡建立資料庫的快照(snapshot)。你可以對此進行設定,如果X個關鍵字已變更,那麼每隔Y秒儲存資料庫一次。預設情況下,如果1000個或更多的關鍵字已變更,Redis會每隔60秒儲存資料庫;而如果9個或更少的關鍵字已變更,Redis會每隔15分鐘儲存資料庫

    至於儲存器,Redis會將所有資料都保留在儲存器中。顯而易見,執行Redis具有不低的成本:因為RAM仍然是最昂貴的伺服器硬體部件

    1.5 小結

    關鍵字(Keys)是用於標識一段資料的一個字串

    值(Values)是一段任意的位元組序列,Redis不會關注它們實質上是什麼

    Redis展示了(也實現了)5種專門的資料結構

    上面的幾點使得Redis快速而且容易使用,但要知道Redis並不適用於所有的應用場景

    Google Guava Cache

    Guava Cache與ConcurrentMap很相似,但也不完全一樣。最基本的區別是ConcurrentMap會一直儲存所有新增的元素,直到顯式地移除。相對地,Guava Cache為了限制記憶體佔用,通常都設定為自動回收元素。在某些場景下,儘管LoadingCache 不回收元素,它也是很有用的,因為它會自動載入快取。

    通常來說,Guava Cache適用於:

    你願意消耗一些記憶體空間來提升速度。你預料到某些鍵會被查詢一次以上。快取中存放的資料總量不會超出記憶體容量。(Guava Cache是單個應用執行時的本地快取。它不把資料存放到檔案或外部伺服器。如果這不符合你的需求,請嘗試Memcached這類工具)

    如果你的場景符合上述的每一條,Guava Cache就適合你。並且自定義你的快取才是最有趣的部分。

    注:如果你不需要Cache中的特性,使用ConcurrentHashMap有更好的記憶體效率——但Cache的大多數特性都很難基於舊有的ConcurrentMap複製,甚至根本不可能做到。

  • 中秋節和大豐收的關聯?
  • 女生都愛吃甜食,經常吃甜食會對身體帶來什麼改變呢?