在内存中缓存MySQLdb数据库查询的结果
问题描述:
我们的应用程序从数据库服务器池中提取正确的数据库服务器。因此,每个查询是真的2个查询,他们是这样的:在内存中缓存MySQLdb数据库查询的结果
- 获取正确的DB服务器
- 执行查询
我们这样做,所以我们可以离线和在线采取DB服务器必要的,以及负载平衡。
但是,第一个查询似乎可以缓存到内存,所以它只实际上每5或10分钟左右查询数据库。
这样做的最好方法是什么?
谢谢。
编辑这是一个主塔web应用
答
只是做一个缓存(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
现在这个装饰可以其结果将缓存高达时间或可能高达一事件的任何功能可以使用,我会做这个装饰类,所以在高速缓存刷新之前可能需要等待几秒钟,还可以看到如何最好地生成密钥。
答
最简单的方法是使用烧杯缓存,烧杯缓存是内置于pylons框架中的库。
在你的模型类导入烧杯装饰:
from pylons.decorators.cache import beaker_cache
然后在你的函数头,在那里你使数据库调用,添加如下装饰:
@beaker_cache(expire = 300, type='memory')
更改过期值你想要的秒数(目前设置为5分钟)。