一、memcached是什麼? 二、memcached不互相通信的分散式 三、安裝步驟 四、本文介紹的命令主要包括: 存入命令(Storage commands) 取回命令(Retrieval command) 刪除命令(Deletion) 統計(Statistics) 其他命令 五、java客戶端
一、memcached是什麼?
二、memcached不互相通信的分散式
三、安裝步驟
四、本文介紹的命令主要包括:
- 存入命令(Storage commands)
- 取回命令(Retrieval command)
- 刪除命令(Deletion)
- 統計(Statistics)
- 其他命令
五、java客戶端訪問
一、 memcached是什麼?
memcached 是以LiveJournal 旗下Danga Interactive 公司的Brad Fitzpatric 為首開發的一款軟體。現在已成為 mixi、 hatena、 Facebook、 Vox、LiveJournal等眾多服務中 提高Web應用擴展性的重要因素。
許多Web應用都將數據保存到RDBMS中,應用伺服器從中讀取數據併在瀏覽器中顯示。 但隨著數據量的增大、訪問的集中,就會出現RDBMS的負擔加重、資料庫響應惡化、 網站顯示延遲等重大影響。
這時就該memcached大顯身手了。memcached是高性能的分散式記憶體緩存伺服器。 一般的使用目的是,通過緩存資料庫查詢結果,減少資料庫訪問次數,以提高動態Web應用的速度、 提高可擴展性。
二、 memcached不互相通信的分散式
memcached儘管是“分散式”緩存伺服器,但伺服器端並沒有分散式功能。 各個memcached不會互相通信以共用信息。那麼,怎樣進行分散式呢? 這完全取決於客戶端的實現。
三、安裝步驟 (我這裡因為是win7系統,為了便於測試,安裝的是windows 64bit版本)
1、 從http://pan.baidu.com/s/1sk7lNgp 下載,解壓到指定目錄,如:C:\Users\Admin\Desktop\memcached-win64-1.4.4-14\memcached
2、 用cmd打開命令視窗,轉到解壓的目錄,輸入 “memcached.exe -d install”。
3、打開控制面板,打開服務,可以看到memcached已經在上面,如果沒有啟動,則手動啟動一下。
四、 本文介紹的命令主要包括:
1.存入命令(Storage commands)
<command name> <key> <flags> <exptime> <bytes> [noreply]\r\n
cas <key> <flags> <exptime> <bytes> <cas unique> [noreply]\r\n
<command name> 是"set", "add", "replace", "append" 或者"prepend"
key 長度最長不能超過250 characters
set 命令用於向緩存添加新的鍵值對。如果鍵已經存在,則之前的值將被替換。
add 僅當緩存中不存在鍵時,add 命令才會向緩存中添加一個鍵值對。如果緩存中已經存在鍵,則之前的值將仍然保持相同,並且您將獲得響應NOT_STORED。
replace 僅當鍵已經存在時,replace 命令才會替換緩存中的鍵。如果緩存中不存在鍵,那麼您將從 memcached 伺服器接受到一條 NOT_STORED 響應。
Append 將此數據添加到現有數據後的現有key中
prepend 將此數據添加到現有數據前的現有key中
append和prepend命令不接受flags或exptime。他們更新現有的數據部分,而忽略了新的flag和exptime設置。
cas是一個check和set操作,這意味著, 存儲這些數據,但在我訪問過此數據後,再沒有其他人更新。
<key>用於查找緩存值
<flags>可以包括鍵值對的整型參數,客戶機使用它存儲關於鍵值對的額外信息
<exptime>在緩存中保存鍵值對的時間長度(以秒為單位,0 表示永遠)
<bytes>在緩存中存儲的位元組點
<cas unique> 一個存在的64bit的entry值。這個值是客戶端使用gets返回的值。
"noreply" 這是一個可選參數,服務端不會發送回覆。
在這一行之下,是客戶端要發送給服務端進行緩存的數據。
<data block>\r\n
<data block> 存儲的數據塊(可直接理解為key-value結構中的value)
實例操作:
可以看到我保存了carl到username中,結果是STORED。表示存儲成功。
2.取回命令(Retrieval command)
get <key>*\r\n
gets <key>*\r\n
<key>* 是一個或多個被空格分開的字元串
返回的結果是0到多個items。存儲的數據會被顯示出來。結尾是一個
"END\r\n"
3.刪除命令(Deletion)
delete <key> [noreply]\r\n
<key> 是客戶端想要刪除的服務端的緩存的key值
4.統計(Statistics)
stats 命令的功能正如其名:轉儲所連接的 memcached 實例的當前統計數據。在下例中,執行 stats 命令顯示了關於當前 memcached 實例的信息:
STAT pid
22459
進程ID
STAT uptime
1027046
伺服器運行秒數
STAT time
1273043062
伺服器當前unix時間戳
STAT version
1.4.4
伺服器版本
STAT pointer_size
64
操作系統字大小(這台伺服器是64位的)
STAT rusage_user
0.040000
進程累計用戶時間
STAT rusage_system
0.260000
進程累計系統時間
STAT curr_connections
10
當前打開連接數
STAT total_connections
82
曾打開的連接總數
STAT connection_structures 13
伺服器分配的連接結構數
STAT cmd_get
54
執行get命令總數
STAT cmd_set
34
執行set命令總數
STAT cmd_flush
3
指向flush_all命令總數
STAT get_hits
9
get命中次數
STAT get_misses
45
get未命中次數
STAT delete_misses
5
delete未命中次數
STAT delete_hits
1
delete命中次數
STAT incr_misses
0
incr未命中次數
STAT incr_hits
0
incr命中次數
STAT decr_misses
0
decr未命中次數
STAT decr_hits
0
decr命中次數
STAT cas_misses 0 cas未命中次數
STAT cas_hits
0
cas命中次數
STAT cas_badval
0
使用擦拭次數
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read
15785
讀取位元組總數
STAT bytes_written
15222
寫入位元組總數
STAT limit_maxbytes
1048576
分配的記憶體數(位元組)
STAT accepting_conns
1
目前接受的鏈接數
STAT listen_disabled_num
0
STAT threads
4
線程數
STAT conn_yields 0
STAT bytes
0
存儲item位元組數
STAT curr_items
0
item個數
STAT total_items
34
item總數
STAT evictions
0
為獲取空間刪除item的總數
5.其他命令
flush_all該命令有一個可選的數字參數。它總是執行成功,伺服器會發送 “OK\r\n” 回應。它的效果是使已經存在的項目立即失效(預設),或在指定的時間後。此後執行取回命令,將不會有任何內容返回(除非重新存儲同樣的鍵名)。 flush_all 實際上沒有立即釋放項目所占用的記憶體,而是在隨後陸續有新的項目被儲存時執行(這是由memcached的懶惰檢測和刪除機制決定的)。
flush_all 效果是它導致所有更新時間早於 flush_all 所設定時間的項目,在被執行取回命令時命令被忽略。
五、java客戶端訪問
所依賴的主要jar包
maven配置pom.xml
<!-- memcached client --> <dependency> <groupId>com.google.code.simple-spring-memcached</groupId> <artifactId>spymemcached</artifactId> <version>2.8.4</version> </dependency>
java客戶端測試代碼(參考自文章:http://blog.csdn.net/arui_email/article/details/8129400)
另外大家也可以參考這篇文章http://blog.csdn.net/seelye/article/details/8511073
package com.carl.carlapp.memcached; import java.net.InetSocketAddress; import java.util.concurrent.Future; import net.spy.memcached.MemcachedClient; public class TestSpyMemcache { public static void main(String[] args) { // 保存對象 try { /* 建立MemcachedClient 實例,並指定memcached服務的IP地址和埠號 */ MemcachedClient mc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211)); Future<Boolean> b = null; /* 將key值,過期時間(秒)和要緩存的對象set到memcached中 */ b = mc.set("neea:testDaF:ksIdno", 900, "someObject"); if (b.get().booleanValue() == true) { mc.shutdown(); } } catch (Exception ex) { ex.printStackTrace(); } // 取得對象 try { /* 建立MemcachedClient 實例,並指定memcached服務的IP地址和埠號 */ MemcachedClient mc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211)); /* 按照key值從memcached中查找緩存,不存在則返回null */ Object b = mc.get("neea:testDaF:ksIdno"); System.out.println(b.toString()); mc.shutdown(); } catch (Exception ex) { ex.printStackTrace(); } } }
結果:
someObject
使用telnet 結果:
-----------------------------------------------------------------------
官方網站:http://www.memcached.org/
Github源代碼: https://github.com/memcached/memcached
幫助文檔:https://github.com/memcached/memcached/blob/master/doc/protocol.txt