将MySQLdb数据库查询结果缓存到内存中
我们的应用程序从一组数据库服务器中获取正确的数据库服务器。所以每次查询实际上是两个查询,步骤如下:
- 获取正确的数据库服务器
- 执行查询
这样做是为了方便我们根据需要将数据库服务器上线或下线,同时也能进行负载均衡。
不过,第一步的查询似乎可以缓存到内存中,这样就可以每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
现在这个装饰器可以用在任何需要缓存结果的函数上,缓存的时间可以是固定的,也可以根据某个事件来决定。我会把这个装饰器做成一个类,这样就可以设置缓存多久后刷新一次,同时你也可以更好地生成缓存的键。