perf: client-cache for defaults

This commit is contained in:
Ankush Menat 2025-01-07 12:47:05 +05:30
parent d3dd7651dc
commit 06816f2817
3 changed files with 14 additions and 4 deletions

View file

@ -109,9 +109,10 @@ def clear_global_cache():
def clear_defaults_cache(user=None): def clear_defaults_cache(user=None):
if user: if user:
frappe.cache.hdel("defaults", [user, *common_default_keys]) for key in [user, *common_default_keys]:
frappe.client_cache.delete_value(f"defaults::{key}")
elif frappe.flags.in_install != "frappe": elif frappe.flags.in_install != "frappe":
frappe.cache.delete_value("defaults") frappe.client_cache.delete_keys("defaults::*")
def clear_doctype_cache(doctype=None): def clear_doctype_cache(doctype=None):

View file

@ -234,7 +234,9 @@ def clear_default(key=None, value=None, parent=None, name=None, parenttype=None)
def get_defaults_for(parent="__default"): def get_defaults_for(parent="__default"):
"""get all defaults""" """get all defaults"""
defaults = frappe.cache.hget("defaults", parent)
key = f"defaults::{parent}"
defaults = frappe.client_cache.get_value(key)
if defaults is None: if defaults is None:
# sort descending because first default must get precedence # sort descending because first default must get precedence
@ -260,7 +262,7 @@ def get_defaults_for(parent="__default"):
elif d.defvalue is not None: elif d.defvalue is not None:
defaults[d.defkey] = d.defvalue defaults[d.defkey] = d.defvalue
frappe.cache.hset("defaults", parent, defaults) frappe.client_cache.set_value(key, defaults)
return defaults return defaults

View file

@ -529,6 +529,13 @@ class ClientCache:
with self.lock: with self.lock:
self.cache.pop(key, None) self.cache.pop(key, None)
def delete_keys(self, pattern):
keys = self.redis.get_keys(pattern)
self.redis.delete_value(keys, shared=True, make_keys=False)
with self.lock:
for key in keys:
self.cache.pop(key, None)
def run_invalidator_thread(self): def run_invalidator_thread(self):
self._watcher = self.invalidator.pubsub() self._watcher = self.invalidator.pubsub()
self._watcher.subscribe(**{"__redis__:invalidate": self._handle_invalidation}) self._watcher.subscribe(**{"__redis__:invalidate": self._handle_invalidation})