以前用過redis 和 memcache ,沒有ehcache 的開發經驗,最近也查閱很多文檔和博客,寫一些總結,也有很多內容總結與諸多博客中的博主總結:前端
Ehcachejava
EhCache 是一個純Java的進程內緩存框架,具備快速、精幹等特色,是Hibernate中默認的CacheProvider,因此被用於大型複雜分佈式web application的各個節點中。Ehcache是一種普遍使用的開源Java分佈式緩存。主要面向通用緩存,Java EE和輕量級容器。它具備內存和磁盤存儲,緩存加載器,緩存擴展,緩存異常處理程序,一個gzip緩存servlet過濾器,支持REST和SOAP api等特色。linux
主要的特性有:c++
1. 快速web
Ehcache的發行有一段時長了,通過幾年的努力和不可勝數的性能測試,Ehcache終被設計於large, high concurrency systems.redis
2. 簡單算法
開發者提供的接口很是簡單明瞭,從Ehcache的搭建到運用運行僅僅須要的是你寶貴的幾分鐘。其實不少開發者都不知道本身用在用Ehcache,Ehcache被普遍的運用於其餘的開源項目數據庫
好比:hibernate後端
3.夠輕量api
核心程序僅僅依賴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下的二緩存 |
在classpath下配置ehcache.xml
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
代碼中有個ehcache.xml文件,如今來介紹一下這個文件中的一些屬性
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 當前線程數 |
1.1. 什麼是redisRedis是用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();
}
}
} |