如果从数据库中删除相关对象,为什么 Redis 会删除对象中的关系?
Why Redis removes relations in objects if related object is removed from database?
我有 Django、PostgreSQL 和 Redis。我的模型具有外键和 m2m 关系。每天我都在缓存一堆对象并在午夜删除它们的缓存。问题是当我从数据库中删除对象时(白天)——缓存中具有关系的字段也发生了变化(该对象的 id 从外键和 m2m 中删除)。正如我在 Redis 文档中读到的那样——所有对象都作为哈希存储在服务器的 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 admin 中删除其中一个地方,在 shell 中我正在获取缓存的项目:
items = cache.get(key)
并手动检查检索项目的位置 - 该位置已从所有相关项目中删除。而且这样不好。
Django 正在删除它,因为您告诉它这样做。您正在 Django 中使用关系映射,然后告诉它删除其中一项,然后它就正确地执行了。
https://docs.djangoproject.com/en/1.7/ref/models/relations/
的文档对此进行了解释
此外,调用 item.objects.all() 会执行对 SQL 数据库的查询,而不是使用缓存中的内容。这是因为此时您正在操作 ORM 而不是缓存。相关的,将 "items" 结果存储在缓存中只会缓存结果,而不是所有相关项。
我有 Django、PostgreSQL 和 Redis。我的模型具有外键和 m2m 关系。每天我都在缓存一堆对象并在午夜删除它们的缓存。问题是当我从数据库中删除对象时(白天)——缓存中具有关系的字段也发生了变化(该对象的 id 从外键和 m2m 中删除)。正如我在 Redis 文档中读到的那样——所有对象都作为哈希存储在服务器的 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 admin 中删除其中一个地方,在 shell 中我正在获取缓存的项目:
items = cache.get(key)
并手动检查检索项目的位置 - 该位置已从所有相关项目中删除。而且这样不好。
Django 正在删除它,因为您告诉它这样做。您正在 Django 中使用关系映射,然后告诉它删除其中一项,然后它就正确地执行了。
https://docs.djangoproject.com/en/1.7/ref/models/relations/
的文档对此进行了解释此外,调用 item.objects.all() 会执行对 SQL 数据库的查询,而不是使用缓存中的内容。这是因为此时您正在操作 ORM 而不是缓存。相关的,将 "items" 结果存储在缓存中只会缓存结果,而不是所有相关项。