Memcached是一個免費開源的、高性能的、具備分佈式內存對象的緩存系統redis
它經過減輕數據庫負載壓力,而且提升應用的性能和響應速度。數據庫
Ngnix/redis/netty基於epoll模型開發緩存
Nodejs基於libev開發(libev相似libevent)服務器
JDK1.4提供非阻塞(NIO)的支持,JDK1.5版本使用epoll代替傳統的select/poll網絡
5.memcache互不通訊的分佈式(基於客戶端的分佈式)數據結構
第一步:安裝libevent併發
# yum install -y libeventapp
第二步:安裝memcachedsocket
# yum install -y memcached分佈式
第三步:啓動並使用memcached
# memcached -m 64 -p 11211 -u root -vvv
第四步:使用memcached
# telnet memcached_server_ip port(默認端口:11211) 例如:# telnet localhost 11211
啓動參數 |
參數說明 |
-p <num> |
監聽的TCP端口(默認: 11211) |
-U <num> |
監聽的UDP端口(默認: 11211, 0表示不監聽) |
-s <file> |
用於監聽的UNIX套接字路徑(禁用網絡支持) |
-a <mask> |
UNIX套接字訪問掩碼,八進制數字(默認:0700) |
-l <ip_addr> |
監聽的IP地址。(默認:INADDR_ANY,全部地址) |
-d |
做爲守護進程來運行 |
-r |
最大核心文件限制 |
-u <username> |
設定進程所屬用戶。(只有root用戶可使用這個參數) |
-m <num> |
全部slab class可用內存的上限,以MB爲單位。(默認:64MB) |
-M |
內存用光時報錯。(不會刪除數據) |
-c <num> |
最大併發鏈接數。(默認:1024) |
-k |
鎖定全部內存頁。注意你能夠鎖定的內存上限。 |
-v |
提示信息(在事件循環中打印錯誤/警告信息。) |
-vv |
詳細信息(還打印客戶端命令/響應) |
-vvv |
超詳細信息(還打印內部狀態的變化) |
-h |
打印這個幫助信息並退出 |
-i |
打印memcached和libevent的許可 |
-P <file> |
保存進程ID到指定文件,只有在使用 -d 選項的時候纔有意義 |
-f <factor> |
不一樣slab class裏面的chunk大小的增加倍率。(默認:1.25) |
-n <bytes> |
chunk的最小空間(默認:48) |
-L |
嘗試使用大內存頁(若是可用的話)。提升內存頁尺寸能夠減小"頁表緩衝(TLB)"丟失次數,提升運行效率。 |
-D <char> |
使用 <char> 做爲前綴和ID的分隔符 |
-t <num> |
使用的線程數(默認:4) |
-R |
每一個鏈接可處理的最大請求數 |
-C |
禁用CAS(Check And Swap/Compare And Swap) |
-b |
設置後臺日誌隊列的長度(默認:1024) |
-B |
綁定協議 - 可能值:ascii,binary,auto(默認) |
-I |
重寫每一個數據頁尺寸。調整數據項最大尺寸 |
命令類型 |
命令 |
|
存儲命令 |
set |
set 命令用於將 value(數據值) 存儲在指定的 key(鍵) 中。 若是set的key已經存在,該命令能夠更新該key所對應的原來的數據,也就是實現更新的做用 |
add |
用於將 value(數據值) 存儲在指定的 key(鍵) 中。 若是 add 的 key 已經存在,則不會更新數據(過時的 key 會更新),以前的值將仍然保持相同,而且將得到響應 NOT_STORED。 |
|
replace |
用於替換已存在的 key(鍵) 的 value(數據值)。 若是 key 不存在,則替換失敗,而且將得到響應 NOT_STORED |
|
append |
用於向已存在 key(鍵) 的 value(數據值) 後面追加數據 |
|
prepend |
用於向已存在 key(鍵) 的 value(數據值) 前面追加數據 。 |
|
CAS |
用於執行一個"檢查並設置"的操做 它僅在當前客戶端最後一次取值後,該key 對應的值沒有被其餘客戶端修改的狀況下, 纔可以將值寫入。 檢查是經過cas_token參數進行的, 這個參數是Memcach指定給已經存在的元素的一個惟一的64位值 |
|
查找命令 |
get |
獲取存儲在 key(鍵) 中的 value(數據值) ,若是 key 不存在,則返回空 |
gets |
獲取帶有 CAS 令牌存 的 value(數據值) ,若是 key 不存在,則返回空。 |
|
delete |
用於刪除已存在的 key(鍵) |
|
incr/decr |
用於對已存在的 key(鍵) 的數字值進行自增或自減操做。 incr 與 decr 命令操做的數據必須是十進制的32位無符號整數。 若是 key 不存在返回 NOT_FOUND,若是鍵的值不爲數字,則返回 CLIENT_ERROR,其餘錯誤返回 ERROR。 |
|
統計命令 |
stats |
返回統計信息例如 PID(進程號)、版本號、鏈接數等 |
stats items |
顯示各個 slab 中 item 的數目和存儲時長(最後一次訪問距離如今的秒數) |
|
stats slabs |
用於顯示各個slab的信息,包括chunk的大小、數目、使用狀況等。 |
|
stats size |
用於顯示全部item的大小和個數。 該信息返回兩列,第一列是 item 的大小,第二列是 item 的個數。 |
|
flush_all |
用於清理緩存中的全部 key=>value(鍵=>值) 對。 該命令提供了一個可選參數 time,用於在制定的時間後執行清理緩存操做。 |
新增一個key。若是key存在,則不更新數據。
格式:add key 數據類型 過時時間 長度 [noreply]
若是小於30天會按照秒計算(30*24*3600),若是大於30天則轉換成unixtime時間戳而不是偏移量。
4,.bytes:在緩存中存儲的字節數
5.noreply(可選): 該參數告知服務器不須要返回數據
6.value:存儲的值(始終位於第二行)(可直接理解爲key-value結構中的value)
若是Key存在更新,若是不存在add(saveOrUpdate)
格式:set key 數據類型 過時時間 長度 [noreply]
獲取存儲的value值,若是key不存在返回空。
格式:get key [key1] [key2] [key3] ...... [keyN]
刪除已經存在的key
格式:delete [key]
替換已經存在的值。若是key不粗存在,則替換失敗
格式:replace key flag exptime bytes [noreply]
向已經存在key末尾追加數據。
格式:append key flag exptime bytes [noreply]
向已經存在key最前面追加數據。
格式:prepend key flag exptime bytes [noreply]
根據樂觀鎖機制,對key值進行更新。Key在沒有被其餘客戶端修改的狀況下,才能更新。
格式:cas key flag exptime bytes token [noreply]
場景案例:秒殺
獲取key的令牌值,若是key不存在,返回空。
格式:gets key [key1] [key2] [key3].... [keyN]
對於key的數值進行自增或者自減操做。
incr/decr操做的數值必須是十進制的32位無符號型。
格式:incr key value
格式:decr key value
stats命令主要用於返回統計信息。
主要用於顯示slab中的item數量和存儲時長。
主要用於顯示slab的信息,好比:大小/數量/使用狀況。
STAT 96 1 主要顯示item的大小和個數。
第一個值item大小,第二個值是item個數。
清除緩存中全部的key-value鍵值對。