CherryPy缓存是如何工作的?

1 投票
1 回答
2073 浏览
提问于 2025-04-16 05:20

我最近发现,在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 请求;你需要按照文档中的说明手动开启缓存工具。

关于你第一个问题的回答,是的,存储一些在多次调用中不会改变的东西,比如“页面输出”,是完全可以的。不过,有几个注意事项:

  1. HTTP 缓存的效果远比你自己写的要好。所以对于整个响应,最好使用 HTTP 缓存。
  2. 因此,对于响应的部分内容,比如模板和横幅等,可以使用临时缓存。
  3. 设计你的存储时要非常小心,以确保它可以安全地被多个请求同时使用。你可以参考 effbot 的相关介绍。一般来说,如果可能的话,尽量在应用启动时生成和存储这些值,而不是在请求期间;如果你只在启动时在主线程中写入这些数据,那么在每个请求中多个线程都可以安全地读取它。如果你需要这些数据随着应用状态的变化而改变,可能需要使用数据库或其他经过大量工作确保安全并发的机制。

撰写回答