標籤:
Memcached 官方網站:http://memcached.org/
當前最新版本(stable 穩定版)是 1.4.24,源碼包:http://www.memcached.org/files/memcached-1.4.24.tar.gz
memcached 依賴於 libevent 庫,需要先編譯 libevent,:http://jaist.dl.sourceforge.net/project/levent/libevent/libevent-2.0/libevent-2.0.22-stable.tar.gz
安裝過程:
libevent:
① 解壓
[[email protected] src]# tar -zxvf libevent-2.0.22-stable.tar.gz
② 進入目錄
[[email protected] src]# cd libevent-2.0.22-stable
③ 配置
可以通過
[[email protected] libevent-2.0.22-stable]# ./configure -h
來查看編譯選項。
配置:
[[email protected] libevent-2.0.22-stable]# ./configure --prefix=/usr/local/libevent
④ 編譯 && 安裝
[[email protected] libevent-2.0.22-stable]# make && make install
memcached
① 解壓:
[[email protected] src]# tar -zxvf memcached-1.4.24.tar.gz
② 進入目錄
[[email protected] src]# cd memcached-1.4.24
③ 配置
[[email protected] memcached-1.4.24]# ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent
④ 編譯 && 安裝
[[email protected] memcached-1.4.24]# make && make install
⑤ 運行 memcached
[[email protected] local]# cd memcached/[[email protected] memcached]# ll總用量 12drwxr-xr-x 2 root root 4096 8月 30 01:27 bindrwxr-xr-x 3 root root 4096 8月 30 01:27 includedrwxr-xr-x 3 root root 4096 8月 30 01:27 share[[email protected] memcached]# ll bin/總用量 292-rwxr-xr-x 1 root root 298213 8月 30 01:27 memcached[[email protected] memcached]# ./bin/memcached -p 11211 -m 64 -vvvcan‘t run as root without the -u switch
出現 can‘t run as root without the -u switch 的原因是不能以 root 使用者運行 memcached
查看目前使用者:
[[email protected] memcached]# whoamiroot
解決方案,以 nobody 身份啟動 memcached:
[[email protected] memcached]# ./bin/memcached -p 11211 -m 64 -u nobody -vvv
可以在本地使用 telnet 串連虛擬機器上的 memcached
telnet 192.168.254.100 11211
如果需要 memcached 在後台執行,可以使用
[[email protected] memcached]# ./bin/memcached -p 11211 -m 64 -u nobody -d
附:Windows(7 64位)下安裝 memcached(1.4.24)及 memcached 的常用命令
:http://wendal.net/2015/04/27.html
下載解壓,把主資料夾拷貝至任一目錄,並且重新命名為 "memcached"
①開啟 "cmd",進入該目錄:
②查看 memcached 版本和協助
D:\memcached>memcached -h
③ 安裝 memcached:
D:\memcached>memcached -d install
④ 開啟 memcached:
D:\memcached>memcached.exe -p 11211 -l 127.0.0.1 -m 64 -d start
或者
如果需要把錯誤資訊或者警告資訊在伺服器端輸出,可以:
D:\memcached\memcached.exe -m 64 -p 11211 -vvv
也就是說此時在用戶端進行的操作,伺服器端會顯示資訊:
memcached 參數說明
-p:連接埠號碼,預設11211
-l:綁定地址 ( 預設:所有都允許,無論內外網或者本機更換 IP,有安全隱患,若設定為127.0.0.1就只能本機訪問 )
-m:使用記憶體的大小,單位 mb
-d start:啟動 memcached 服務 -d restart:重起 memcached 服務 -d stop|shutdown:關閉正在啟動並執行 memcached 服務
-c:最大同時串連數,預設是1024
-v:提示資訊(在事件迴圈中列印錯誤 / 警告資訊)-vv:詳細資料(還列印用戶端命令 / 響應)-vvv:超詳細資料(還列印內部狀態的變化)
-f:增長因子(每兩個相鄰 chunk 的大小比例),預設 1.25
⑤ 本機使用 telnet 進行用戶端測試:
另外開啟一個 cmd 視窗
使用 ctrl + ] 開啟回顯功能。
具體操作
添加一個KVStore for Redis:
add 文法:
add key flag expire length
flag:可以包括索引值對的整型參數,客戶機使用它儲存關於索引值對的額外資訊(如區分儲存的值是字串,或者序列化的對象等,取值時可以做相應的處理)
expire:在緩衝中儲存索引值對的時間長度(以秒為單位,0 表示不主動清除)
length:長度,以位元組為單位
add 已經存在的 key 是不能成功的:
擷取(查詢)某個鍵的值:get key
expire 可以是秒數(n 秒後失效),也可以是時間戳記(什麼時間失效),例如:
10 秒後失效
再例如目前時間戳是:1440774503
設定 100 秒後失效:
delete 刪除索引值
replace 替換值,參數和 add 一樣:
replace 不能對不存在的鍵進行修改:
set 同時具有 add 和 replace 的功能,參數和 add 一樣:
set 命令既可以修改已經存在的鍵的值,也可以增加不存在的索引值。
incr key n :鍵 key 的值增加 n
decr key n :鍵 key 的值減少n
注意:key 的值是 32 位無符號的數
decr 應用情境:秒殺功能
下單時,有一系列的資料庫操作,如寫入訂單、更改庫存,還有事務要求,對於傳統關係型資料庫來說壓力很大。
而秒殺的操作,是先秒搶一個訂單號,餘下的例如個人收貨資訊填寫等操作可以不著急進行(可以憑藉該訂單號去另一個頁面慢慢下訂單、zhi‘fu)。發訂單號的操作就可以利用 memcached 的 decr 功能:
在記憶體中儲存一個索引值對 count 用來記錄庫存量,秒殺 n 件,則 count 的值是 n。秒殺時,對庫存進行 memcached 的 decr 操作,然後進行判斷返回的值,當返回的值大於 0,就說明搶單成功。當返回的值等於 0,活動結束。
也可以使用 incr 命令(秒殺 n 件,當 incr 返回的值等於 n 時,活動結束)。
由於搶單的主要操作都是在記憶體中進行,因此速度很快。
stats :統計
statsSTAT pid 5368 #進程號STAT uptime 3949 #持續已耗用時間STAT time 1440823276STAT version 1.4.24STAT libevent 2.0.22-stableSTAT pointer_size 32STAT rusage_user 0.202000STAT rusage_system 0.343000STAT curr_connections 10STAT total_connections 11STAT connection_structures 11STAT reserved_fds 20STAT cmd_get 4STAT cmd_set 3STAT cmd_flush 0STAT cmd_touch 0STAT get_hits 3STAT get_misses 1 # get_hits 和 get_misses 可以計算快取命中率STAT delete_misses 0STAT delete_hits 0STAT incr_misses 0STAT incr_hits 1STAT decr_misses 0STAT decr_hits 2STAT cas_misses 0STAT cas_hits 0STAT cas_badval 0STAT touch_hits 0STAT touch_misses 0STAT auth_cmds 0STAT auth_errors 0STAT bytes_read 151STAT bytes_written 172STAT limit_maxbytes 67108864STAT accepting_conns 1STAT listen_disabled_num 0STAT threads 4STAT conn_yields 0STAT hash_power_level 16STAT hash_bytes 262144STAT hash_is_expanding 0STAT malloc_fails 0STAT bytes 109STAT curr_items 2 #當前儲存的鍵的個數STAT total_items 3STAT expired_unfetched 0STAT evicted_unfetched 0STAT evictions 0STAT reclaimed 0STAT crawler_reclaimed 0STAT crawler_items_checked 0STAT lrutail_reflocked 0END
flush_all:清除所有的索引值。正在啟動並執行系統上慎用。
此時 stats 查看統計時,curr_items 顯示當前還有儲存的索引值,是因為到期所採用的是惰性失效機制。
memcached 記憶體配置機制
memcached 緩解記憶體的片段化採用 slab allocator 機制來管理記憶體:預先把記憶體劃分成若干個 slab 倉庫,每個倉庫切分成不同尺寸的小塊,需要存內容時判斷內容的大小,根據內容的大小選擇合適的倉庫。
注意:如果有 100 Byte 的資料要儲存,但 122 Byte 大小的倉庫中的 chunk 滿了,memcached 並不會尋找更大的倉庫如 144 Byte 的倉庫來儲存該資料,而是把 122 Byte 倉庫的就資料踢掉。
LRU 刪除機制
memcached 的到期資料刪除機制:
當某個值到期後,並沒有從記憶體中刪除,因此 stats 統計時,curr_items 仍然有其資訊;
當取該值的時候,判斷是否到期,如果到期,返回空,並清空,此時 curr_items 就減少了;
有過之前沒有 get 過,不會自動刪除;
只有當某個新值佔用它的位置時,當成空 chunk 來佔用。
這個到期只是讓使用者看不到資料,並沒有在到期的瞬間將其從記憶體中刪除,稱之為 lazy expriation(惰性失效機制),好處是 節省了 CPU 資源和檢測的成本。
LRU:Least Recently Used 最近最少使用。不論這個最近最少使用的值是否是永久有效,當某個新值要佔據它的位置時,它都會被踢掉。
參考:
http://www.2cto.com/os/201209/153833.html
http://blog.csdn.net/zzulp/article/details/7823511
Memcached 筆記與總結(1)Linux(CentOS 6.6) 和 Windows(7)下安裝與配置 Memcached (1.4.24)與 Memcached 基礎命令