memcached常用語法及java使用方式 Author:SimpleWu Memcached 存儲命令 Memcached set 命令用於將 value(數據值) 存儲在指定的 key(鍵) 中。 如果set的key已經存在,該命令可以更新該key所對應的原來的數據,也就是實現更新的作用。 M ...
memcached常用語法及java使用方式
Author:SimpleWu
Memcached 存儲命令
Memcached set 命令用於將 value(數據值) 存儲在指定的 key(鍵) 中。
如果set的key已經存在,該命令可以更新該key所對應的原來的數據,也就是實現更新的作用。
set key flags exptime bytes [noreply]
value
Memcached add 命令用於將 value(數據值) 存儲在指定的 key(鍵) 中。
如果 add 的 key 已經存在,則不會更新數據(過期的 key 會更新),之前的值將仍然保持相同,並且您將獲得響應 NOT_STORED。
add key flags exptime bytes [noreply]
value
Memcached replace 命令用於替換已存在的 key(鍵) 的 value(數據值)。
如果 key 不存在,則替換失敗,並且您將獲得響應 NOT_STORED。
replace key flags exptime bytes [noreply]
value
Memcached append 命令用於向已存在 key(鍵) 的 value(數據值) 後面追加數據 。
append key flags exptime bytes [noreply]
value
Memcached prepend 命令用於向已存在 key(鍵) 的 value(數據值) 前面追加數據 。
prepend key flags exptime bytes [noreply]
value
Memcached CAS(Check-And-Set 或 Compare-And-Swap) 命令用於執行一個"檢查並設置"的操作
它僅在當前客戶端最後一次取值後,該key 對應的值沒有被其他客戶端修改的情況下, 才能夠將值寫入。
檢查是通過cas_token參數進行的, 這個參數是Memcach指定給已經存在的元素的一個唯一的64位值。
cas key flags exptime bytes unique_cas_token [noreply]
value
參數說明如下:
- key:鍵值 key-value 結構中的 key,用於查找緩存值。
- flags:可以包括鍵值對的整型參數,客戶機使用它存儲關於鍵值對的額外信息 。
- exptime:在緩存中保存鍵值對的時間長度(以秒為單位,0 表示永遠)
- bytes:在緩存中存儲的位元組數
- unique_cas_token通過 gets 命令獲取的一個唯一的64位值。
- noreply(可選): 該參數告知伺服器不需要返回數據
- value:存儲的值(始終位於第二行)(可直接理解為key-value結構中的value)
Memcached 查找命令
Memcached get 命令獲取存儲在 key(鍵) 中的 value(數據值) ,如果 key 不存在,則返回空。
get key
多個 key 使用空格隔開
get key1 key2 key3
Memcached gets 命令獲取帶有 CAS 令牌存 的 value(數據值) ,如果 key 不存在,則返回空。
gets key
多個 key 使用空格隔開
gets key1 key2 key3
Memcached delete 命令用於刪除已存在的 key(鍵)。
delete key [noreply]
Memcached 統計命令
Memcached stats 命令用於返回統計信息例如 PID(進程號)、版本號、連接數等。
stats
結果:
這裡顯
stats
STAT pid 1162
STAT uptime 5022
STAT time 1415208270
STAT version 1.4.14
STAT libevent 2.0.19-stable
STAT pointer_size 64
STAT rusage_user 0.096006
STAT rusage_system 0.152009
STAT curr_connections 5
STAT total_connections 6
STAT connection_structures 6
STAT reserved_fds 20
STAT cmd_get 6
STAT cmd_set 4
STAT cmd_flush 0
STAT cmd_touch 0
STAT get_hits 4
STAT get_misses 2
STAT delete_misses 1
STAT delete_hits 1
STAT incr_misses 2
STAT incr_hits 1
STAT decr_misses 0
STAT decr_hits 1
STAT cas_misses 0
STAT cas_hits 0
STAT cas_badval 0
STAT touch_hits 0
STAT touch_misses 0
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 262
STAT bytes_written 313
STAT limit_maxbytes 67108864
STAT accepting_conns 1
STAT listen_disabled_num 0
STAT threads 4
STAT conn_yields 0
STAT hash_power_level 16
STAT hash_bytes 524288
STAT hash_is_expanding 0
STAT expired_unfetched 1
STAT evicted_unfetched 0
STAT bytes 142
STAT curr_items 2
STAT total_items 6
STAT evictions 0
STAT reclaimed 1
END
示了很多狀態信息,下邊詳細解釋每個狀態項:
- pid: memcache伺服器進程ID
- uptime:伺服器已運行秒數
- time:伺服器當前Unix時間戳
- version:memcache版本
- pointer_size:操作系統指針大小
- rusage_user:進程累計用戶時間
- rusage_system:進程累計系統時間
- curr_connections:當前連接數量
- total_connections:Memcached運行以來連接總數
- connection_structures:Memcached分配的連接結構數量
- cmd_get:get命令請求次數
- cmd_set:set命令請求次數
- cmd_flush:flush命令請求次數
- get_hits:get命令命中次數
- get_misses:get命令未命中次數
- delete_misses:delete命令未命中次數
- delete_hits:delete命令命中次數
- incr_misses:incr命令未命中次數
- incr_hits:incr命令命中次數
- decr_misses:decr命令未命中次數
- decr_hits:decr命令命中次數
- cas_misses:cas命令未命中次數
- cas_hits:cas命令命中次數
- cas_badval:使用擦拭次數
- auth_cmds:認證命令處理的次數
- auth_errors:認證失敗數目
- bytes_read:讀取總位元組數
- bytes_written:發送總位元組數
- limit_maxbytes:分配的記憶體總大小(位元組)
- accepting_conns:伺服器是否達到過最大連接(0/1)
- listen_disabled_num:失效的監聽數
- threads:當前線程數
- conn_yields:連接操作主動放棄數目
- bytes:當前存儲占用的位元組數
- curr_items:當前存儲的數據總數
- total_items:啟動以來存儲的數據總數
- evictions:LRU釋放的對象數目
- reclaimed:已過期的數據條目來存儲新數據的數目
Memcached stats items 命令用於顯示各個 slab 中 item 的數目和存儲時長(最後一次訪問距離現在的秒數)。
stats items
結果:
stats items
STAT items:1:number 1
STAT items:1:age 7
STAT items:1:evicted 0
STAT items:1:evicted_nonzero 0
STAT items:1:evicted_time 0
STAT items:1:outofmemory 0
STAT items:1:tailrepairs 0
STAT items:1:reclaimed 0
STAT items:1:expired_unfetched 0
STAT items:1:evicted_unfetched 0
END
Memcached flush_all 命令用於清理緩存中的所有 key=>value(鍵=>值) 對。
該命令提供了一個可選參數 time,用於在制定的時間後執行清理緩存操作。
flush_all [time] [noreply]
JAVA連接使用Memcached 服務
要使用Java連接memcached服務,一般常見的有兩種方式:
- 使用Memcached-Java-Client方式(官方提供)
- 使用spymemcached方式
兩種方式的對比:
Memcached-Java-Client方式,較早推出的memcached JAVA客戶端API,應用廣泛,運行比較穩定。
spymemcached方式,支持非同步,單線程的memcached客戶端,用到了java1.5版本的concurrent和nio,存取速度會高於前者,但是穩定性不好,測試中常報timeOut等相關異常。
項目中加入spymemcached依賴
<!-- spymemcached -->
<dependency>
<groupId>com.google.code.simple-spring-memcached</groupId>
<artifactId>spymemcached</artifactId>
<version>2.8.4</version>
</dependency>
spymemcached操作memcache,連接memcached伺服器,並寫入數據,檢索出數據。
public static void main(String[] args) throws IOException, InterruptedException, ExecutionException {
//添加memcached的服務的地址和埠號
InetSocketAddress address = new InetSocketAddress("127.0.0.1", 11211);
//創建memcachedClient客戶端連接對象
MemcachedClient client = new MemcachedClient(address);
//存儲數據
@SuppressWarnings("rawtypes")
Future future = client.set("SimpleWu", 900, "[email protected]");
//查看存儲狀態
System.out.println("status:" + future.get());
//輸出值
System.out.println("value in cache:" + client.get("SimpleWu"));
//client.delete("hello"); //刪除
//client.flushall(); //清除所有數據
client.shutdown(); //關閉連接
}
同樣使用Maven來導入Memcached-Java-Client的jar包。
<!-- Memcached-Java-Client -->
<dependency>
<groupId>com.whalin</groupId>
<artifactId>Memcached-Java-Client</artifactId>
<version>3.0.2</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.6.4</version>
</dependency>
使用Memcached-java-client操作memcached伺服器。添加數據到memcached,然後檢索出數據。
public static void main(String[] args) {
SockIOPool pool = SockIOPool.getInstance(); //創建memcache連接池
String[] addresses = { "127.0.0.1:11211" }; //伺服器地址,可以添加多個
Integer[] weights = {3}; //添加權重
pool.setServers(addresses); //伺服器地址
pool.setWeights(weights); //權重信息
pool.setInitConn( 5 ); //初始連接數
pool.setMinConn( 5 ); //最小連接數
pool.setMaxConn( 250 ); //最大連接數
pool.setMaxIdle( 1000 * 60 * 60 * 6 ); //最大處理時間。
pool.setMaintSleep( 30 ); // 設置主線程的睡眠時間
pool.setNagle(false); //是否緩衝
pool.setSocketTO(3000); //Socket阻塞讀取數據的超時時間
pool.setSocketConnectTO(0); //連接建立時對超時的控制
pool.initialize(); //初始化
MemCachedClient client = new MemCachedClient(); // 使用MemCacheClient
client.add("SimpleWu", "[email protected]"); // 添加
System.out.println(client.get("SimpleWu"));
client.delete("hello"); // 刪除
client.flushAll(); // 清空
}
適用場合
- 分散式應用。由於memcached本身基於分散式的系統,所以尤其適合大型的分散式系統。
- 資料庫前段緩存。資料庫常常是網站系統的瓶頸。資料庫的大併發量訪問,常常造成網站記憶體溢出。當然我們也可以使用hibernate的緩存機制。但memcached是基於分散式的,並可獨立於網站應用本身,所以更適合大型網站進行應用的拆分。
- 伺服器間數據共用。舉例來講,我們將網站的登錄系統、查詢系統拆分為兩個應用,放在不同的伺服器上,併進行集群,那這個時候用戶登錄後,登錄信息如何從登錄系統伺服器同步到查詢系統登錄系統將登錄信息緩存起來,伺服器呢?這時候,我們便可以使用memcached,查詢系統便可以獲得登錄信息,就像獲取本地信息一樣。
不適用的場合
那些不需要“分佈”的,不需要共用的,或者乾脆規模小到只有一臺伺服器的應用,memcached不會帶來任何好處,相反還會拖慢系統效率,因為網路連接同樣需要資源