我想为我一直在工作的瓶子站点实现一个缓存系统。这个想法是,两条路线需要花费更长的时间来渲染,因此,如果自生成html文件以来sqlite表尚未更新,我将返回它(如果已更新),则将从数据库并将其保存到文件中并返回。
可能有人已经这样做了,因此,将“ .tpl”模板的输出重定向到“ .html”文件的任何技巧将不胜感激。
我看过一些通用的缓存库,但是它们似乎可以通过按特定的时间间隔刷新缓存来工作,而我想在数据库更改时刷新。
谢谢。
编辑:我使用Apache作为反向代理,将cheroot用作应用服务器。
答案 0 :(得分:0)
首先,您需要一个缓存对象。字典是一个不错的选择。
cachetpl = {}
lastupdated = time.time()
cache = Cache()
然后创建一个类来处理您的字典中的内容:
class Cache(object):
def __init__(self):
global lastupdated
self.lastupdated = lastupdated
global cachetpl
self.cachetpl = cachetpl
def keys(self):
return self.cachetpl.keys()
def lastupdate(self):
return self.lastupdate
def meta(self, clienthash, zipcode=None):
return self.cachetpl[clienthash]
然后,您需要设置一个脉冲来检查更改,例如检查SQL存储的lastupdated列。
@staticmethod
def update():
global cachetpl
global lastupdated
if not cachetpl:
return None, None
PSQL = ''' SELECT key, meta FROM schema.table WHERE lastupdated >= %s '''
changes = db.fetchall(PSQL, lastupdated)
if changes:
numchange = len(changes)
for x in changes:
cachetpl[x[0]] = x[1]
lastupdated = time.time()
return len(cachetpl), numchange
else:
lastupdated = nz.now()
return None, None
如何设置此脉冲取决于您。我使用了一个名为scheduler
的python库,并将gevent用于异步应用程序。效果很棒。
现在,您只需调用班级Cache()
并向其提供所需的任何数据即可。我的建议是先将其保存在数据库中,然后再返回,而不是返回模板。在渲染之前,让路由调用检查缓存的版本。然后,您可以修改更新以在数据更改时在后台呈现页面,因此对缓存的下一个调用是新数据。