首页 > 其他分享 >优化 Odoo 性能:方法级别缓存的魔力

优化 Odoo 性能:方法级别缓存的魔力

时间:2024-01-12 16:33:27浏览次数:22  
标签:缓存 ormcache 魔力 self args key Odoo compute

浅谈 Odoo 的 @ormcache 装饰器。

1. 缓存的背景

在实际开发中,某些计算可能会消耗大量时间和资源。例如,在计算字段的值时,可能需要执行复杂的逻辑或查询大量数据。为了避免在相同参数下重复执行这些耗时的计算,我们可以使用缓存机制。

2. 使用 @ormcache 装饰器

在 Odoo 中,@ormcache 装饰器是一个强大的工具,它可以应用在方法上,用于缓存方法的结果。通过将它与计算字段结合使用,我们可以实现对计算结果的高效缓存。在修改的方法中清除缓存,保证数据的统一性,下次访问的时候就会从orm里面重新读取

3. 示例代码

以下是一个简单的示例代码,演示了如何在 Odoo 中使用 @ormcache 装饰器结合计算字段:

# my_ormcache_test.py
import time

from odoo import models, api
from odoo.tools import ormcache

class ResPartner(models.Model):
    _inherit = 'res.partner'

    def write(self, vals):
        self.clear_cache()
        return super(ResPartner, self).write(vals)

    @api.model
    @ormcache('partner_name')
    def compute_something(self, partner_name):
        # 模拟耗时操作
        time.sleep(5)
        print('从ORM中读取------')
        return f"{partner_name}"

    def button_compute(self):
        print('从缓存中中读取------')
        ret = self.compute_something(self.name)

    def clear_cache(self):
        self.compute_something.clear_cache(self)

odoo界面截图

优化 Odoo 性能:方法级别缓存的魔力_缓存

在这个例子中,我们定义了一个计算字段 compute_something,并通过 @ormcache 装饰器告诉 Odoo 对这个方法的结果进行缓存。在 button_compute 方法中演示了从缓存中读取数据,而不重新计算。


4. 源码剖析

    def lookup(self, method, *args, **kwargs):
        d, key0, counter = self.lru(args[0])
        key = key0 + self.key(*args, **kwargs)
        try:
            r = d[key]
            counter.hit += 1
            return r
        except KeyError:
            counter.miss += 1
            value = d[key] = self.method(*args, **kwargs)
            return value
        except TypeError:
            _logger.warning("cache lookup error on %r", key, exc_info=True)
            counter.err += 1
            return self.method(*args, **kwargs)
  1. self.lru(args[0]) 返回了一个字典 d、一个缓存键的基础部分 key0 以及一个计数器 counter。这里假设 args[0] 是用于生成缓存键的参数。
  2. key = key0 + self.key(*args, **kwargs) 通过将基础部分和方法的参数计算得到最终的缓存键 key
  3. 接下来,尝试从字典 d 中获取缓存结果:
  • 如果成功命中缓存,则返回缓存的值,并增加计数器的命中次数。
  • 如果在缓存中未找到,捕获 KeyError 异常,表示缓存未命中,增加计数器的未命中次数。然后执行原始方法,并将结果存入缓存。
  1. 如果捕获到 TypeError 异常,表示在缓存查找过程中出现了错误。此时,增加计数器的错误次数,并执行原始方法。

总体而言,这段代码实现了缓存查找的逻辑,如果能够从缓存中找到结果就直接返回,否则执行原始方法,将结果存入缓存。异常处理部分确保即使在缓存查找的过程中出现错误,也能够执行原始方法以确保不影响程序的正常运行。

标签:缓存,ormcache,魔力,self,args,key,Odoo,compute
From: https://blog.51cto.com/u_14480405/9219099

相关文章

  • Spring Boot整合Redis:实现高效缓存管理
    在现代的Web应用开发中,利用缓存来提升应用性能是一种常见的做法。Redis作为一个高性能的键值数据库,被广泛应用于缓存场景中。本文将详细介绍如何在Java中使用SpringBoot框架整合Redis,实现高效的缓存管理。什么是Redis?Redis是一个开源的内存数据结构存储系统,它支持多种类型的数据......
  • 安卓之缓存的应用场景以及各种技术优劣分析
    文章摘要        本文主要探讨了安卓开发中的缓存技术及其应用场景,通过分析几种常见的缓存技术,包括内存缓存、磁盘缓存和网络缓存,阐述了它们的优点和缺点。此外,本文还提供了相应的代码示例,以帮助读者更好地理解这些缓存技术的实现方式。一、引言        在当今的应......
  • 安卓之缓存的应用场景以及各种技术优劣分析
    ​文章摘要        本文主要探讨了安卓开发中的缓存技术及其应用场景,通过分析几种常见的缓存技术,包括内存缓存、磁盘缓存和网络缓存,阐述了它们的优点和缺点。此外,本文还提供了相应的代码示例,以帮助读者更好地理解这些缓存技术的实现方式。一、引言        在当......
  • 瞄准快速注册:揭秘亚马逊鲲鹏系统的全自动批量注册魔力
    想要快速注册亚马逊买家号?别急,亚马逊鲲鹏系统是你的得力助手。这一全自动批量注册工具为您提供了高效便捷的解决方案,但在使用前,务必准备好所需的必要资料。邮箱、手机号、收货地址、支付卡、以及IP等都是不可或缺的一部分。让我们一一看看这款软件对资料的要求,确保您的注册过程能够......
  • 缓存之美——如何选择合适的本地缓存?
    1、简介小编最近在使用系统的时候,发现尽管应用已经使用了redis缓存提高查询效率,但是仍然有进一步优化的空间,于是想到了比分布式缓存性能更好的本地缓存,因此对领域内常用的本地缓存进行了一番调研,有早期的Guava缓存、在Guava上进一步传承的Caffine以及自称在Java中使用最广泛的EhC......
  • 缓存之美——如何选择合适的本地缓存?
    1、简介小编最近在使用系统的时候,发现尽管应用已经使用了redis缓存提高查询效率,但是仍然有进一步优化的空间,于是想到了比分布式缓存性能更好的本地缓存,因此对领域内常用的本地缓存进行了一番调研,有早期的Guava缓存、在Guava上进一步传承的Caffine以及自称在Java中使用最广泛的EhCac......
  • .NET Core MemoryCache缓存批量获取Key或者删除
    .NetCore下使用缓存,除了大家耳熟能详的Redis做分布式缓存外,本地内存缓存也会一起结合来使用,它存取更快,使我们的应用达到极致性能要求。这也是我们经常提到的3级或者4级缓存,每一层都有自己的使用场景,优缺点,结合业务特点来选择合适的才是王道。这里我们就使用Net原生的Microsoft......
  • (原创)再论odoo中的计算字段
    计算字段严格意义上分为两种:存储型和非存储型。1)非存储型的计算字段,在其计算方法中,要确保该字段被赋值,也是保证缓存中有这个字段的值,否则会报错。13以前会报CacheMiss的错误,14以后会报ValueError的错误。当他依赖的字段修改时,通过modified方法,使它在缓存中无效,在后续访问这......
  • 缓存数据库双写不一致
    缓存数据库双写不一致Redis缓存与数据库Mysql双写不一致如何解决?方案2应该是最好的,也是最复杂的。其他都有很明显的问题。对于频繁更新的数据不建议加缓存异步更新缓存(基于订阅binlog的同步机制):binlog增量订阅消费+消息队列+增量数据更新到redis读Redis:热数......
  • 电脑版微信缓存记录找回好友
    工具下载地址下载地址:https://wwot.lanzouw.com/b0395rbcd 密码:3zp8工具说明此工具是通过读取历史缓存数据找回删除的好友,需要你们还是好友的时候,有在这台电脑上登录过,才有可能找回。使用教程电脑上登录微信,打开软件点击一键读取,等显示输出读取完成后,点击读取结果查看是否......