前戲
Memcached是一個高性能的分布式內存對象緩存系統,用于動態Web應用以減輕數據庫負載。它通過在內存中緩存數據和對象減少讀取數據庫的次數,從而減小數據庫的壓力,提高動態,數據庫網站的速度。Memcached基于一個存儲 鍵/值對的hashmap。其守護進程是用C編寫的,但是客戶端可以用任何語言來編程,并通過Memcached協議和守護進程通信。
Memcached安裝及基本使用
? Memcached服務端的安裝
#依賴libevent,先安裝
yum install libvent-devel*
#用wget去http://memcached.org下載最新源碼
tar -zxvf memcached-1.4.29.tar.gz
#編譯安裝
./configure && make && make test && sudo make install
? Memcached的啟動
memcached -d -m 10 -u root -p 12000 -c 256 -P /tmp/memcached.pid參數概述:-d 啟動一個線程;-m 分配給Memcached使用的內存數量,單位是MB;-u 運行Memcached的用戶;-l 監聽的服務器IP地址(可選)-p 設置Memcache監聽的端口,最好是1024以上的端口;-c 最大運行的并發連接數,默認是1024,按照服務器的負載量來設定-P 設置保存Memcached的pip文件
Memcached的基本操作命令
memcached的操作分為三類:存儲操作: setaddreplaceappendprependcas獲取操作:getgets其他命令:deletestats
使用python操作Memcached
在python中使用Memcached,首先安裝memcache:install python-memcached
連接使用
import memcachem = memcache.Client(['192.168.12.12:8800'],debug=True)
m.set('liu','qingyang')
res = m.get('liu')
print(res)
#打印qingyang
#debug=True表示運行錯誤時,顯示錯誤信息,生產環境中不需要
集群支持
python-memcached模塊支持集群操作。就是在內存維護一個主機列表,而且集群中主機的權重值與主機在列表中出現的次數成正比。
主機 權重
192.0.0.1 1
192.0.0.2 2
192.0.0.3 1
#內存主機列表:HostList = ["192.0.0.1","192.0.0.2","192.0.0.2","192.0.0.3"]
set操作
#set:設置一個鍵值對,如果key不存在,就創建;如果存在,就更新value;
#set_multi:設置多個鍵值對,如果key不存在,就創建;如果存在,就更新values。import memcache
m = memcache.Client(["192.0.0.1:8800"],debug=True)
m.set('liu',111)
m.set_mulit({'liu':111,'wu':222})
get操作
#get 獲取一個鍵值對
#get_multi 獲取多個鍵值對import memcachem = memcache.Client(['192.0.0.1:8800'],debug=True)
print(m.get('liu'))
print(m.get_multi(['liu','wu']))
add操作
#add 添加一個鍵值對,如果key已經存在,操作將會報錯:MemCached: while expecting 'STORED', got unexpected response 'NOT_STORED'
#add 和 set 都是存儲操作,但是set可以更新value,add不可以。
import memcachem = memcache.Client(['192.0.0.1:8800'],debug=True)
m.set('liu','111')
m.add('wu',222) #如果已經存在'wu'的key,會報錯
replace操作
#replace 替換,修改key的值,如果key不存在,則報錯:MemCached: while expecting 'STORED', got unexpected response 'NOT_STORED'
import memcachem=memcache.Client(['192.0.0.1:8800'],debug=True)
m.replace('liu',222)
m.replace('li',333) #如果不存在'li'的key,會報錯
delete操作
#delete 刪除指定的一個鍵值對,如果沒有指定的key,不會報錯
#delete_multi 刪除多個鍵值對
import memcachem=memcache.Client(['192.0.0.1:8800'],debug=True)
m.delete('liu')
m.delete('wu')
m.delete_multi(['liu','wu'])
append,prepend操作
#append:修改指定key的值,在值的后面追加數據,無指定key會報異常
#prepend:修改指定key的值,在值的前面插入數據
import memcachem=memcache.Client(['192.0.0.1:8800'],debug=True)
m.append('cc','dd')
m.append('ds','dsdsds') #不存在ds,會報異常m.prepend('cc','aa')
decr,incr操作
#incr:自增,將Memcached中的某一個值增加N,(N默認為1),如果值非數字,會報錯
#decr:自減,將Memcached中的某一個值減少N,(N默認為1),如果值非數字,會報錯
import memcachem=memcache.Client(['192.0.0.1:8800'],debug=True)
m.incr('liu')
m.decr('liu',30)
gets cas使用
#為了避免在生產環境中產生臟數據,使用gets和cas,類似MySQL中的事務
import memcachemc=memcache.Client(['192.0.01:8800'],debug=True)
m.set('count',999)
print(m.gets('count'))
# 如果有人在gets之后和cas之前修改了product_count,那么,下面的設置將會執行失敗,拋出異常,從而避免非正常數據的產生
m.cas('count',998)
#cas也能創建一個不存在key的鍵值對
m.cas('w',90)
print(m.gets('w'))
#每次執行gets時,會從memcache中獲取一個自增的數字,通過cas去修改gets的值時,會攜帶之前獲取的自增值和memcache中的自增值進行比較,如果相等,則可以提交,如果不想等,那表示在gets和cas執行之間,又有其他人執行了gets(獲取了緩沖的指定值), 如此一來有可能出現非正常數據,則不允許修改。
?memcached和redis的區別
1、 Redis和Memcache都是將數據存放在內存中,都是內存數據庫。不過memcache還可用于緩存其他東西,例如圖片、視頻等等。
2、Redis不僅僅支持簡單的k/v類型的數據,同時還提供list,set,hash等數據結構的存儲。
3、虛擬內存–Redis當物理內存用完時,可以將一些很久沒用到的value 交換到磁盤
4、過期策略–memcache在set時就指定,例如set key1 0 0 8,即永不過期。Redis可以通過例如expire 設定,例如expire liu 111
5、分布式–設定memcache集群,利用magent做一主多從;redis可以做一主多從。都可以一主一從
6、存儲數據安全–memcache掛掉后,數據沒了;redis可以定期持久化
7、災難恢復–memcache掛掉后,數據不可恢復; redis數據丟失后可以通過aof恢復
8、Redis支持數據的備份,即master-slave模式的數據備份。