2010-03-06 74 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)