首页 > 解决方案 > Python 类变量作为缓存机制

问题描述

我的前同事创建了一些“管理器”类,它们是我们数据库中键值表的接口。例如,我们有一个ConfigurationManager,它映射到数据库中的配置表,该表保存带有键(即:“mailserver”)和值(即:“127.0.0.1”)的配置值。

该表可能包含数百个这样的键值项,我们希望偶尔从我们的代码中查找其中一个。

为了防止每次我们需要配置表中的值时,我们都需要进行查询,他实现了一个方法来“缓存”类中列表中的所有值,因此它以一个类变量。

如果_loaded变量是True,他从数据库中加载列表,如果不是,他从类变量中返回它,如下所示:

class ConfigurationManager(object):
    """
    Provides configuration option values
    """

    _all_values = []
    _loaded = False

    @staticmethod
    def value(name):
        if not ConfigurationManager._loaded:
            ConfigurationManager.load_database()

        config = [x for x in ConfigurationManager._all_values if x.conf_name.lower() == name.lower()]
        if len(config) > 0:
            option = config[0]
            return option.conf_value
        else: 
            logger.debug('Configuration value {0} is empty or does not exist.'.format(name))
            return None

    @staticmethod
    def load_database():
        """
        Load configuration options from database
        """
        from flask import current_app
        ConfigurationManager._all_values = Configuration.query.all()
        for confval in ConfigurationManager._all_values:
            current_app.db_session.expunge(confval)
        ConfigurationManager._loaded = True

现在,我必须补充一点,他最初是一名 C# 开发人员,这可能是 C# 的标准做法。但是,我从未在 Python 中看到过这样的示例。

实际的问题是,当我在单元测试中测试它时,这似乎有效,但代码是由 Huey Task 工作人员运行的,在生产中使用 Flask 实例。我们注意到,一段时间后,这些值无法再找到,尽管它们存在于数据库中。看起来我们的类变量缓存被清空了。

我怀疑的是:

如果有人能阐明这种“缓存”方法是否有效,以及是什么导致变量在运行中丢失,我将不胜感激。

标签: pythonflask

解决方案


推荐阅读