2015-03-13 53 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

相关问题