在内存中缓存MySQLdb数据库查询的结果

时间:2010-04-05 04:04:41

标签: python caching pylons mysql

我们的应用程序从数据库服务器池中提取正确的数据库服务器。所以每个查询实际上都是2个查询,它们看起来像这样:

  1. 获取正确的数据库服务器
  2. 执行查询
  3. 我们这样做是为了让我们可以根据需要在线和离线使用数据库服务器,以及负载平衡。

    但是第一个查询似乎可以缓存到内存中,因此它实际上每5或10分钟左右才会查询数据库。

    最好的方法是什么?

    感谢。

    编辑这适用于Pylons Web应用程序

2 个答案:

答案 0 :(得分:4)

只需创建一个缓存(python dict),它存储第一个查询并每次返回它,每隔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 :(得分:1)

最简单的方法是使用烧杯缓存,这是一个内置在pylons框架中的库。

在你的模型类中导入烧杯装饰器:

from pylons.decorators.cache import beaker_cache

然后在您进行数据库调用的函数头中添加以下装饰器:

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

将过期值更改为您想要的秒数(当前设置为5分钟)。