CherryPy缓存是如何工作的?
我最近发现,在CherryPy中,页面对象的属性在不同的请求之间(甚至不同的用户之间)是可以保持不变的。所以我在想,把页面的输出存储在这样的属性里是否有意义?比如这样:
class Page:
def default(self, pagenumber):
if pagenumber not in self.validpages:
return 'Page number not found'
try:
html = self.pageoutput[pagenumber]
except KeyError:
html = self.formatter(self.dbcall(pagenumber))
return html
default.exposed = True
def formatter(self, data):
html = # Formatting code here
return html
def dbcall(self, pagenumber):
data = # Database lookup code here
return data
我知道CherryPy默认会缓存GET请求。在我的测试中,当一个对象的属性是输出的一部分,并且这个属性发生了变化时,CherryPy会提供这个属性的新值。这是否意味着输出只是部分被缓存了呢?
对我来说,只要每次更改数据库时都更新self.pageoutput,这样做是有用的。我能想到的唯一困难是,如果我想显示特定用户的信息,那该怎么办呢?你觉得呢?
1 个回答
4
CherryPy 默认情况下不会缓存 GET 请求;你需要按照文档中的说明手动开启缓存工具。
关于你第一个问题的回答,是的,存储一些在多次调用中不会改变的东西,比如“页面输出”,是完全可以的。不过,有几个注意事项:
- HTTP 缓存的效果远比你自己写的要好。所以对于整个响应,最好使用 HTTP 缓存。
- 因此,对于响应的部分内容,比如模板和横幅等,可以使用临时缓存。
- 设计你的存储时要非常小心,以确保它可以安全地被多个请求同时使用。你可以参考 effbot 的相关介绍。一般来说,如果可能的话,尽量在应用启动时生成和存储这些值,而不是在请求期间;如果你只在启动时在主线程中写入这些数据,那么在每个请求中多个线程都可以安全地读取它。如果你需要这些数据随着应用状态的变化而改变,可能需要使用数据库或其他经过大量工作确保安全并发的机制。