主要介紹 Memcache 和 python的操作
1、有關Memcached的介紹
Memcached 是一個基于libevent事件驅動的高性能的分布式記憶體對象緩存系統。
它是以LiveJournal旗下Danga Interactive公司的Brad Fitzpatric為首開發的一款軟體。
它通過在記憶體中緩存資料和對象來減少讀取資料庫的次數,用于動态Web應用以減輕資料庫負載。
MemCaChe是一個存儲鍵值對的HashMap,在記憶體中對任意的資料(比如字元串、對象等)
所使用的key-value存儲,資料可以來自資料庫調用、API調用,或者頁面渲染的結果。
MemCache設計理念就是小而強大,設計促進了快速部署、易于開發并解決面對大規模的資料緩存的許多難題
而所開放的API使得MemCache能用于Java、C/C++/C#、Perl、Python、PHP、Ruby、Lua等大部分流行的程式語言。
一般适用情況:
首次通路:從RDBMS中讀取資料并存放到memcache,它不能持久化存儲,一旦斷電資料丢失。
再次通路:從memcahe中讀取資料顯示在頁面,它基于自己的算法命中讀寫速率高的資料。
區分點是:
1)基于事件驅動的網絡服務程式,監聽TCP/UDP下的11211端口
2)沒有獨立的自己指令行用戶端,通過telnet測試
3)資料不分類型,且不能持久化存儲
4)不支援使用者認證
1、如何啟用memcached服務
指令行:/usr/local/memcached/bin/memcached -h
Memcached仍然是一款網絡存儲服務程式;
啟動選項:
-d是啟動一個守護程序; -u是設定運作Memcache的使用者;
-m是配置設定給Memcache使用的記憶體數量,機關是MB,資料會自動循環更新;
-s是設定Memcache監聽的UNIXSocket檔案 -U是設定Memcache監聽的UDP端口
-l是監聽的伺服器IP位址,可以有多個位址; -p是設定Memcache監聽的TCP端口,預設11211
-c是最大運作的并發連接配接數,預設是1024; -P是設定儲存Memcache的pid檔案
-t是設定服務運作的工作線程,預設是4; -R是設定Memcache每個連接配接最大的請求數量
用戶端使用簡單的telnet測試:(沒有自己的用戶端指令行)
執行個體: Memcached 服務運作的主機為 127.0.0.1(本機) 、端口為 11211。
telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
set foo 0 0 3 結果
get foo 取得指令
quit 退出
2、Memcache簡單操作
1)set子指令
Memcached set 指令用于将 value(資料值) 存儲在指定的 key(鍵) 中。
如果set的key已經存在,該指令可以更新該key所對應的原來的資料。
文法:set key flags exptime bytes [noreply]
value
參數說明如下:
key:鍵值 key-value 結構中的 key,用于查找緩存值。
flags:可以包括鍵值對的整型參數,客戶機使用它存儲關于鍵值對的額外資訊 。
exptime:在緩存中儲存鍵值對的時間長度(以秒為機關,0 表示永遠)
bytes:在緩存中存儲的位元組數
noreply(可選): 該參數告知伺服器不需要傳回資料
value:存儲的值(始終位于第二行)(可直接了解為key-value結構中的value)
2)add子指令
Memcached add 指令用于将 value(資料值) 存儲在指定的 key(鍵) 中。
如果 add 的 key 已經存在,則不會更新資料(過期的 key 會更新)。
文法:add key flags exptime bytes [noreply]
value
3)replace子指令
Memcached replace 指令用于替換已存在的 key(鍵) 的 value(資料值)。
如果 key 不存在,則替換失敗,并且您将獲得響應 NOT_STORED。
文法:replace key flags exptime bytes [noreply]
4)append子指令
Memcached append 指令用于向已存在 key(鍵) 的 value(資料值) 後面追加資料 。
文法:append key flags exptime bytes [noreply]
5)prepend指令
Memcached prepend 指令用于向已存在 key(鍵) 的 value(資料值) 前面追加資料 。
文法:prepend key flags exptime bytes [noreply]
bytes:在緩存中存儲的位元組數(這個必須準确)
6)sas子指令
Memcached CAS(Check-And-Set 或 Compare-And-Swap) 指令用于執行一個"檢查并設定"的操作
它僅在目前用戶端最後一次取值後,該key 對應的值沒有被其他用戶端修改的情況下,才能夠将值寫入。
檢查是通過cas_token參數進行的,這個參數是Memcach指定給已經存在的元素的一個唯一的64位值。
文法:cas key flags exptime bytes unique_cas_token [noreply]
unique_cas_token通過 gets 指令擷取的一個唯一的64位值。
7)get子指令
Memcached get 指令擷取存儲在 key(鍵) 中的 value(資料值) ,如果 key 不存在,則傳回空。
文法:get key
多個 key 使用空格隔開,比如:get key1 key2 key3
8)gets子指令
Memcached gets 指令擷取帶有 CAS 令牌存 的 value(資料值) ,如果 key 不存在,則傳回空。
文法:gets key
多個 key 使用空格隔開,如下:gets key1 key2 key3
9)delete指令
Memcached delete 指令用于删除已存在的 key(鍵)。
文法:delete key [noreply]
10)自增自減指令
Memcached incr 與 decr 指令用于對已存在的 key(鍵) 的數字值進行自增或自減操作。
incr 與 decr 指令操作的資料必須是十進制的32位無符号整數。
如果 key 不存在傳回 NOT_FOUND,如果鍵的值不為數字,則傳回 CLIENT_ERROR,其他錯誤傳回 ERROR。
incr 指令
文法:incr key increment_value
increment_value: 增加的數值。
11)stats子指令
Memcached stats 指令用于傳回統計資訊例如 PID(程序号)、版本号、連接配接數等。
文法:stats
傳回如下資訊:
pid: memcache伺服器程序ID uptime:伺服器已運作秒數
time:伺服器目前Unix時間戳 version:memcache版本
pointer_size:作業系統指針大小 rusage_user:程序累計使用者時間
rusage_system:程序累計系統時間 curr_connections:目前連接配接數量
total_connections:Memcached運作以來連接配接總數 connection_structures:Memcached配置設定的連接配接結構數量
cmd_get:get指令請求次數 cmd_set:set指令請求次數 cmd_flush:flush指令請求次數
get_hits:get指令命中次數 get_misses:get指令未命中次數
delete_misses:delete指令未命中次數 delete_hits:delete指令命中次數
incr_misses:incr指令未命中次數 incr_hits:incr指令命中次數
decr_misses:decr指令未命中次數 decr_hits:decr指令命中次數
cas_misses:cas指令未命中次數 cas_hits:cas指令命中次數
cas_badval:使用擦拭次數 auth_cmds:認證指令處理的次數
auth_errors:認證失敗數目 bytes_read:讀取總位元組數
bytes_written:發送總位元組數 limit_maxbytes:配置設定的記憶體總大小(位元組)
accepting_conns:伺服器是否達到過最大連接配接(0/1) listen_disabled_num:失效的監聽數
threads:目前線程數 conn_yields:連接配接操作主動放棄數目 bytes:目前存儲占用的位元組數
curr_items:目前存儲的資料總數 total_items:啟動以來存儲的資料總數
evictions:LRU釋放的對象數目 reclaimed:已過期的資料條目來存儲新資料的數目
12)stats items指令
Memcached stats items 指令用于顯示各個 slab 中 item 的數目和存儲時長(最後一次通路距離現在的秒數)。
文法:stats items
13)stats slabs指令
Memcached stats slabs 指令用于顯示各個slab的資訊,包括chunk的大小、數目、使用情況等。
文法:stats slabs
14)stats sizes指令
Memcached stats sizes 指令用于顯示所有item的大小和個數。
該資訊傳回兩列,第一列是 item 的大小,第二列是 item 的個數。
文法:stats sizes
15)fLush_all指令
Memcached flush_all 指令用于清理緩存中的所有 key=>value(鍵=>值) 對。
該指令提供了一個可選參數 time,用于在制定的時間後執行清理緩存操作。
文法:flush_all [time] [noreply]
3、Memcached的python操作
memcaache支援py驅動,需要封裝這樣一個架構
使用第三方庫:from pymemcache.client import Client
支援類包括
client (package)
exceptions
fallback
pool
serde
test (package)
1)連接配接資料庫:dbobj = Client(((hostname, port)), connect_timeout=None )
2)資料庫操作:dir(dbobj) 庫所有可用方法
關閉連接配接:dbobj.close()
3)由于memcache屬于NoSQL,沒有表、集合、記錄、文檔等概念
是以:得到 dbobj 對象後,支援所有Memcached的子指令,以函數形式實作執行個體:
dbobj.set("name", "liuliu"); ==> 設定一個名字的key
dbobj.add( key, value) ==> 給隻存在key的資料指派,如果存在donothing
dbobj.append( key, value) ==> 給存在的key末尾追加資料
dbobj.prepend( key, value) ==> 給存在的key首部增加資料