2009-12-04 30 views
4

我有一個很大的Django項目,有幾個相互關聯的項目和大量使用中的緩存。它目前有一個存儲緩存幫助函數的文件。因此,例如,get_object_x(id)將檢查此對象的緩存,如果它不存在,請轉到數據庫並從此處將其取出並返回,並沿途緩存。緩存對象組時也遵循相同的模式,並且該文件也用於失效方法。用於處理memcache的模式在Django中緩存

儘管在應用程序之間導入時出現問題。應用模型文件有許多我們想要使用緩存的幫助函數,而cache_helpers文件顯然需要導入模型文件。

所以我的問題是:什麼是這樣做的更好的方式,不暴露代碼循環導入問題(或者可能只是一個更聰明的方式)?理想情況下,我們可以以更好,更少手動的方式做失效。我的猜測是,Django自定義管理器和信號的使用是最好的開始,徹底擺脫cache_helpers文件,但沒有人有更好的建議或方向在哪裏看?

回答

7

避免圓形進口一般的蟒紋是把一組進口的依賴函數中:

# module_a.py 
import module_b 

def foo(): 
    return "bar" 

def bar(): 
    return module_b.baz() 

# module_b.py 
def baz(): 
    import module_a 
    return module_a.foo() 

至於高速緩存,這聽起來像你需要一個看起來有點像這樣的功能:

def get_cached(model, **kwargs): 
    timeout = kwargs.pop('timeout', 60 * 60) 
    key = '%s:%s' % (model, kwargs) 
    result = cache.get(key) 
    if result is None: 
     result = model.objects.get(**kwargs) 
     cache.set(key, result, timeout) 
    return result 

現在您不需要爲每個模型創建「getbyid」方法。你可以這樣做,而不是:

blog_entry = get_cached(BlogEntry, pk = 4) 

你可以寫類似的功能,使用獲得()方法以飽滿查詢集,而不只是單一的模型對象打交道。

+0

謝謝,我一定會使用get_cached方法。 – Jeff

3

由於您表示正在緩存Django ORM模型實例,請看django-orm-cache,它提供了模型實例的自動緩存功能,並且明確了何時使緩存失效。

您的循環導入不會成爲問題 - 您只需從ormcache.models.CachedModel類而不是Django的django.db.models.Model緩存需要緩存的模型,即可免費緩存。

+0

哇,我一定會檢查一下,謝謝。 – Jeff