memcached
Memcached 是一個高性能的分布式內存對象緩存系統,用於動態Web應用以減輕數據庫負載。它通過在內存中緩存數據和對象來減少讀取數據庫的次數,從而提高動態、數據庫驅動網站的速度。Memcached基於一個存儲鍵/值對的hashmap。其守護進程(daemon )是用C寫的,但是客戶端可以用任何語言來編寫,並通過memcached協議與守護進程通信。
memcached啟動: memcached -d -m 10 -u root -l 192.168.1.100 -p 45555-c 256 -P /tmp/memcached.pid 參數說明: -d 是啟動一個守護進程 -m 是分配給Memcache使用的內存數量,單位是MB -u 是運行Memcache的用戶 -l 是監聽的服務器IP地址 -p 是設置Memcache監聽的端口,最好是1024以上的端口 -c 選項是最大運行的並發連接數,默認是1024,按照你服務器的負載量來設定 -P 是設置保存Memcache的pid文
1 #服務端安裝memcached,本地安裝對應api模塊 2 #在python中調用模塊 3 import memcache 4 #建立鏈接對應ip端口 5 mc = memcache.Client(['192.168.1.100:45555'], debug=True) 6 #修改值,存在修改,不存在添加 7 mc.set("foo", "bar") 8 #根據key獲取value值 9 ret = mc.get('foo') 10 print ret 11 >>>bar
1 import memcache 2 3 #支持多個集群根據權重去對應集群中獲取值 4 mc = memcache.Client([('1.1.1.1:12000', 1), ('1.1.1.2:12000', 2), ('1.1.1.3:12000', 1)], debug=True) 5 6 #修改值存在修改,不存在添加 7 mc.set('k1', 'v1') 8 9 #添加紀錄 10 mc.add('k2','v2') 11 mc.add('k2','v2')#報錯 12 13 如果memcache中存在kkkk,則替換成功,否則一場 14 15 #替換值如果存在則修改,存在報異常 16 mc.replace('kkkk','999') 17 18 #設置多個鍵值對 19 mc.set_multi({'k3': 'v3', 'k4': 'v4'}) 20 21 #刪除值 22 mc.delete('k1') 23 24 #批量刪除 25 mc.delete_multi(['k1', 'k2']) 26 27 #根據key獲取值 28 val = mc.get('k1') 29 30 #批量獲取值 31 item_dict = mc.get_multi(["k1", "k2", "k3"]) 32 33 #根據key在value后面追加值 34 mc.append('k1', 'after') 35 # k1 = "v1after" 36 37 #根據key在value前面追加值 38 mc.prepend('k1', 'before') 39 # k1 = "beforev1after" 40 41 #incr,根據key將value的值自增1 42 mc.incr('k1') 43 #decr ,根據key將value的值自減1 44 mc.decr ('k1')
#為了避免多個用戶同時修改提交數據導致數據不一致 mc = memcache.Client(['192.168.1.100:45555'],debug=True,cache_cas=True) v = mc.gets('product_count') print(v) mc.cas('product_count','111')#報錯 #gets與cas中間修改值得話會報錯 mc.cas('product_count','889')
redis
redis是一個key-value存儲系統。和Memcached類似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支持各種不同方式的排序。與memcached一樣,為了保證效率,數據都是緩存在內存中。區別的是redis會周期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,並且在此基礎上實現了master-slave(主從)同步。
redis與memcache比較
1 Redis不僅僅支持簡單的k/v類型的數據,同時還提供list,set,hash等數據結構的存儲,memcached只支持一種數據類型。
2 Redis支持數據的備份,即master-slave模式的數據備份。
3 Redis支持數據的持久化,可以將內存中的數據保持在磁盤中,重啟的時候可以再次加載進行使用。
啟動服務端
src
/
redis
-
server
啟動客戶端
src/redis-cli
1 #調用redis模塊 2 import redis 3 #鏈接redis服務端 4 r = redis.Redis(host='192.168.1.100', port=41111) 5 #修改值 6 r.set('foo', 'Bar') 7 #獲取值 8 print r.get('foo') 9 >>>'Bar' 10 11 #redis-py使用connection pool來管理對一個redis server的所有連接,避免每次建立、釋放連接的開銷。默認,每個Redis實例都會維護一個自己的連接池。可以直接建立一個連接池,然后作為參數Redis,這樣就可以實現多個Redis實例共享一個連接池。 12 import redis 13 pool = redis.ConnectionPool(host='192.168.1.100', port=41111) 14 r = redis.Redis(connection_pool=pool) 15 r.set('foo', 'Bar') 16 print r.get('foo') 17 #set(name, value, ex=None, px=None, nx=False, xx=False) 18 #在Redis中設置值,默認,不存在則創建,存在則修改 19 #參數: 20 # ex,過期時間(秒) 21 # px,過期時間(毫秒) 22 # nx,如果設置為True,則只有name不存在時,當前set操作才執行 23 # xx,如果設置為True,則只有name存在時,當前set操作才執行 24 25 #mset批量設置值 26 mset(k1 = 'v1' ,k2 = 'v2') 27 mget({'k1':'v1','k2':'v2'}) 28 29 #get(name)獲取值 30 get('k1') 31 32 #mget(keys,args)批量獲取 33 mget('k1','k2') 34 35 #getset設置新值並獲取原來的值 36 #getrange(key,start,end)獲取子序列 37 set('k1','liguangxu') 38 getrange('k1',1,2)#ig 39 #setrange(name,offset,value)修改字符串內容,從指定位置開始替換 40 #append(key,value)在redis name對應的值后面追加內容 41 append('k1','aaa')#'liguangxuaaa'
