2015-03-13 83 views
0

我有Django,PostgreSQL和Redis。我有具有外鍵和m2m關係的模型。每天我都會緩存一堆對象,並在午夜時分放下緩存。問題是當我從數據庫中刪除對象時(白天) - 緩存中的關係字段也發生了變化(這些對象的id從外鍵和m2m中刪除)。正如我在Redis文檔中所讀到的 - 所有對象都以散列形式存儲在服務器的RAM中。我無法理解數據庫更改如何影響RAM緩存。那麼爲什麼會發生這種情況,我該如何防止這種行爲?爲什麼如果相關對象從數據庫中刪除,Redis會刪除對象中的關係?

例子:

# Model 
class Item(models.Model): 
    ... 
    places = models.ManyToManyField(Place, verbose_name=_('Places'), related_name='items', null=True, blank=True) 


# In view 
items = Item.objects.all() 
cache.set(key, items, None) 

然後在Django管理我刪除的地方之一,並在外殼我得到緩存的項目:

items = cache.get(key) 

和手動檢查檢索到的項目的地方 - 該地點已從所有相關項目中刪除。這不好。

+0

您沒有提供足夠的細節。你到底在做什麼? – 2015-03-14 03:47:12

+0

感謝您的評論。我已經更新了這個問題。 – Gleb 2015-03-16 07:59:32

回答

1

Django正在刪除它,因爲你告訴它。您在Django中使用關係映射,然後告訴它刪除其中的一個項目,然後就可以刪除它了。

這是在文檔在https://docs.djangoproject.com/en/1.7/ref/models/relations/

還解釋,調用一個item.objects.all()執行查詢的SQL數據庫,而不是使用什麼是在緩存中。這是因爲您正在使用ORM而不是緩存。相關的,將您的「項目」結果存儲在緩存中只緩存結果,而不是所有相關項目。

+0

Django從數據庫中刪除關係,但緩存中的關係應該不受影響,但它們是。我從db中刪除'place'後立即檢查緩存的'items'。 – Gleb 2015-03-17 12:55:55

+0

您是如何「手動檢查檢索到的物品的位置」?你是否迭代緩存中的內容並向Django詢問它們? item.get(key)返回的字符串是否與放入它相同? – 2015-03-17 19:45:24

+0

您是如何「手動檢查檢索到的物品的位置」? 「......從所有相關項目中刪除」是什麼意思? Redis無法執行您所說的操作,因此Django正在更新緩存或者您沒有緩存您認爲正在緩存的內容。 沒有具體的細節我們不能說。對於我們所知道的UpdateCacheMiddleware正在爲您更新緩存,或者您沒有緩存超過項目列表的任何內容。你沒有提供足夠的細節知道。 – 2015-03-17 19:52:25

相關問題