python pylibmc應用

     先看一段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)
相關文章
相關標籤/搜索