先看一段memcached的簡單介紹: html
Memcached,高性能的分佈式內存對象緩存系統,用於動態Web應用以減輕服務器的負載。經過在內存中緩存數據和對象來減小數據的查詢次數,從而達到下降負載並提升吞吐量的雙豐收。Memcached使用哈希圖來儲存鍵值。Memcached由Danga Interactive開發,而被開源之後就爲多家公司所用。然而Memcached到了Facebook的手裏明顯「兇猛」了不少:每秒處理20萬UDPS請求,平均延時只有173微妙(雖然總吞吐量一度達到每秒50萬UDP,可是因爲延時過高未被採用),對比以前的5萬每秒UDP無疑是瘋狂的提高。 python
而pylibmc是memcached提供的python客戶端,使用很是方便,官方文檔也給出了詳細的使用範例: 數據庫
http://sendapatch.se/projects/pylibmc/index.html 緩存
初始化一個客戶端,對數據的寫入、讀取、刪除操做,加減這樣的原子操做都作了使用介紹; 服務器
同時還能夠定義behaviors來進行適當的優化和個性化的拓展,在優化方面通過實驗並無良好的效果; 併發
咱們項目使用的是Tokyo Tyrant開源數據庫作數據存儲,由日本人發明的,兼容memcache協議,在高併發下具備良好的表現; app
支持雙機互爲主輔模式和master-slave機制;目前應對10000/s的響應表現良好,可是雙機主輔限制了可拓展性,早晚要換的東西。 分佈式
下面是pylibmc的應用例子,加入了failover機制,可以在一個server斷掉的狀況下主動鏈接下一個; memcached
import pylibmc DB_LOCAL = (('192.168.1.1',11212),('192.168.1.2',11212)) class LocalDb: @classmethod def open(cls, host_port): cls.client_list = [] for hp in host_port: cls.client_list.append(pylibmc.Client(['%s:%d' % hp])) cls.client_len = len(cls.client_list) cls.cur_idx = 0 cls.host_port = host_port return cls(cls.client_list[cls.cur_idx]) def _clientIter(self, c): # have gone through all clients for client in LocalDb.client_list: if (client == self.c): continue yield client def __init__(self, client): self.c = client def __str__(self): return 'LocalDb.open() (%s)' % (self.c) def _failover(self, oper, *args, **kwargs): result = None client_iter = self._clientIter(self.c) while True: try: result = getattr(self.c, oper)(*args, **kwargs) except: logerr('_failover Err: ') # faild to conn and choise another one try: dbg('Before TT failover (%s)' % self.c) self.c = client_iter.next() dbg('After TT failover (%s)' % self.c) continue except StopIteration: # gone through all clients break break return result def get(self, key): return self._failover('get', key) def set(self, key, val): result = self._failover('set', key, val) if (result is None): return False return True def add(self, key, val): result = self._failover('add', key, val) if (result is None): return False return True def incr(self, key): return self._failover('incr', key) def decr(self, key): return self._failover('decr', key)