Django转向"预缓存"现有的数据库表?

时间:2017-12-06 15:47:27

标签: python django caching psql

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

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

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

是否可以在Django中预先缓存"这个表在服务器启动时?即将所有这些值添加到缓存中,第一列是关键字?通过覆盖" ready"我尝试了类似的东西。我的app.py中的方法在启动时将数据库表加载到缓存中,但是当我尝试使用表中所知的术语时,我得到空值:

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'

1 个答案:

答案 0 :(得分:1)

检查以下内容是否正确:

  1. 在项目设置中,您执行配置缓存或使用文档中所述的local memory caching

  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
    
  4. 至于以下内容:

      

    是否可以在Django中预先缓存" ......?

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