1. 夠快
Ehcache的發(fā)行有一段時長了,經(jīng)過幾年的努力和不計其數(shù)的性能測試继蜡,Ehcache終被設計于large, high concurrency systems.
2. 夠簡單
開發(fā)者提供的接口非常簡單明了,從Ehcache的搭建到運用運行僅僅需要的是你寶貴的幾分鐘逛腿。其實很多開發(fā)者都不知道自己用在用Ehcache稀并,Ehcache被廣泛的運用于其他的開源項目
比如:hibernate
3.夠袖珍
關于這點的特性,官方給了一個很可愛的名字small foot print 单默,一般Ehcache的發(fā)布版本不會到2M碘举,V 2.2.3 才 668KB。
- 夠輕量
核心程序僅僅依賴slf4j這一個包搁廓,沒有之一引颈!
5.好擴展
Ehcache提供了對大數(shù)據(jù)的內(nèi)存和硬盤的存儲耕皮,最近版本允許多實例、保存對象高靈活性蝙场、提供LRU凌停、LFU、FIFO淘汰算法售滤,基礎屬性支持熱配置罚拟、支持的插件多
6.監(jiān)聽器
緩存管理器監(jiān)聽器 (CacheManagerListener)和 緩存監(jiān)聽器(CacheEvenListener),做一些統(tǒng)計或數(shù)據(jù)一致性廣播挺好用的
如何使用?
夠簡單就是Ehcache的一大特色完箩,自然用起來just so easy!
貼一段基本使用代碼
<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; color: rgb(0, 0, 0); font-size: 17px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial;">CacheManager manager = CacheManager.newInstance("src/config/ehcache.xml");
Ehcache cache = new Cache("testCache", 5000, false, false, 5, 2);
cacheManager.addCache(cache);</pre>
- name:緩存名稱赐俗。
- maxElementsInMemory:緩存最大個數(shù)。
- eternal:對象是否永久有效弊知,一但設置了阻逮,timeout將不起作用。
- timeToIdleSeconds:設置對象在失效前的允許閑置時間(單位:秒)吉捶。僅當eternal=false對象不是永久有效時使用夺鲜,可選屬性,默認值是0呐舔,也就是可閑置時間無窮大币励。
- timeToLiveSeconds:設置對象在失效前允許存活時間,最大時間介于創(chuàng)建時間和失效時間之間。僅當eternal=false對象不是永久有效時使用珊拼,默認是0.食呻,也就是對象存活時 間無窮大。
- overflowToDisk:當內(nèi)存中對象數(shù)量達到maxElementsInMemory時澎现,Ehcache將會對象寫到磁盤中仅胞。
- diskSpoolBufferSizeMB:這個參數(shù)設置DiskStore(磁盤緩存)的緩存區(qū)大小。默認是30MB剑辫。每個Cache都應該有自己的一個緩沖區(qū)干旧。
- maxElementsOnDisk:硬盤最大緩存?zhèn)€數(shù)。
- diskPersistent: 是否緩存虛擬機重啟期數(shù) 據(jù) Whether the disk store persists between restarts of the Virtual Machine. The default value is false.
- diskExpiryThreadIntervalSeconds:磁盤失效線程運行時間間隔妹蔽,默認是120秒椎眯。
- memoryStoreEvictionPolicy:當達到maxElementsInMemory限制時,Ehcache將會根據(jù)指定的策略去清理內(nèi)存胳岂。默認策略是LRU编整。你可以設置為 FIFO或是LFU。
- clearOnFlush:內(nèi)存數(shù)量最大時是否清除乳丰。
memcache
memcache 是一種高性能掌测、分布式對象緩存系統(tǒng),最初設計于緩解動態(tài)網(wǎng)站數(shù)據(jù)庫加載數(shù)據(jù)的延遲性产园,你可以把它想象成一個大的內(nèi)存HashTable汞斧,就是一個key-value鍵值緩存夜郁。Danga Interactive為了LiveJournal所發(fā)展的,以BSD license釋放的一套開放源代碼軟件断箫。
1.依賴
memcache C語言所編寫拂酣,依賴于最近版本的GCC和libevent秋冰。GCC是它的編譯器仲义,同事基于libevent做socket io。在安裝memcache時保證你的系統(tǒng)同事具備有這兩個環(huán)境剑勾。
2.多線程支持
memcache支持多個cpu同時工作埃撵,在memcache安裝文件下有個叫threads.txt中特別說明,By default, memcached is compiled as a single-threaded application.默認是單線程編譯安裝虽另,如果你需要多線程則需要修改./configure --enable-threads暂刘,為了支持多核系統(tǒng),前提是你的系統(tǒng)必須具有多線程工作模式捂刺。開啟多線程工作的線程數(shù)默認是4谣拣,如果線程數(shù)超過cpu數(shù) 容易發(fā)生操作死鎖的概率。結(jié)合自己業(yè)務模式選擇才能做到物盡其用族展。
3.高性能
通過libevent完成socket 的通訊森缠,理論上性能的瓶頸落在網(wǎng)卡上。
簡單安裝:
1.分別把memcached和libevent下載回來仪缸,放到 /tmp 目錄下:
cd /tmp
wget http://www.danga.com/memcached/dist/memcached-1.2.0.tar.gz
wget http://www.monkey.org/~provos/libevent-1.2.tar.gz
[圖片上傳失敗...(image-a9d026-1561856651866)]
2.先安裝libevent:
tar zxvf libevent-1.2.tar.gz
cd libevent-1.2
./configure -prefix=/usr
make (如果遇到提示gcc 沒有安裝則先安裝gcc)
make install
3.測試libevent是否安裝成功:
ls -al /usr/lib | grep libevent
lrwxrwxrwx 1 root root 21 11?? 12 17:38 libevent-1.2.so.1 -> libevent-1.2.so.1.0.3
-rwxr-xr-x 1 root root 263546 11?? 12 17:38 libevent-1.2.so.1.0.3
-rw-r-r- 1 root root 454156 11?? 12 17:38 libevent.a
-rwxr-xr-x 1 root root 811 11?? 12 17:38 libevent.la
lrwxrwxrwx 1 root root 21 11?? 12 17:38 libevent.so -> libevent-1.2.so.1.0.3
還不錯贵涵,都安裝上了。
4.安裝memcached恰画,同時需要安裝中指定libevent的安裝位置:
cd /tmp
tar zxvf memcached-1.2.0.tar.gz
cd memcached-1.2.0
./configure -with-libevent=/usr
make
make install
如果中間出現(xiàn)報錯宾茂,請仔細檢查錯誤信息,按照錯誤信息來配置或者增加相應的庫或者路徑拴还。
安裝完成后會把memcached放到 /usr/local/bin/memcached 跨晴,
5.測試是否成功安裝memcached:
ls -al /usr/local/bin/mem*
-rwxr-xr-x 1 root root 137986 11?? 12 17:39 /usr/local/bin/memcached
-rwxr-xr-x 1 root root 140179 11?? 12 17:39 /usr/local/bin/memcached-debug
啟動memcache服務
啟動Memcached服務:
1.啟動Memcache的服務器端:
/usr/local/bin/memcached -d -m 8096 -u root -l 192.168.77.105 -p 12000 -c 256 -P /tmp/memcached.pid
-d選項是啟動一個守護進程,
-m是分配給Memcache使用的內(nèi)存數(shù)量片林,單位是MB端盆,我這里是8096MB,
-u是運行Memcache的用戶拇厢,我這里是root爱谁,
-l是監(jiān)聽的服務器IP地址,如果有多個地址的話孝偎,我這里指定了服務器的IP地址192.168.77.105访敌,
-p是設置Memcache監(jiān)聽的端口,我這里設置了12000衣盾,最好是1024以上的端口寺旺,
-c選項是最大運行的并發(fā)連接數(shù)爷抓,默認是1024,我這里設置了256阻塑,按照你服務器的負載量來設定蓝撇,
-P是設置保存Memcache的pid文件,我這里是保存在 /tmp/memcached.pid陈莽,
2.如果要結(jié)束Memcache進程渤昌,執(zhí)行:
cat /tmp/memcached.pid 或者 ps -aux | grep memcache (找到對應的進程id號)
kill 進程id號
也可以啟動多個守護進程,不過端口不能重復走搁。
memcache 的連接
telnet ip port
注意連接之前需要再memcache服務端把memcache的防火墻規(guī)則加上
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
重新加載防火墻規(guī)則
service iptables restart
OK ,現(xiàn)在應該就可以連上memcache了
在客戶端輸入stats 查看memcache的狀態(tài)信息
[圖片上傳失敗...(image-31879a-1561856651866)]
pid memcache服務器的進程ID
uptime 服務器已經(jīng)運行的秒數(shù)
time 服務器當前的unix時間戳
version memcache版本
pointer_size 當前操作系統(tǒng)的指針大卸栏獭(32位系統(tǒng)一般是32bit)
rusage_user 進程的累計用戶時間
rusage_system 進程的累計系統(tǒng)時間
curr_items 服務器當前存儲的items數(shù)量
total_items 從服務器啟動以后存儲的items總數(shù)量
bytes 當前服務器存儲items占用的字節(jié)數(shù)
curr_connections 當前打開著的連接數(shù)
total_connections 從服務器啟動以后曾經(jīng)打開過的連接數(shù)
connection_structures 服務器分配的連接構(gòu)造數(shù)
cmd_get get命令 (獲取)總請求次數(shù)
cmd_set set命令 (保存)總請求次數(shù)
get_hits 總命中次數(shù)
get_misses 總未命中次數(shù)
evictions 為獲取空閑內(nèi)存而刪除的items數(shù)(分配給memcache的空間用滿后需要刪除舊的items來得到空間分配給新的items)
bytes_read 讀取字節(jié)數(shù)(請求字節(jié)數(shù))
bytes_written 總發(fā)送字節(jié)數(shù)(結(jié)果字節(jié)數(shù))
limit_maxbytes 分配給memcache的內(nèi)存大兴街病(字節(jié))
threads 當前線程數(shù)
redis
Redis是 在memcache之后編寫的忌栅,大家經(jīng)常把這兩者做比較,如果說它是個key-value store 的話但是它具有豐富的數(shù)據(jù)類型曲稼,我想暫時把它叫做緩存數(shù)據(jù)流中心索绪,就像現(xiàn)在物流中心那樣,order贫悄、package瑞驱、store、 classification清女、distribute钱烟、end。現(xiàn)在還很流行的LAMP PHP架構(gòu) 不知道和 redis+MySQL 或者 redis + MongoDB的性能比較(聽群里的人說mongodb分片不穩(wěn)定)嫡丙。
先說說reidis的特性
1. 支持持久化
redis的本地持久化支持兩種方式:RDB和AOF拴袭。RDB 在redis.conf配置文件里配置持久化觸發(fā)器,AOF指的是redis沒增加一條記錄都會保存到持久化文件中(保存的是這條記錄的生成命令)曙博,如果 不是用redis做DB用的話還會不要開AOF 拥刻,數(shù)據(jù)太龐大了,重啟恢復的時候是一個巨大的工程父泳!
2.豐富的數(shù)據(jù)類型
redis 支持 String 般哼、Lists、sets惠窄、sorted sets蒸眠、hashes 多種數(shù)據(jù)類型,新浪微博會使用redis做nosql主要也是它具有這些類型,時間排序杆融、職能排序楞卡、我的微博、發(fā)給我的這些功能List 和 sorted set
的強大操作功能息息相關
3.高性能
這點跟memcache很想象,內(nèi)存操作的級別是毫秒級的比硬盤操作秒級操作自然高效不少蒋腮,較少了磁頭尋道淘捡、數(shù)據(jù)讀取、頁面交換這些高開銷的操作池摧!這也是NOSQL冒出來的原因吧焦除,應該是高性能
是基于RDBMS的衍生產(chǎn)品,雖然RDBMS也具有緩存結(jié)構(gòu)作彤,但是始終在app層面不是我們想要的那么操控的膘魄。
4.replication
redis提供主從復制方案,跟mysql一樣增量復制而且復制的實現(xiàn)都很相似宦棺,這個復制跟AOF有點類似復制的是新增記錄命令瓣距,主庫新增記錄將新增腳本 發(fā)送給從庫黔帕,從庫根據(jù)腳本生成記錄代咸,這個過程非常快成黄,就看網(wǎng)絡了呐芥,一般主從都是在同一個局域網(wǎng),所以可以說redis的主從近似及時同步奋岁,同事它還支持一 主多從思瘟,動態(tài)添加從庫,從庫數(shù)量沒有限制闻伶。 主從庫搭建滨攻,我覺得還是采用網(wǎng)狀模式,如果使用鏈式(master-slave-slave-slave-slave·····)如果第一個slave出 現(xiàn)宕機重啟蓝翰,首先從master 接收 數(shù)據(jù)恢復腳本光绕,這個是阻塞的,如果主庫數(shù)據(jù)幾TB的情況恢復過程得花上一段時間畜份,在這個過程中其他的slave就無法和主庫同步了诞帐。
5.更新快
這點好像從我接觸到redis到目前為止 已經(jīng)發(fā)了大版本就4個,小版本沒算過爆雹。redis作者是個非常積極的人停蕉,無論是郵件提問還是論壇發(fā)帖,他都能及時耐心的為你解答钙态,維護度很高慧起。有人維護的 話,讓我們用的也省心和放心册倒。目前作者對redis 的主導開發(fā)方向是redis的集群方向蚓挤。
redis的安裝
redis的安裝其實還是挺簡單的,總的來說就三步:下載tar包,解壓tar包屈尼,安裝册着。
不過最近我在2.6.7后用centos 5.5 32bit 時碰到一個安裝問題,下面我就用圖片分享下安裝過程碰到的問題脾歧,在redis 文件夾內(nèi)執(zhí)行make時有個如下的錯 undefined reference to '__sync_add_and_fetch_4'
[圖片上傳失敗...(image-ff5830-1561856651866)]
上網(wǎng)找了了好多最后在 https://github.com/antirez/redis/issues/736 找到解決方案甲捏,write CFLAGS= -march=i686 on src/Makefile head!
[圖片上傳失敗...(image-985c24-1561856651865)]
記得要把剛安裝失敗的文件刪除,重新解壓新的安裝文件鞭执,修改Makefile文件司顿,再make安裝。就不會發(fā)現(xiàn)原來那個錯誤了
關于redis的一些屬性注釋和基本類型操作在上一篇redis 的開胃菜有詳細的說明兄纺,這里就不再重復累贅了(實質(zhì)是想偷懶 大溜,哈哈!)
最后估脆,把memcache和redis放在一起不得不會讓人想到兩者的比較钦奋,誰快誰好用啊,群里面已經(jīng)為這個事打架很久了疙赠,我就把我看到的在這里跟大家分享下付材。
在別人發(fā)了一個memcache性能比redis好很多后,redis 作者 antirez 發(fā)表了一篇博文圃阳,主要是說到如何給redis 和 memcache 做壓力測試厌衔,文中講到有個人說許多開源軟件都應該丟進廁所,因為他們的壓力測試腳本太2了捍岳,作者對這個說明了一番富寿。redis vs memcache is definitely an apple to apple comparison。 呵呵锣夹,很明確吧页徐,兩者的比較是不是有點雞蛋挑骨頭的效果,作者在相同的運行環(huán)境做了三次測試取多好的值晕城,得到的結(jié)果如下圖:
[圖片上傳失敗...(image-7d273d-1561856651865)]
需要申明的是此次測試在單核心處理的過程的數(shù)據(jù)泞坦,memcache是支持多核心多線程操作的(默認沒開)所以在默認情況下上圖具有參考意義,若然則 memcache快于redis砖顷。那為什么redis不支持多線程多核心處理呢贰锁?作者也發(fā)表了一下自己的看法,首先是多線程不變于bug的修復滤蝠,其實是不 易軟件的擴展豌熄,還有數(shù)據(jù)一致性問題因為redis所有的操作都是原子操作,作者用到一個詞nightmare 噩夢物咳,呵呵锣险! 當然不支持多線程操作,肯定也有他的弊端的比如性能想必必然差,作者從2.2版本后專注redis cluster的方向開發(fā)來緩解其性能上的弊端芯肤,說白了就是縱向不行巷折,橫向提高。
應用場景:
<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; color: rgb(0, 0, 0); font-size: 17px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial;">**ehcache直接在jvm虛擬機中緩存崖咨,速度快锻拘,效率高;但是緩存共享麻煩击蹲,集群分布式應用不方便署拟。
redis是通過socket訪問到緩存服務,效率比ecache低歌豺,比數(shù)據(jù)庫要快很多推穷,處理集群和分布式緩存方便,有成熟的方案类咧。
如果是單個應用或者對緩存訪問要求很高的應用馒铃,用ehcache。
如果是大型系統(tǒng)轮听,存在緩存共享骗露、分布式部署、緩存內(nèi)容很大的血巍,建議用redis。
補充下:ehcache也有緩存共享方案珊随,不過是通過RMI或者Jgroup多播方式進行廣播緩存通知更新述寡,緩存共享復雜,維護不方便叶洞;簡單的共享可以鲫凶,但是涉及到緩存恢復,大數(shù)據(jù)緩存衩辟,則不合適
redis和memcached相比的獨特之處:
1螟炫、redis可以用來做存儲(storage),而memcached是用來做緩存(cache)
這個特點主要因為其有持久化功能
2、redis中存儲的數(shù)據(jù)有多種結(jié)構(gòu)艺晴,而memcached存儲的數(shù)據(jù)只有一種類型“字符串”** 第二種理解:</pre>
第一:兩者之間的介紹
Redis:屬于獨立的運行程序昼钻,需要單獨安裝后,使用JAVA中的Jedis來操縱封寞。因為它是獨立然评,所以如果你寫個單元測試程序,放一些數(shù)據(jù)在Redis中狈究,然后又寫一個程序去拿數(shù)據(jù)碗淌,那么是可以拿到這個數(shù)據(jù)的。,
ehcache:與Redis明顯不同亿眠,它與java程序是綁在一起的碎罚,java程序活著,它就活著纳像。譬如魂莫,寫一個獨立程序放數(shù)據(jù),再寫一個獨立程序拿數(shù)據(jù)爹耗,那么是拿不到數(shù)據(jù)的耙考。只能在獨立程序中才能拿到數(shù)據(jù)。
|