数据库速度与静态字典速度的模型

时间:2010-03-06 07:58:03

标签: python django dictionary

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

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

3 个答案:

答案 0 :(得分:3)

如果他们真的永远不会改变,那么随意将它们放在你的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)

我的一个应用程序中有类似的内容,效果很好。显然,如果你去使用数据库后端,你不会看到任何性能改进,但这比Django更像(Djangonic?)方法而不是直接使用memcached。

显然,在某处定义缓存键some_key可能是值得的,而不是在代码上乱扔乱码,上面的例子只是为了易于理解,而不是必须完全实现缓存。 / p>

答案 1 :(得分:1)

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

如果出于某种原因无法在应用程序中缓存结果,则可以始终使用memcached来避免访问数据库。

使用memcached的优点是,如果数据确实发生了变化,您只需更新memcached中的值即可。

使用memcached的伪代码

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

答案 2 :(得分:0)

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

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