簡體   English   中英

當我有帶有多個外鍵的Django對象時,如何命名/排列我的Memcached鍵?

[英]How to name/arrange my memcached keys when I have Django objects with multiple foreign keys?

我有一個現有的Django應用,不執行任何數據庫緩存。 我正在努力實現memcached,以提高性能並減少昂貴的數據庫命中次數。

我將使用的策略如下:每次我使用XXX.objects.get()或XXX.objects.filter()查詢數據庫時,我都會首先檢查緩存以查看是否同一查詢的結果已經存在在memcached中。 如果是這樣,我將使用它。 如果不是,我將查詢數據庫,並使用專門命名的密鑰將其填充到memcached中。 每當我更新此查詢的任何結果時,我都會使用Django的post_save()信號來使該緩存鍵無效。 聽起來很簡單,對吧?

好吧,我正在為應該如何命名我的緩存鍵而苦苦掙扎,這樣才能有序地工作。 問題是我有Django模型對象,該對象具有指向其他2個Django模型的外鍵。

這是我的模型:

memCache = pylibmc.Client(["127.0.0.1"])

class myObjectA(models.Model):  
    field1 = models.CharField(max_length=255)

    def getC_Children(self):
        if "SOME_NAME1_%s" % self.pk in memCache:
           return memCache["SOME_NAME1_%s" % self.pk]
        else:
           newCacheEntry = myObjectC.objects.filter(fk_myObjectA=self)
           memCache["SOME_NAME1_%s" % self.pk] = newCacheEntry
           return newCacheEntry




class myObjectB(models.Model):  
    field2 = models.CharField(max_length=255)

    def getC_Children(self):
        if "SOME_NAME2_%s" % self.pk in memCache:
           return memCache["SOME_NAME2_%s" % self.pk]
        else:
           newCacheEntry = myObjectC.objects.filter(fk_myObjectB=self)
           memCache["SOME_NAME2_%s" % self.pk] = newCacheEntry
           return newCacheEntry



class myObjectC(models.Model):  
    fk_myObjectA = models.ForeignKey(myObjectA, related_name="Blah_Blah") 
    fk_myObjectB = models.ForeignKey(myObjectB, related_name="Blah_Blah2") 
    field3 = models.CharField(max_length=255)

在myObjectC的post_save handler()中,我需要使緩存鍵SOME_NAME1_X和SOME_NAME2_X失效,因為它們現在已過期。 對? 我認為這就是我需要做的。

但是,如果每個類的每個實例都有許多這樣的鍵怎么辦? 畢竟,每個實例的每個XXX.objects.get()或XXX.objects.filter()調用都會有一個這樣的鍵。 我必須手動使它們全部失效嗎? 難道沒有一種系統的方法可以一次命名和使這些密鑰無效,而不必自己記住每個緩存項嗎?

緩存需要一個可靠且精心設計的策略,因為您可能會做得比實際情況差。 在大多數項目中,您實際上不需要高級緩存。 為什么不每次更新數據庫時都緩存頁面並刪除頁面緩存? 這將允許查詢運行一次,但其余時間將檢索緩存。 如果您仍然堅持使用唯一鍵進行緩存,緩存,則可以通過唯一對象id及其名稱來創建它們的鍵組合。 如果您更新或創建並且新對象刪除了緩存,則信號是任一種方式,但是從您自己的示例中可以看出,頁面緩存比處理大量對象更容易處理。 除此之外,為什么不使用Django cache.get,cache.set,cache.delete函數中的構建? 這樣,您就可以保持項目的兼容性,並使代碼與緩存引擎分離(也許明天Redis將更適合您的需求)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM