2010-04-05 163 views
3

我們的應用程序從數據庫服務器池中提取正確的數據庫服務器。因此,每個查詢是真的2個查詢,他們是這樣的:在內存中緩存MySQLdb數據庫查詢的結果

  1. 獲取正確的DB服務器
  2. 執行查詢

我們這樣做,所以我們可以離線和在線採取DB服務器必要的,以及負載平衡。

但是,第一個查詢似乎可以緩存到內存,所以它只實際上每5或10分鐘左右查詢數據庫。

這樣做的最好方法是什麼?

謝謝。

編輯這是一個主塔web應用

回答

4

只是做一個緩存(Python的字典),存儲第一查詢,每次返回它,清除緩存每N分鐘,對於這一點,你做裝飾或緩存類例如

import time 

cache = {} 
lastTime = time.time() 

def timedCacheDecorator(func): 

    def wrap(*args, **kwargs): 

     key = str(args)+str(kwargs) 

     # cache for 5 seconds 
     global lastTime 
     if key not in cache or time.time() - lastTime > 5: 
      lastTime = time.time() 
      cache[key] = func(*args, **kwargs) 

     return cache[key] 

    return wrap 


# lets test it 

@timedCacheDecorator 
def myquery(): 
    return time.time() 

print myquery() 
time.sleep(1) 
print myquery() 
time.sleep(5) 
print myquery() 
time.sleep(1) 
print myquery() 

輸出:

1270441034.58 
1270441034.58 
1270441040.58 
1270441040.58 

現在這個裝飾可以其結果將緩存高達時間或可能高達一事件的任何功能可以使用,我會做這個裝飾類,所以在高速緩存刷新之前可能需要等待幾秒鐘,還可以看到如何最好地生成密鑰。

1

最簡單的方法是使用燒杯緩存,燒杯緩存是內置於pylons框架中的庫。

在你的模型類導入燒杯裝飾:

from pylons.decorators.cache import beaker_cache 

然後在你的函數頭,在那裏你使數據庫調用,添加如下裝飾:

@beaker_cache(expire = 300, type='memory') 

更改過期值你想要的秒數(目前設置爲5分鐘)。