Skip to main content
 首页 » 编程设计

python之Django 中的属性缓存之有什么意义

2024年08月12日47yyy_WW

我刚刚查看了 EveryBlock 的源代码,我注意到 alerts/models.py 代码中的这段代码:

    def _get_user(self): 
    if not hasattr(self, '_user_cache'): 
        from ebpub.accounts.models import User 
        try: 
            self._user_cache = User.objects.get(id=self.user_id) 
        except User.DoesNotExist: 
            self._user_cache = None 
    return self._user_cache 
    user = property(_get_user) 

我已经注意到了很多这种模式,但我不太明白它的用途。整个想法是确保在访问 self (self = alert object) 上的 FK 时,您只从数据库中获取用户对象一次吗?你为什么不只依赖数据库缓存和 django 的 ForeignKey() 字段?我注意到模型定义只包含用户 ID 而不是外键字段:

class EmailAlert(models.Model): 
     user_id = models.IntegerField() 
     ... 

如有任何见解,我们将不胜感激。

请您参考如下方法:

我不知道为什么这是一个 IntegerField;看起来它绝对应该是一个 ForeignKey(User) 字段——您会因此而丢失 select_related() 之类的东西以及其他东西。

至于缓存,许多数据库不缓存结果——它们(或者更确切地说,操作系统)会将获取结果所需的数据缓存在磁盘上,因此第二次查找应该比第一次更快, 但它仍然需要工作。

它仍然需要一个数据库往返来查找它。以我的经验,使用 Django 进行项目查找可能需要大约 0.5 到 1 毫秒,对于本地 Postgresql 服务器的 SQL 命令加上有时不平凡的 QuerySet 开销。如果您不需要,1 毫秒已经很多了——这样做几次,您就可以将 30 毫秒的请求变成 35 毫秒的请求。

如果您的 SQL 服务器不在本地并且您实际上有网络往返要处理,那么数字会变得更大。

最后,人们通常期望访问属性的速度很快;当它们复杂到足以引起 SQL 查询时,缓存结果通常是个好主意。