1.背景介紹
什么是Memcache?
MemCache是一個自由庇忌、源碼開放、高性能舰褪、分布式的分布式內(nèi)存對象緩存系統(tǒng)皆疹,
MemCaChe是一個存儲鍵值對的HashMap,
在內(nèi)存中對任意的數(shù)據(jù)(比如字符串占拍、對象等)使用key-value存儲略就,
數(shù)據(jù)可以來自數(shù)據(jù)庫調(diào)用、API調(diào)用晃酒,或者頁面渲染的結(jié)果表牢。MemCache設(shè)計理念就是小而強大,
它簡單的設(shè)計促進了快速部署贝次、易于開發(fā)并解決面對大規(guī)模的數(shù)據(jù)緩存的許多難題
為什么要使用Memcache初茶?
主要用于動態(tài)Web應(yīng)用以減輕數(shù)據(jù)庫的負載。
它通過在內(nèi)存中緩存數(shù)據(jù)和對象來減少讀取數(shù)據(jù)庫的次數(shù)浊闪,
從而提高了網(wǎng)站訪問的速度恼布。
Memcache的實現(xiàn)原理
memcache處理的原子是每一個key、val搁宾,key會通過一個hash表轉(zhuǎn)換成hash的key折汞,便于查找對比以及竟可能的做到散列。同時mem用的是一個二級散列盖腿,通過一個hash表來維護爽待。
memcache有兩個核心組件:服務(wù)端和客戶端
在一個memcache組件查詢中,client先通過key的hash值來確定kv在service端的位置翩腐,當server端確定后鸟款,客戶端就會發(fā)一個請求個server端。讓它來查找出確切數(shù)據(jù)茂卦,因為這之間沒有交互以及多播協(xié)議何什,因此mem帶給網(wǎng)絡(luò)的影響最小
2.知識剖析
Memcache的安裝
需要注意1.4.5版本之前和1.45之后的區(qū)別
MemCache和MemCached的區(qū)別
1、MemCache是項目的名稱
2等龙、MemCached服務(wù)器端可以執(zhí)行文件的名稱
MemCache命令
stats指令解讀
stats slab指令解讀
三種Memcached Client
Memcached Client for Java
SpyMemcached
XMemcached
Memcached Client for Java 比 SpyMemcached更穩(wěn)定处渣、更早、更廣泛蛛砰;
SpyMemcached 比 Memcached Client for Java更高效罐栈;
XMemcached 比 SpyMemcache并發(fā)效果更好。
3.常見問題
memcache如何儲存java對象泥畅?
memcache連接無需驗證荠诬,如何保證安全?
數(shù)據(jù)庫信息更改,怎么保證緩存和數(shù)據(jù)庫的信息一致柑贞?
4.解決方案
用序列化和反序列化儲存對象
使用內(nèi)網(wǎng)IP訪問方椎,防火墻限制IP和端口
在service中及時修改和維護緩存中的內(nèi)容
5.編碼實戰(zhàn)
參考文章下方視頻鏈接
6.擴展思考
JAVA中緩存的實質(zhì)是什么?
計算機緩存的定義 :緩存是CPU的一部分凌外,它存在于CPU中
就此可以說明 CPU中不可能存放大量的數(shù)據(jù)
所以java 的緩存 不是真正意義上的緩存
JAVA緩存有兩種:
一辩尊、文件緩存,是指把數(shù)據(jù)存儲在磁盤上涛浙,可以XML格式康辑,也可以序列化文件DAT格式還是其它文件格式。
二轿亮、內(nèi)存緩存疮薇,也就是實現(xiàn)一個類中靜態(tài)Map,對這個Map進行常規(guī)的增刪查。
7.參考文獻
百度百科
memcache超詳細解讀:http://www.cnblogs.com/xrq730/p/4948707.html
Memcache安全配置:http://blog.csdn.net/myhuashengmi/article/details/51992519
Memcached筆記:http://snowolf.iteye.com/blog/1471805
8.更多討論
什么樣的數(shù)據(jù)適合使用緩存?是把所有的數(shù)據(jù)都通過緩存進行存儲嗎
并不是把所有的數(shù)據(jù)都存進緩存我注,相對來說比較固定的數(shù)據(jù)更適合存進緩存比如用戶的賬戶以及生日
存對象必須序列化嗎?
不是String類型都必須序列化
memcache怎么實現(xiàn)分布式按咒?
在項目配置文件中配置多個節(jié)點,與部署的多臺服務(wù)器緩存IP節(jié)點對應(yīng)
或者直接使用Xmemcache但骨,更容易配置并發(fā)
memcache 的優(yōu)缺點励七?
優(yōu)點:穩(wěn)定,幾個月以來奔缠,一同裝上去的apache已重啟過多次掠抬,這期間memcache一直踏踏實實干活,一點都不需要中途加油校哎。
配置簡單两波,那是相當?shù)暮唵危瑤缀醪挥门渲妹贫撸粋€命令行的守護進程跑下來腰奋,就可以不管了
多機分布式存儲,每個前端機都能勻出一些內(nèi)存來跑memcache抱怔,這些內(nèi)存加在一起劣坊,總大小也是相當?shù)目陀^,能夠應(yīng)付足夠多的緩存數(shù)據(jù)屈留,如果開啟了memcache的壓縮選項MEMCACHE_COMPRESSED讼稚,存儲量還能有進一步提升。
速度快绕沈,這個論點需要數(shù)據(jù)支持锐想,俺手頭之前有一些不同數(shù)據(jù)量級下set/get的速度對比,但是這里不方便列出來
缺點:不能持久化乍狐,不安全
memcache在項目中使用的時候需要注意的關(guān)鍵要素是什么赠摇?
為了避免使用Memcached時出現(xiàn)異常,使用Memcached的項目需要注意:
1.不能往Memcached存儲一個大于1MB的數(shù)據(jù).
2.往Memcached存儲的所有數(shù)據(jù),如果數(shù)據(jù)的大小分布于各種chunk大小區(qū)間,從64B到1MB都有,可能會造成內(nèi)存的極大浪費以及Memcached的異常.
1. 命中率.
對于緩存服務(wù)而言,命中率是至關(guān)重要的.命中率的提升可以通過多種方案實現(xiàn).其一,提高服務(wù)獲取的內(nèi)存總量.這無疑是增加命中的最直接的辦法,將緩存數(shù)據(jù)完全放入數(shù)據(jù)池中.只要連接不失效,就一定命中.其二,提高空間利用率,這實際上也是另一種方式的增加內(nèi)存總量.具體實現(xiàn)在下一個方面給出.其三,對于一些很特別的memcache應(yīng)用,可以采用多個memcache服務(wù)進行偵聽,分開處理,針對服務(wù)提供的頻繁度劃分服務(wù)內(nèi)存,相當于在應(yīng)用一級別上再來一次LRU.其四,對于整體命中率,可以采取有效的冗余策略,減少分布式服務(wù)時某個server發(fā)生服務(wù)抖動的情況.如,14臺機器實現(xiàn)分布式memcache,劃分兩組服務(wù),其中一組13臺做一個分布式的memcache,一組1臺做整個的memcache備份.對于update操作,需要進行兩邊,get操作只需要一遍,一旦訪問失效,則訪問備份服務(wù)器.這樣,對于備份服務(wù)器需要內(nèi)存比較大,而且只適應(yīng)于讀操作大于寫操作的應(yīng)用中.這可以認為是RAID3,當然,也可以采用RAID1完全鏡像.
2. 空間利用率.
對于使用memcache做定長數(shù)據(jù)緩存服務(wù)而言,是可以在空間利用率上進行優(yōu)化.甚至最簡單的辦法可以不用更改memcache的源碼遍可以完成由-f和-n參數(shù)的配合可以做到定長優(yōu)化,不過極可能需要浪費掉預(yù)分配的199M內(nèi)存空間.當然前提是memcache的版本是1.2,同時如果使用的是1.2.0和1.2.1的話,需要更改掉一個BUG,那就是getopt時將opt串中最后一個”s”改成”n”,希望memcache能在以后的版本發(fā)現(xiàn)這個BUG.例如,如果key是一個定長id(如一個8位的流水號00000001),value是一個定長的串(如16位的任意字符串),對應(yīng)于一個chunk_size可以這么計算:chunk_size = sizeof(item) + nkey + nsuffix + nbytes = 32 + 8 + (flag長度 + (16 - 2)的長度 + 2) + 16 = 40 + 5 + 16 = 61,那么可以通過-f 1.000001 -n 61來啟動memcache.這種情況下,會浪費掉memcache預(yù)先分配的200M空間中的199M.從第2個預(yù)分配等級到第200個預(yù)分配等級將不會用到.然而,存在解決辦法,那就是在編譯memcache是加入編譯參數(shù)-DDONT_PREALLOC_SLABS,或者在源代碼中加入#define DONT_PREALLOC_SLABS即可,只是會去除memcache的預(yù)分配內(nèi)存機制.
4. 安全性能.
memcache還存在一個比較顯著的問題,那就是其安全性能.只要了解memcache監(jiān)聽的端口,對于能夠使用分布式memcache進行數(shù)據(jù)通信的網(wǎng)絡(luò)環(huán)境的機器,都可以通過memcache協(xié)議于memcache服務(wù)器進行通信,獲取或種植數(shù)據(jù).不能保證種植進內(nèi)存里的數(shù)據(jù)不會被別有心意的人再利用.也不能保證服務(wù)器的內(nèi)存不被漫天遍地的垃圾數(shù)據(jù)所堆積,造成命中極低.
memcache的設(shè)計理念在一個輕字,如果對每次Client的通訊需要校驗身份,那么恐怕memcache也就達不到其想要的效果了.存在解決辦法緩解這個問題,一般而言,需要使用memcache服務(wù)的機器,可以在Server維持一張紅色列表.這張表上的機器便可以獲取服務(wù).很顯然,memcache并非任意Client都能訪問,只有信任的機器訪問,那么為什么不將這些信任的機器放在一個/etc/mem_passwd下呢.
更多信息請查看視頻
ppt鏈接:什么是memcache?為什么要使用它藕帜?
今天的小課堂就到這里烫罩,如果有問題,敬請留言討論洽故!
今天的小課堂就到這里贝攒,如果有問題,敬請留言討論时甚!