1、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不互相通信的分布式
2、Memcached安裝和基本使用
Memcached 支持許多平台:Linux、FreeBSD、Solaris、Mac OS,也可以安裝在Windows上。
linux系統安裝memcached首先要安裝Libevent庫:
sudo apt-get install libevent libevent-deve 自動下載安裝(Ubuntu/Debian) yum install libevent libevent-devel 自動下載安裝(Redhat/Fedora/Centos)
安裝memcached:
sudo apt-get install memcached #ubuntu/debian yum install memcached #redhat/fedora/centos portmaster databases/memcached #freeBSD
memcached命令的運行:
$ /usr/local/memcached/bin/memcached -h #獲得幫助
如果使用自動安裝memcached命令位於/usr/local/bin/memcached。
啟動選項:
-p <num> TCP監聽端口(default: 11211)
-U <num> UDP監聽端口(default: 11211, 0 is off)
-s <file> UNIX套接字路徑偵聽
-a <mask> UNIX套接字的訪問掩碼,八進制(默認值:0700)
-l <addr> 偵聽接口地址默認為所以地址可以指定主機加端口可以使用逗號分隔多個地址
-d 作為守護進程運行
-r 最大文件描述符
-u <username> 指定運行用戶
-m <num> 最大內存(默認為64 MB)
-M 內存耗盡時返回錯誤而不刪除項目
-c <num> 最大同時連接數默認為1024
-k 鎖定所有分頁內存
-v 顯示錯誤或警告事件
-vv 相信錯誤
-vvv 詳細錯誤信息及內部狀態轉換
-h 打印此幫助
-i 打印內存緩存和許可證
-P <file> 指定PID文件,只與-d選擇一起使用
-f <factor> 塊大小生長因子,默認值為1.25
-n <bytes> 為鍵值標志的最小空間,默認為48
-L 使用大內存頁,增加的內存頁大小可以減少TLB命中數提高性能
-D <char> 使用<char>作為密鑰前綴和IDS之間的分隔符
-t <num> 使用的線程數,默認為4
-R 每個事件的最大請求數默認為20
-C 禁用CAS的使用
-b <num> 設置積壓隊列限制默認值1024
-B 綁定協議——ASCII、二進制或AUTO(默認)之一
-I 重寫每個板頁的大小。調整最大項目大小(默認值:1MB,MI:1K,MAX:128M)
-S 打開SASL認證
-o 逗號分隔的擴展或實驗選項列表
[root@python bin]# memcached -d -m 1024 -u nobody -l 192.168.146.129 -p 11211 -c 2048 -P /tmp/memcached.pid [root@python bin]# netstat -lntup|grep 11211 tcp 0 0 192.168.146.129:11211 0.0.0.0:* LISTEN 42059/memcached udp 0 0 192.168.146.129:11211 0.0.0.0:* 42059/memcached
memcached存儲命令:
set命令用於將value存儲在指定的key鍵中,如果set的key已經存儲,該命令可更新該key所對應的原來數據,實現更新的作用
set key flags exptime bytes [noreply]
key:鍵值key-value結構中的key,用於查找緩存值
flags:可以包括鍵值對的整理參數,客戶機使用它存儲關於鍵值對的額外信息
exptime:在緩存中保存鍵值對的時間長度,以秒為單位0表示永遠
bytes:在存儲中存儲的字節數
noreply:該參數告知服務器不需要返回數據
value:存儲的值
set www 0 0 9 panjiayua STORED get www VALUE www 0 9 panjiayua END
add 命令用於將 value(數據值) 存儲在指定的 key(鍵) 中
add web 0 0 5 junai STORED
replace 命令用於替換已存在的 key(鍵) 的 value(數據值)
replace web 0 0 5 aijun STORED get web VALUE web 0 5 aijun END
append 命令用於向已存在 key(鍵) 的 value(數據值) 后面追加數據
append web 0 0 9 1314 STORED get web VALUE web 0 9 aijun1314
prepend 命令用於向已存在 key(鍵) 的 value(數據值) 前面追加數據
prepend web 0 0 2 im STORED get web VALUE web 0 11 imaijun1314 END
memcached查找命令:
get 命令獲取存儲在 key(鍵) 中的 value(數據值) ,如果 key 不存在,則返回空
gets 命令獲取帶有 CAS 令牌存 的 value(數據值) ,如果 key 不存在,則返回空
delete 命令用於刪除已存在的 key(鍵)
incr 與 decr 命令用於對已存在的 key(鍵) 的數字值進行自增或自減操作
memcached統計命令:
stats 命令用於返回統計信息例如 PID(進程號)、版本號、連接數等
stats items 命令用於顯示各個 slab 中 item 的數目和存儲時長(最后一次訪問距離現在的秒數)
stats slabs 命令用於顯示各個slab的信息,包括chunk的大小、數目、使用情況等
stats sizes 命令用於顯示所有item的大小和個數;該信息返回兩列,第一列是 item 的大小,第二列是 item 的個數
flush_all 命令用於清理緩存中的所有 key=>value(鍵=>值) 對;該命令提供了一個可選參數 time,用於在制定的時間后執行清理緩存操作
3、python操作memcached
import memcache #鏈接memcached服務器,指定IP和端口,debug表示顯示錯誤信息 mc = memcache.Client(['192.168.146.129:11211'],debug=True) #設置鍵值對 mc.set('foo','pythonTomemcache') #查看鍵值 print(mc.get('foo'))
add:添加一個鍵值對,如果存在key,重復執行add則異常
mc.add('k1','v1')
replace: 修改某個key的值,如果key不存在,則異常
mc.replace('k2','v2')
set:設置一個鍵值對,如果key不存在,則創建,如果key存在則修改
mc.set('k3','v3')
set_multi:設置多個鍵值對,如果key不存在,則創建,如果key存在,則修改
mc.set_multi({'key1':'value1','key2':'value2'})
delete:在memcached中刪除指定的一個鍵值對
mc.delete('key1')
delete_multi:在memcached中刪除指定的多個鍵值對
mc.delete_multi(['key1','key2','key3'])
get:獲取一個鍵值對
get_multi:獲取多個鍵值對
mc.get('key3') mc.get_multi(['key1','key2'])
append:修改指定key的值,在該值后面追加內容
prepend:修改指定key的值,在該值前面插入內容
mc.append('k1','after') mc.prepend('k2','before')
incr:自增,將memcached中的某個值增加N(默認為1)
decr:自減,將memcached中的某分值減少N(默認為1)
mc.set('k1',10) mc.incr('k1',2) print(mc.get('k1')) mc.decr('k1',3) print(mc.get('k1'))
gets:gets 命令獲取帶有 CAS 令牌存 的 value(數據值) ,如果 key 不存在,則返回空
cas:執行一個檢查並設置的操作,它僅在當前客戶端最后一次取值后,該Key對應的值沒有被其他客戶端修改的情況下, 才能夠將值寫入。
mc.cas('key5','999') print(mc.gets('key5'))
------------------------------------------------------------