如果从数据库中删除相关对象,为什么Redis会删除对象中的关系?

时间:2015-03-13 09:18:37

标签: python django postgresql caching redis

我有Django,PostgreSQL和Redis。我有拥有外键和m2m关系的模型。我每天都在缓存一堆对象,并在午夜放下缓存。问题是当我从数据库中删除对象时(白天) - 缓存中具有关系的字段也会被更改(此对象的id将从外键和m2m中删除)。正如我在Redis文档中所读到的那样 - 所有对象都作为Hashes存储在服务器的RAM中。我无法理解数据库更改如何影响RAM缓存。那么为什么会发生呢?我该如何防止这种行为?

示例:

# 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管理员中我删除了其中一个地方而且在shell中我正在缓存项目:

items = cache.get(key)

并手动检查已检索项目的位置 - 该位置已从所有相关项目中删除。这不好。

1 个答案:

答案 0 :(得分:1)

Django正在删除它,因为你告诉它。您正在Django中使用关系映射,然后告诉它删除其中一个项目,然后它正确。

https://docs.djangoproject.com/en/1.7/ref/models/relations/

中的文档对此进行了解释

此外,调用item.objects.all()会执行对SQL db的查询,而不是使用缓存中的内容。这是因为此时您正在操作ORM而不是缓存。相关,存储您的"项目"缓存中的结果只缓存结果,而不是所有相关项。

相关问题