Django 方式“预缓存”现有数据库表?

问题描述 投票:0回答:1

我有一个 200MB 大小的 csv 文件,其中包含一些行,其中关键术语与第二列内的字符串列表相匹配。

term_x | ["term_1","term_2"]
term_y | ["term_1","term_2"]
term_z | ["term_1","term_2"]

我的 Django 应用程序未配置为使用任何复杂的内存缓存(Redis、Memcached),在实践中,我想将一个术语传递到数据库表中以检索相应的列表值。然而,由于其大小,除了加载页面时执行的其他操作之外,从正确的行检索列表大约需要半秒的时间。

Django 是否可以在服务器启动时“预缓存”该表?即,将所有这些值添加到缓存中,并以第一列为键?我尝试过类似的方法,通过覆盖 app.py 中的“ready”方法来在启动时将数据库表加载到缓存中,但是当我尝试使用我知道表中的术语时,我得到空值:

class MyAppConfig(AppConfig):

    name = 'test_display'

    def ready(self):
        print("Loading RS Lookup cache..."),

        #setup database connection....

        cache_df = pd.read_sql_query("Select * from table_to_cache", engine)

        print("Table loaded")

        for index, row in cache_df.iterrows():

             cache.set(row['term'], row['list_of_terms'], None)

        print("RS Table loaded")

同一个 Django 应用程序中我的 init.py 只有一行:

default_app_config = 'test_display.apps.MyAppConfig'
python django caching psql
1个回答
2
投票

检查下列是否正确:

  1. 在项目设置中,您配置缓存或使用本地内存缓存,如文档中所述。

  2. 您仅使用默认缓存(

    from django.core.cache import cache
    )或正确处理缓存名称。

  3. 确保

    .ready()
    中的代码实际上存储了您稍后尝试读取的值。您可以使用以下其中一项:

     assert "my_term" in cache, "The term is not cached!"
    

     from django.core.cache.backends import locmem
     print(locmem._caches)
     # now check what you have inside using your very own eyes and patience
    

至于以下:

Django 中是否可以“预缓存”...?

您的解决方案利用 AppConfig.ready(),这通常是服务器每个实例只执行一次的活动的好地方。至少我不知道有更好的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.