ehcache memcache redis 區別,ehcachememcache
之前用過redis 和 memcache ,沒有ehcache 的開發經驗,最近也查閱不少文檔和部落格,寫一些總結,也有不少內容總結與諸多部落格中的博主總結:
Ehcache
EhCache 是一個純Java的進程內緩衝架構,具有快速、精乾等特點,是Hibernate中預設的CacheProvider,所以被用於大型複雜分布式web application的各個節點中。Ehcache是一種廣泛使用的開源Java分布式緩衝。主要面向通用緩衝,Java EE和輕量級容器。它具有記憶體和磁碟儲存,緩衝載入器,緩衝擴充,緩衝例外處理常式,一個gzip緩衝servlet過濾器,支援REST和SOAP api等特點。
主要的特性有:
1. 快速
Ehcache的發行有一段時間長度了,經過幾年的努力和不計其數的效能測試,Ehcache終被設計於large, high concurrency systems.
2. 簡單
開發人員提供的介面非常簡單明了,從Ehcache的搭建到運用運行僅僅需要的是你寶貴的幾分鐘。其實很多開發人員都不知道自己用在用Ehcache,Ehcache被廣泛的運用於其他的開源項目
比如:hibernate
3.夠輕量
核心程式僅僅依賴slf4j這一個包,沒有之一!一般Ehcache的發布版本不會到2M,V 2.2.3 才 668KB。
4.多種緩衝策略
Ehcache提供了對大資料的記憶體和硬碟的儲存,快取資料會在虛擬機器重啟的過程中寫入磁碟。最近版本允許多執行個體、儲存對象高靈活性、提供LRU、LFU、FIFO淘汰演算法,基礎屬性支援熱配置、支援的外掛程式多
5.具有緩衝和緩衝管理器的偵聽介面
緩衝管理器監聽器 (CacheManagerListener)和 緩衝監聽器(CacheEvenListener),做一些統計或資料一致性廣播挺好用的
6.可以通過RMI、可插入API等方式進行分布式緩衝;
如何使用?
夠簡單就是Ehcache的一大特色,自然用起來just so easy!
整合使用(Spring項目):
a.加入ehcache-core-2.6.5.jar和mybatis-ehcache-1.0.2.jar
b.整合ehcache:
配置mapper中cache中的type為ehcache對cache介面的實作類別型
SqlMapConfig.xml: <!-- 開啟二級緩衝 --> <setting name="cacheEnabled" value="true"/> UserMapper.xml: <mapper namespace="cn.itcast.mybatis.mapper.UserMapper"> <!-- 開啟本mapper的namespace下的二緩衝 type:指定cache介面的實作類別的類型,mybatis預設使用PerpetualCache 要和ehcache整合,需要配置type為ehcache實現cache介面的類型 --> <cache type="org.mybatis.caches.ehcache.EhcacheCache"/> |
在classpath下配置ehcache.xml
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd"> <diskStore path="F:\develop\ehcache" /> <defaultCache maxElementsInMemory="1000" maxElementsOnDisk="10000000" eternal="false" overflowToDisk="false" timeToIdleSeconds="120" timeToLiveSeconds="120" diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU"> </defaultCache> </ehcache> |
代碼中有個ehcache.xml檔案,現在來介紹一下這個檔案中的一些屬性
- name:緩衝名稱。
- maxElementsInMemory:緩衝最大個數。
- eternal:對象是否永久有效,一但設定了,timeout將不起作用。
- timeToIdleSeconds:設定對象在失效前的允許閑置時間(單位:秒)。僅當eternal=false對象不是永久有效時使用,可選屬性,預設值是0,也就是可閑置時間無窮大。
- timeToLiveSeconds:設定對象在失效前允許存活時間,最大時間介於建立時間和失效時間之間。僅當eternal=false對象不是永久有效時使用,預設是0.,也就是對象存活時 間無窮大。
- overflowToDisk:當記憶體中對象數量達到maxElementsInMemory時,Ehcache將會對象寫到磁碟中。
- diskSpoolBufferSizeMB:這個參數設定DiskStore(磁碟緩衝)的緩衝區大小。預設是30MB。每個Cache都應該有自己的一個緩衝區。
- maxElementsOnDisk:硬碟最大緩衝個數。
- diskPersistent:是否快取資料在虛擬機器重啟的過程中寫入磁碟據 Whether the disk store persists between restarts of the Virtual Machine. The default value is false.
- diskExpiryThreadIntervalSeconds:磁碟失效線程已耗用時間間隔,預設是120秒。
- memoryStoreEvictionPolicy:當達到maxElementsInMemory限制時,Ehcache將會根據指定的策略去清理記憶體。預設策略是LRU。你可以設定為 FIFO或是LFU。
- clearOnFlush:記憶體數量最大時是否清除。
memcache :
memcache是一套分布式的快取系統
通過在記憶體裡維護一個統一的巨大的hash表,它能夠用來儲存各種格式的資料,包括映像、視頻、檔案以及資料庫檢索的結果等。簡單的說就是將資料調用到記憶體中,然後從記憶體中讀取,從而大大提高讀取速度。
MemCache的工作機制:
先檢查用戶端的請求資料是否在memcached中,如有,直接把請求資料返回,不再對資料庫進行任何操作;如果請求的資料不在memcached中,就去查資料庫,把從資料庫中擷取的資料返回給用戶端,同時把資料緩衝一份到memcached中(memcached用戶端不負責,需要程式明確實現);每次更新資料庫的同時更新memcached中的資料,保證一致性;當分配給memcached記憶體空間用完之後,會使用LRU(Least Recently Used,最近最少使用)策略加上到期失效策略,失效資料首先被替換,然後再替換掉最近未使用的資料
Memcached是以精靈(監聽)方式運行於一個或多個伺服器中,隨時會接收用戶端的串連和操作.
Memcached使用:
memcache C語言所編寫,依賴於最新版本的GCC和libevent。
安裝使用:(下載memcached和libevent),自訂安裝目錄:/usr/local/memcached
#mkdir /usr/local/memcached #cd /usr/local/memcached 使用如下命令下載,需連網: # wget http://www.danga.com/memcached/dist/memcached-1.2.0.tar.gz # wget http://www.monkey.org/~provos/libevent-1.2.tar.gz 通過ls查看是否下載完成,下載完成會有兩個包:libevent-1.2.tar.gz和memcached-1.2.0.tar.gz 先安裝libevent(確認已安裝GCC,如未安裝就先安裝GCC) # tar zxvf libevent-1.2.tar.gz # cd libevent-1.2 # ./configure -prefix=/usr # make (如果遇到提示gcc 沒有安裝則先安裝gcc) # make install 測試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 安裝成功 |
安裝memcached,同時需要安裝中指定libevent的安裝位置: # cd /tmp # tar zxvf memcached-1.2.0.tar.gz # cd memcached-1.2.0 # ./configure -with-libevent=/usr # make # make install 如果中間出現報錯,請仔細檢查錯誤資訊,按照錯誤資訊來配置或者增加相應的庫或者路徑。 安裝完成後會把memcached放到 /usr/local/bin/memcached , 測試是否成功安裝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 |
啟動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使用的記憶體數量,單位是MB,我這裡是8096MB, -u是運行Memcache的使用者,我這裡是root, -l是監聽的伺服器IP地址,如果有多個地址的話,我這裡指定了伺服器的IP地址192.168.77.105, -p是設定Memcache監聽的連接埠,我這裡設定了12000,最好是1024以上的連接埠, -c選項是最大啟動並執行並發串連數,預設是1024,我這裡設定了256,按照你伺服器的負載量來設定, -P是設定儲存Memcache的pid檔案,我這裡是儲存在 /tmp/memcached.pid, 2.如果要結束Memcache進程,執行: # cat /tmp/memcached.pid 或者 ps -aux | grep memcache (找到對應的進程id號) # kill 進程id號 也可以啟動多個守護進程,不過連接埠不能重複。 memcache 的串連 telnet ip port 注意串連之前需要再memcache服務端把memcache的防火牆規則加上 -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT 重新載入防火牆規則 service iptables restart OK ,現在應該就可以連上memcache了 在用戶端輸入stats 查看memcache的狀態資訊 |
pid memcache伺服器的進程ID uptime 伺服器已經啟動並執行秒數 time 伺服器當前的unix時間戳記 version memcache版本 pointer_size 當前作業系統的指標大小(32位系統一般是32bit) rusage_user 進程的累計使用者時間 rusage_system 進程的累計系統時間 curr_items 伺服器當前儲存的items數量 total_items 從伺服器啟動以後儲存的items總數量 bytes 當前伺服器儲存items佔用的位元組數 curr_connections 當前開啟著的串連數 total_connections 從伺服器啟動以後曾經開啟過的串連數 connection_structures 伺服器分配的串連構造數 cmd_get get命令 (擷取)總請求次數 cmd_set set命令 (儲存)總請求次數 get_hits 總叫用次數 get_misses 總未叫用次數 evictions 為擷取空閑記憶體而刪除的items數(分配給memcache的空間用滿後需要刪除舊的items來得到空間分配給新的items) bytes_read 讀取位元組數(請求位元組數) bytes_written 總發送位元組數(結果位元組數) limit_maxbytes 分配給memcache的記憶體大小(位元組) threads 當前線程數 |
redis:
| 1.1. 什麼是redis Redis是用C語言開發的一個開源的高效能索引值對(key-value)資料庫。它通過提供多種索引值資料類型來適應不同情境下的儲存需求,目前為止Redis支援的索引值資料類型如下: 字串類型 散列類型 清單類型 集合類型 有序集合類型。 2.2. redis的應用情境 緩衝(資料查詢、短串連、新聞內容、商品內容等等)。(最多使用) 分布式叢集架構中的session分離。 聊天室的線上好友名單。 任務隊列。(秒殺、搶購、12306等等) 應用熱門排行榜。 網站訪問統計。 資料到期處理(可以精確到毫秒) |
1.1. Redis的安裝 redis是C語言開發,建議在linux上運行,本此使用Centos6.4作為安裝環境。安裝redis需要先將官網下載的源碼進行編譯,編譯依賴gcc環境,如果沒有gcc環境; 需要安裝gcc:yum install gcc-c++ 從官網下載 http://download.redis.io/releases/redis-3.0.0.tar.gz 將redis-3.0.0.tar.gz拷貝到/usr/local下 解壓源碼 #tar -zxvf redis-3.0.0.tar.gz 進入解壓後的目錄進行編譯 #cd /usr/local/redis-3.0.0 #make 安裝到指定目錄,如 /usr/local/redis #cd /usr/local/redis-3.0.0 #make PREFIX=/usr/local/redis install redis.conf redis.conf是redis的設定檔,redis.conf在redis源碼目錄。 注意修改port作為redis進程的連接埠,port預設6379。 拷貝設定檔到安裝目錄下 進入源碼目錄,裡面有一份設定檔 redis.conf,然後將其拷貝到安裝路徑下 #cd /usr/local/redis #mkdir conf #cp /usr/local/redis-3.0.0/redis.conf /usr/local/redis/bin 安裝目錄bin下的資料夾清單 redis3.0新增的redis-sentinel是redis叢集管理工具可實現高可用 |
| 1.1. redis啟動 1.1.1. 前端模式啟動 直接運行bin/redis-server將以前端模式啟動,前端模式啟動的缺點是ssh命令視窗關閉則redis-server程式結束,不推薦使用此方法。如: 1.1.2. 後端模式啟動修改redis.conf設定檔, daemonize yes 以後端模式啟動。 執行如下命令啟動redis: cd /usr/local/redis ./bin/redis-server ./redis.conf redis預設使用6379連接埠。 |
| 1.1. 通過jedis串連redis單機1.1.1. jar包如果是通過maven管理的項目,則在pom.xml檔案中添加 pom.xml <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.7.0</version> </dependency> 如果不是maven管理。手動添加jia包 (commons-pool2-2-.3.jar和jedis-2.7.0.jar) 通過建立單一實例jedis對象串連redis服務,如下代碼 // 單一實例串連redis @Test public void testJedisSingle() { Jedis jedis = new Jedis("192.168.101.3", 6379); jedis.set("name", "bar"); String name = jedis.get("name"); System.out.println(name); jedis.close(); } 使用串連池串連 通過單一實例串連redis不能對redis串連進行共用,可以使用串連池對redis串連進行共用,提高資源使用率,使用jedisPool串連redis服務,如下代碼: @Test public void pool() { JedisPoolConfig config = new JedisPoolConfig(); //最大串連數 config.setMaxTotal(30); //最大串連空閑數 config.setMaxIdle(2); JedisPool pool = new JedisPool(config, "192.168.101.3", 6379); Jedis jedis = null; try { jedis = pool.getResource(); jedis.set("name", "lisi"); String name = jedis.get("name"); System.out.println(name); }catch(Exception ex){ ex.printStackTrace(); }finally{ if(jedis != null){ //關閉串連 jedis.close(); } } } |