我有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)
并手动检查已检索项目的位置 - 该位置已从所有相关项目中删除。这不好。
答案 0 :(得分:1)
Django正在删除它,因为你告诉它。您正在Django中使用关系映射,然后告诉它删除其中一个项目,然后它正确。
https://docs.djangoproject.com/en/1.7/ref/models/relations/
中的文档对此进行了解释此外,调用item.objects.all()会执行对SQL db的查询,而不是使用缓存中的内容。这是因为此时您正在操作ORM而不是缓存。相关,存储您的"项目"缓存中的结果只缓存结果,而不是所有相关项。