1、memcached是什麼?java
2、memcached不互相通訊的分佈式git
3、安裝步驟github
4、本文介紹的命令主要包括:spring
5、java客戶端訪問數據庫
1、 memcached是什麼?windows
memcached 是以LiveJournal 旗下Danga Interactive 公司的Brad Fitzpatric 爲首開發的一款軟件。如今已成爲 mixi、 hatena、 Facebook、 Vox、LiveJournal等衆多服務中 提升Web應用擴展性的重要因素。瀏覽器
許多Web應用都將數據保存到RDBMS中,應用服務器從中讀取數據並在瀏覽器中顯示。 但隨着數據量的增大、訪問的集中,就會出現RDBMS的負擔加劇、數據庫響應惡化、 網站顯示延遲等重大影響。緩存
這時就該memcached大顯身手了。memcached是高性能的分佈式內存緩存服務器。 通常的使用目的是,經過緩存數據庫查詢結果,減小數據庫訪問次數,以提升動態Web應用的速度、 提升可擴展性。服務器
2、 memcached不互相通訊的分佈式併發
memcached儘管是「分佈式」緩存服務器,但服務器端並無分佈式功能。 各個memcached不會互相通訊以共享信息。那麼,怎樣進行分佈式呢? 這徹底取決於客戶端的實現。
3、安裝步驟 (我這裏由於是win7系統,爲了便於測試,安裝的是windows 64bit版本)
一、 從http://pan.baidu.com/s/1sk7lNgp 下載,解壓到指定目錄,如:C:\Users\Admin\Desktop\memcached-win64-1.4.4-14\memcached
二、 用cmd打開命令窗口,轉到解壓的目錄,輸入 「memcached.exe -d install」。
三、打開控制面板,打開服務,能夠看到memcached已經在上面,若是沒有啓動,則手動啓動一下。
4、 本文介紹的命令主要包括:
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 所設定時間的項目,在被執行取回命令時命令被忽略。
5、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
另外,能夠參考以下的博客
相關連接:
Memcached筆記——(一)安裝&常規錯誤&監控
Memcached筆記——(二)XMemcached&Spring集成
Memcached筆記——(三)Memcached使用總結
Memcached筆記——(四)應對高併發攻擊