1、常見的兩種緩存本地緩存:不需要序列化,速度快,緩存的數量與大小受限於本機記憶體分散式緩存:需要序列化,速度相較於本地緩存較慢,但是理論上緩存的數量與大小無限(因為緩存機器可以不斷擴展)2、本地緩存Google guava cache:當下最好用的本地緩存Ehcache:spring預設集成的一個緩...
1、常見的兩種緩存
- 本地緩存:不需要序列化,速度快,緩存的數量與大小受限於本機記憶體
- 分散式緩存:需要序列化,速度相較於本地緩存較慢,但是理論上緩存的數量與大小無限(因為緩存機器可以不斷擴展)
2、本地緩存
- Google guava cache:當下最好用的本地緩存
- Ehcache:spring預設集成的一個緩存,以spring cache的底層緩存實現類形式去操作緩存的話,非常方便,但是欠缺靈活,如果想要靈活使用,還是要單獨使用Ehcache
- Oscache:最經典簡單的頁面緩存
3、分散式緩存
- memcached:分散式緩存的標配
- Redis:新一代的分散式緩存,有替代memcached的趨勢
3.1、memcached
- 經典的一致性hash演算法
- 基於slab的記憶體模型有效防止記憶體碎片的產生(但同時也需要估計好啟動參數,否則會浪費很多的記憶體)
- 集群中機器之間互不通信(相較於Jboss cache等集群中機器之間的相互通信的緩存,速度更快<--因為少了同步更新緩存的開銷,且更適合於大型分散式系統中使用)
- 使用方便(這一點是相較於Redis在構建客戶端的時候而言的,儘管redis的使用也不困難)
- 很專一(專做緩存,這一點也是相較於Redis而言的)
3.2、Redis
- 可以存儲複雜的數據結構(5種)
- strings-->即簡單的key-value,就是memcached可以存儲的唯一的一種形式,接下來的四種是memcached不能直接存儲的四種格式(當然理論上可以先將下麵的一些數據結構中的東西封裝成對象,然後存入memcached,但是不推薦將大對象存入memcached,因為memcached的單一value的最大存儲為1M,可能即使採用了壓縮演算法也不夠,即使夠,可能存取的效率也不高)
- hashs-->看做hashTable
- lists-->看做LinkedList
- sets-->看做hashSet,事實上底層是一個hashTable
- sorted sets-->底層是一個skipList
- 有兩種方式可以對緩存數據進行持久化
- RDB
- AOF
- 事件調度
- 發佈訂閱等
4、集成緩存
專指spring cache,spring cache自己繼承了ehcache作為了緩存的實現類,我們也可以使用guava cache、memcached、redis自己來實現spring cache的底層。當然,spring cache可以根據實現類來將緩存存在本地還是存在遠程機器上。
5、頁面緩存
在使用jsp的時候,我們會將一些複雜的頁面使用Oscache進行頁面緩存,使用非常簡單,就是幾個標簽的事兒;但是,現在一般的企業,前臺都會使用velocity、freemaker這兩種模板引擎,本身速度就已經很快了,頁面緩存使用的也就很少了。
總結:
- 在實際生產中,我們通常會使用guava cache做本地緩存+redis做分散式緩存+spring cache就集成緩存(底層使用redis來實現)的形式
- guava cache使用在更快的獲取緩存數據,同時緩存的數據量並不大的情況
- spring cache集成緩存是為了簡單便捷的去使用緩存(以註解的方式即可),使用redis做其實現類是為了可以存更多的數據在機器上
- redis緩存單獨使用是為了彌補spring cache集成緩存的不靈活
- 就我個人而言,如果需要使用分散式緩存,那麼首先redis是必選的,因為在實際開發中,我們會緩存各種各樣的數據類型,在使用了redis的同時,memcached就完全可以捨棄了,但是現在還有很多公司在同時使用memcached和redis兩種緩存。
在本系列接下來的介紹中,會介紹在分散式情況下guava cache、memcached、redis、spring cache的使用與原理。
疑問:
- memcached相較於redis而言,有什麼優點?(如果有大神瞭解這一塊,請指點一下)