目錄
EhCache和Guava Cache雖然簡單、高效,但是它們都是本地緩存(EhCache可以分佈式部署,但是需要依賴Terracotta,顯然不利於維護),一般只是用在單個應用程序實例內部。在實際的分佈式系統中,緩存更多地用於緩存數據庫的熱點數據,以減輕數據庫負擔,常用的分佈式緩存有Redis和Memcached。MemCached是一個開源、高性能的分佈式內存對象緩存系統,在許多互聯網公司都有應用。
1.安裝
Memcached可以運行在Linux和Windows平臺上,這裏以Linux爲例。首先需要去官網下載安裝包(目前最新的是1.5.12版本):
wget https://memcached.org/latest
然後解壓:
tar -zxvf memcached-1.5.12.tar.gz
此時還不能進行安裝,需要先安裝依賴組件libevent-dev:
sudo apt-get install libevent-dev
然後進入解壓後的目錄,執行configure文件,這裏按照官方示例,只配置了prefix屬性,即安裝目錄:
./configure --prefix=/usr/local/memcached
在memcached安裝包解壓後的目錄下運行以下命令可以查看configure文件的所有可配置項:
./configure --help
然後使用make進行編譯和安裝:
make && sudo make install
由於Memcached沒有自動加環境變量,這裏我們在~/.bashrc中配置一下別名:
sudo vim ~/.bashrc
在文件中輸入 alias memcached="/usr/local/memcached/bin/memcached"並保存退出。最後刷新一下配置:
source ~/.bashrc
現在可以使用 memcached -h 命令驗證是否安裝成功,如果能夠成功輸出幫助信息,說明安裝已經成功。
2.使用
2.1 常用選項
首先來看一下memcached提供的一些常用選項。
- -p port 或 --port=<port>:指定監聽的TCP端口,默認11211(粗斜體代表可替換內容,下同)
- -U port 或 --udp-port=<port>:指定監聽的UDP端口,默認爲0,即不開啓
- -l host 或 --listen=<host>:指定監聽的主機IP地址,如果是本機可以不寫
- -u user 或 --user=<user>:設置運行Memcached實例的用戶
- -m limit 或 --memory-limit=<limit>:設置存儲數據用的內存容量(不包括Memcached本身佔用的),單位MB
- -c num 或 --conn-limit=<num>:設置最大連接數,默認1024
- -M 或 --disable-evictions:禁用自動緩存清除(LRU策略),在內存不足時報錯
- -P file 或 --pidfile=<file>:將進程PID保存到文件中,必須配合-d選項(開啓後臺模式)使用
- -t num 或 --threads=<num>:設置Memcached線程數,和Redis不同,Memcached支持多線程,默認爲4,建議設置爲和本機CPU數量一致
- -L 或 --enable-largepages:啓用大內存頁,可以提高性能
- -f num 或 --slab-growth-factor=<num>:增長因子,默認1.25
- -R 或 --max-reqs-per-event:單個事件的最大連接數,默認20
- -C 或 --disable-cas:禁用CAS命令,可以減少開銷
除此之外還有很多命令,此外,-o 或 --extended 選項還有很多擴展選項,不做詳細介紹了。
下面是一個啓動Memcached實例的命令:
memcached -d -m 512 -u root -P /usr/local/memcached/memcached.pid
啓動之後可以通過 ps -el 看到memcached進程在運行。和Redis不同,Memcached沒有提供客戶端程序,而是需要使用telnet進行連接:
ubuntu@VM-0-6-ubuntu:~$ telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
2.2 命令格式
Memcached命令的基本格式如下:
command key flags exptime bytes value
含義爲:
- command:操作命令,有set、add、get、delete等
- key:緩存數據的鍵,最大長度250個字符
- flags:用於標識數據序列化格式
- exptime:緩存數據的存活時間,單位爲秒,0代表不過期
- bytes:緩存數據的大小,單位爲字節
- value:緩存數據的值
2.3 命令
1) set
set命令用來將數據值存儲到指定的key中,如果key已存在,則進行更新。設置成功後,會返回STORED。該命令有一個額外的可選選項:noreply,表示不需要服務器返回數據。下面是測試的例子(爲了方便閱讀,在每組命令之間多打了一個空行,實際是沒有的):
set userid 0 0 5
00001
STORED
get userid
VALUE userid 0 5
00001
END
set userid 0 0 5 noreply
00002
get userid
VALUE userid 0 5
00002
END
如果保存失敗,會輸出ERROR
2) get
get命令可以獲取單個或多個key關聯的值,上面的例子中演示了單個key的獲取,多個key的格式如下:
get key1 key2 ...
3) add
add類似於set,只是如果要設置的key已經存在,則不會更新值,拿Java中的Map來比較,set就是put方法,add就是putIfAbsent方法。命令格式和set也一樣。
4) replace
replace僅用於更新值,如果要更新的key不存在,則返回NOT_STORED,否則返回STORED
5)append、prepend
append用於向已存在的數據後面追加值,prepend則相反,用於在數據前面追加值:
add userid 0 0 5
00001
STORED
append userid 0 0 5
00002
STORED
get userid
VALUE userid 0 10
0000100002
END
append或pretend時,bytes字段只需要計算追加部分的長度即可,不需要計算總長度
6)delete
delete命令用於刪除指定的緩存數據,數據不存在則返回NOT_FOUND,刪除成功返回DELETED,失敗返回ERROR
7)incr/decr
incr/decr命令可以對數字值進行修改,令其增大或減少指定數量,命令格式如下:
incr key increment
decr key decrement
示例:
add usercount 0 0 1
1
STORED
incr usercount 100
101
get usercount
VALUE usercount 0 3
101
END
可以看到,如果增加/減少成功,會返回新的數值,並且會自動增大緩存數據的長度,如果key不存在,則返回NOT_FOUND,如果key對應的value不是數值,則返回CLIENT_ERROR,其他錯誤返回ERROR。
8)CAS操作:cas、gets
CAS是併發領域的常見概念,其原理不需要多介紹。Memcached的cas命令就是在沒有其他客戶端寫入的情況下才進行值的寫入,命令格式如下:
cas key flags exptime bytes version
value
這裏的versiob需要使用gets命令來獲取,gets和get命令使用基本一致,只是返回內容多了一列,即version。完整示例如下:
gets usercount
VALUE usercount 0 3 16
201
END
cas usercount 0 0 3 16
300
STORED
get usercount
VALUE usercount 0 3
300
END
9)統計
統計命令有四個:stats(輸出服務器信息)、stats items(輸出各slabs中緩存元素的數目及最後一次訪問後過去的時間)、stats slabs(顯示slab的信息,如chunk大小、數目、佔用及空閒情況、命中情況等)、stats sizes(顯示所有item的大小和個數)
10)清理
Memcached提供了flush_all命令,可以清除所有緩存數據,還允許延時操作,其命令格式如下:
flush_all [time] [noreply]
time表示多少時間後再執行清除操作,是一個數字,單位爲秒