【问题标题】:Models in database speed vs static dictionaries speed数据库速度与静态字典速度的模型
【发布时间】:2010-03-06 07:58:02
【问题描述】:

我需要某种本质上是静态的信息。这些信息不多,但很多对象都会使用这些信息。

由于没有很多信息(很少有字典和一些列表),我认为我有 2 个选项 - 创建用于在数据库中保存该信息的模型或将它们作为字典/列表写入某些设置文件。我的问题是 - 从数据库或设置文件中读取该信息哪个更快?无论哪种情况,我都需要能够在很多地方访问该信息,这意味着很多数据库读取调用。那么哪个会更快呢?

【问题讨论】:

    标签: python django dictionary


    【解决方案1】:

    如果它们真的永远不会改变,那么请随意将它们放入您的 settings.py 文件中,就像声明一个普通的 Python 字典一样。

    但是,如果您希望您的信息可以通过正常的 Django 方法进行修改,那么请使用数据库进行持久存储,然后充分利用 Django's cache framework

    像往常一样将数据保存到数据库中,然后在第一次访问时缓存它们:

    from django.core.cache import cache
    
    def some_view_that_accesses_date(request):
      my_data = cache.get('some_key')
    
      if my_data is None:
        my_data = MyObject.objects.all()
        cache.set('some_key', my_data)
    
      ... snip ... normal view code
    

    确保永远不要将None 保存在缓存中,因为:

    我们建议不要存储文字 缓存中的值None,因为你 将无法区分 您存储的None 值和缓存 未命中由返回值表示 None.

    确保您终止了object deletionchange 上的缓存:

    from django.core.cache import cache
    from django.db.models.signals import post_save
    from myapp.models import MyModel
    
    def kill_object_cache(sender, **kwargs):
        cache.delete('some_key')
    
    post_save.connect(kill_object_cache, sender=MyModel)
    post_delete.connect(kill_object_cache, sender=MyModel)
    

    我的一个应用中有类似的东西,而且效果很好。显然,如果您随后使用数据库后端,您将不会看到任何性能改进,但与直接使用 memcached 相比,这是一种更像 Django(Djangonic?)的方法。

    显然,可能值得在某处定义缓存键 some_key,而不是在您的代码中到处乱扔它,上面的示例只是为了易于理解,而不一定是完整的缓存实现。

    【讨论】:

      【解决方案2】:

      如果数据是静态的,则无需继续返回数据库。只需在第一次需要时读取它并缓存结果。

      如果由于某些原因您无法在应用中缓存结果,您可以随时使用 memcached 来避免访问数据库。

      使用 memcached 的好处是,如果数据确实发生了变化,您可以简单地更新 memcached 中的值。

      使用 memcached 的伪代码

      if 'foo' in memcached
          data = memcached.get('foo')
      else
          data = database.get('foo')
          memcached.put('foo', data)
      

      【讨论】:

        【解决方案3】:

        如果您需要从多个进程快速访问,那么数据库是您的最佳选择。

        但是,如果您只想将数据保存在内存中并从同一进程中的多个位置访问它,那么 Python 字典将比访问数据库更快。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-09-25
          • 1970-01-01
          • 2010-10-15
          • 2011-10-14
          • 1970-01-01
          • 1970-01-01
          • 2018-08-01
          • 1970-01-01
          相关资源
          最近更新 更多