我想为我一直在工作的瓶子网站实现一个缓存系统。这样做的想法是,两个路径需要更长的渲染时间,所以,如果sqlite表在html文件生成后没有更新,我将返回它,如果有,我将从数据库中检索行,并将其保存到文件中并返回。
可能有人已经这样做了,所以任何将'.tpl‘模板的输出重定向到'.html’文件的技巧都将不胜感激。
我看过一些通用的缓存库,但它们似乎是通过以特定的时间间隔刷新缓存来工作的,而我希望在数据库发生变化时进行刷新。
谢谢。
编辑:我使用Apache作为反向代理,使用cheroot作为应用服务器。
发布于 2019-04-10 01:00:47
首先,您需要一个缓存对象。字典是一个很好的选择。
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存储的最新更新列。
@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(),并向其提供所需的任何数据。我的建议不是返回模板,而是先将其保存在数据库中,然后再返回。让对路由的调用在呈现之前检查缓存的版本。然后,您可以修改更新,以便在数据更改时在后台呈现页面,因此对缓存的下一次调用是新数据。
https://stackoverflow.com/questions/55550618
复制相似问题