memcached介紹
Memcached是一個自由開源的,高性能,分佈式內存對象緩存系統。
Memcached是以LiveJournal旗下Danga Interactive公司的Brad Fitzpatric爲首開發的一款軟件。現在已成爲mixi、hatena、Facebook、Vox、LiveJournal等衆多服務中提高Web應用擴展性的重要因素。
Memcached是一種基於內存的key-value存儲,用來存儲小塊的任意數據(字符串、對象)。這些數據可以是數據庫調用、API調用或者是頁面渲染的結果。
Memcached簡潔而強大。它的簡潔設計便於快速開發,減輕開發難度,解決了大數據量緩存的很多問題。它的API兼容大部分流行的開發語言。
本質上,它是一個簡潔的key-value存儲系統。
一般的使用目的是,通過緩存數據庫查詢結果,減少數據庫訪問次數,以提高動態Web應用的速度、提高可擴展性。
memcached分佈式緩存服務器的特點:協議簡單、基於libevent的事件處理、內置內存存儲方式、memcached不互相通信的分佈式
libevent官網:https://libevent.org/old-releases.html#2.0
#下載libevent
wget https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz
#編譯安裝
tar -xvf libevent-2.0.21-stable.tar.gz
cd ibevent-2.0.21-stable
./configure --prefix=/usr/local/libevent-2.0.21-stable --libdir=/usr/lib64
make
make install
#檢查是否安裝成功
ls -al /usr/local/libevent-2.0.21-stable/lib | grep libevent
#安裝
yum install memcached
#查看幫助信息
memcached -h
-p <num> 監聽的端口
-l <ip_addr> 連接的IP地址, 默認是本機
-d start 啓動memcached 服務
-d restart 重起memcached 服務
-d stop|shutdown 關閉正在運行的memcached 服務
-d install 安裝memcached 服務
-d uninstall 卸載memcached 服務
-u <username> 以<username>的身份運行 (僅在以root運行的時候有效)
-m <num> 最大內存使用,單位MB。默認64MB
-M 內存耗盡時返回錯誤,而不是刪除項
-c <num> 最大同時連接數,默認是1024
-f <factor> 塊大小增長因子,默認是1.25
-n <bytes> 最小分配空間,key+value+flags默認是48
-h 顯示幫助
#啓動memcached
memcached -d -m 1024 -u root -p 11211 -P /tmp/memcached.pid
yum install telnet
格式<command name> <key> <flags> <exptime> <bytes>
<command name>的值可以是set,add,replace,append,prepend。
<key>此處的值是mykey
<flags>是一個任意的16-bit的無符號number。我們這裏給的值是0
<exptime>指定過期時間,0代表永遠不會過期。如果非0,則當過了過期時間就無法獲取它。
<bytes>存的值的長度。這裏給的值是16,就是I Love Memcached的字符個數。
[root@localhost ~]# telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
set mykey 0 300 16
I Love Memcached
STORED
get mykey
VALUE mykey 0 16
I Love Memcached
END
quit
Connection closed by foreign host.
[root@localhost ~]#
#安裝
pip3 install python3-memcached
測試腳本
import memcache mc = memcache.Client(['127.0.0.1:11211'], debug=0) print("\n") #添加值 #add添加一個鍵值對,如果存在key,重複執行add則異常 mc.add("key0", "value0") print('mc.add("key0", "value0")',"->",mc.get("key0")) mc.add("key0", "value00") print('mc.add("key0", "value0")',"->",mc.get("key0")) print("\n") #設置值 #set設置一個鍵值對,如果key不存在,則創建,如果key存在則修改 mc.set("key1", "value1") print('mc.set("key1", "value1")',"->",mc.get("key1")) print("\n") #設置多個值 #set_multi設置多個鍵值對,如果key不存在,則創建,如果key存在,則修改 mc.set_multi({'key11':'value11','key21':'value21'}) print("mc.set_multi({'key11':'value11','key21':'value21'})","->",mc.get("key11"),mc.get("key21")) print("\n") #獲取多個鍵值對 print("mc.get_multi(['key11','key21'])","->",mc.get_multi(['key11','key21'])) print("\n") #修改 #append:修改指定key的值,在該值後面追加內容 #prepend:修改指定key的值,在該值前面插入內容 mc.append('key11','after') mc.prepend('key21','before') print("mc.append('key11','after')-mc.prepend('key21','before')","->",mc.get_multi(['key11','key21'])) print("\n") #刪除多個值 #delete_multi在memcached中刪除指定的多個鍵值對 mc.delete_multi(['key11','key21']) print("mc.delete_multi(['key11','key21'])","->",mc.get("key11"),mc.get("key21")) print("\n") #獲取多個鍵值對 print("mc.get_multi(['key11','key21'])","->",mc.get_multi(['key11','key21'])) print("\n") #刪除值 #delete在memcached中刪除指定的一個鍵值對 mc.set("key2", 3) print('mc.set("key2", 3)',"->",mc.get("key2")) mc.delete("key2") print('mc.delete("key2")',"->",mc.get("key2")) print("\n") #增加減少值 #incr:自增,將memcached中的某個值增加N(默認爲1)mc.incr('k1',2) #decr:自減,將memcached中的某分值減少N(默認爲1)mc.decr('k1',3) mc.set("key3", "1") print('mc.set("key3", "1")') mc.incr("key3") print('mc.incr("key3")',"->",mc.get("key3")) mc.decr("key3") print('mc.decr("key3")',"->",mc.get("key3")) print("\n") #替換值 #replace修改某個key的值,如果key不存在,則異常 mc.set("key4", "1") print('mc.set("key4", "1")',"->",mc.get("key4")) mc.replace('key4','v4') print('mc.replace("key4","v4")',"->",mc.get("key4")) print("\n") #cas:執行一個檢查並設置的操作,它僅在當前客戶端最後一次取值後,該Key對應的值沒有被其他客戶端修改的情況下, 才能夠將值寫入。 mc.cas('key5','999') print("mc.cas('key5','999')","->",mc.get("key5")) print("\n") #gets:gets 命令獲取帶有 CAS 令牌存 的 value(數據值) ,如果 key 不存在,則返回空 print("mc.gets('key5')",mc.gets('key5'))
輸出
[root@localhost ~]# python3 test_mem.py mc.add("key0", "value0") -> value0 mc.add("key0", "value0") -> value0 mc.set("key1", "value1") -> value1 mc.set_multi({'key11':'value11','key21':'value21'}) -> value11 value21 mc.get_multi(['key11','key21']) -> {'key11': 'value11', 'key21': 'value21'} mc.append('key11','after')-mc.prepend('key21','before') -> {'key11': 'value11after', 'key21': 'beforevalue21'} mc.delete_multi(['key11','key21']) -> None None mc.get_multi(['key11','key21']) -> {} mc.set("key2", 3) -> 3 mc.delete("key2") -> None mc.set("key3", "1") mc.incr("key3") -> 2 mc.decr("key3") -> 1 mc.set("key4", "1") -> 1 mc.replace("key4","v4") -> v4 mc.cas('key5','999') -> 999 mc.gets('key5') 999 [root@localhost ~]#