2010-03-06 75 views
1

我需要某种基本上静态的信息。这些信息并不多,但很多对象都会使用这些信息。因为这里没有很多信息(很少有字典和一些列表),所以我认为我有两个选择 - 创建模型来保存数据库中的信息,或者将它们作为字典/列表写入某些设置文件。我的问题是 - 哪个更快,从数据库或设置文件读取这些信息?无论哪种情况,我都需要能够在很多地方访问这些信息,这意味着很多数据库读取调用。那么哪个会更快?数据库速度与静态字典速度的模型

回答

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值 和缓存 未命中符号b y返回值为 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,而不是乱丢你的代码,上面的例子只是为了易于理解,而不一定是全面的缓存实现。

0

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

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

1

如果数据是静态的,则不需要继续回到数据库。只需要第一次阅读并缓存结果即可。

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

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

伪代码使用memcached的

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