将MySQLdb数据库查询结果缓存到内存中

3 投票
2 回答
2952 浏览
提问于 2025-04-15 21:14

我们的应用程序从一组数据库服务器中获取正确的数据库服务器。所以每次查询实际上是两个查询,步骤如下:

  1. 获取正确的数据库服务器
  2. 执行查询

这样做是为了方便我们根据需要将数据库服务器上线或下线,同时也能进行负载均衡。

不过,第一步的查询似乎可以缓存到内存中,这样就可以每5到10分钟才真正去查询数据库一次。

那么,最好的方法是什么呢?

谢谢。

编辑 这是针对一个Pylons的网页应用程序

2 个回答

1

最简单的方法是使用beaker缓存,这是一个内置于pylons框架的库。

在你的模型类中,先导入beaker装饰器:

from pylons.decorators.cache import beaker_cache

然后在你的函数开头,也就是你进行数据库调用的地方,添加以下装饰器:

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

把过期时间的值改成你想要的秒数(目前设置为5分钟)。

5

只需要创建一个缓存(用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

现在这个装饰器可以用在任何需要缓存结果的函数上,缓存的时间可以是固定的,也可以根据某个事件来决定。我会把这个装饰器做成一个类,这样就可以设置缓存多久后刷新一次,同时你也可以更好地生成缓存的键。

撰写回答