天天看點

(17)Py中間件memcache

主要介紹 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首部增加資料