频繁的更新会影响服务的性能
发生该事件的核心代码
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:
counter.err += 1
return self.method(*args, **kwargs)
目前认为由于两个服务器之间还存在某些数据,未完成共享,比如上方中的key 数据, 目前看起来还是存储在内存中的, 没有在redis 中存储, 结果就会导致两边的服务器查不到相应的缓存数据
key 的示例值如下:
('ir.qweb', <function IrQWeb._get_asset_nodes at 0x00000000085E8E18>, 'web.assets_backend', 'en_US', True, False, False, False, (None,))
其中使用了方法对象,存储的是一个地址值, 不同的服务器,在使用的时候自然会使用不同的地址,就导致key 的不一样, 尝试更改key 的值.
解决方案如下:
一个模型下的方法应该不会有重复的,所以直接将对象更改为方法名即可,即使用字符串
更改后的代码如下: (添加了 __name__
))
def lru(self, model):
counter = STAT[(model.pool.db_name, model._name, self.method)]
return model.pool.cache, (model._name, self.method.__name__), counter
标签:缓存,name,args,self,counter,key,odoo,失效,method
From: https://www.cnblogs.com/qianxunman/p/17009311.html