Merge pull request #16448 from resilient-tech/perf-get_cached_value

perf: ~90% faster `get_cached_value` from Redis cache
This commit is contained in:
Sagar Vora 2022-04-01 13:47:27 +05:30 committed by GitHub
commit 0c85ca1e59
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -851,18 +851,25 @@ def set_value(doctype, docname, fieldname, value=None):
return frappe.client.set_value(doctype, docname, fieldname, value)
def get_cached_doc(*args, **kwargs):
allow_dict = kwargs.pop("_allow_dict", False)
def _respond(doc, from_redis=False):
if not allow_dict and isinstance(doc, dict):
local.document_cache[key] = doc = get_doc(doc)
elif from_redis:
local.document_cache[key] = doc
return doc
if key := can_cache_doc(args):
# local cache
doc = local.document_cache.get(key)
if doc:
return doc
if doc := local.document_cache.get(key):
return _respond(doc)
# redis cache
doc = cache().hget('document_cache', key)
if doc:
doc = get_doc(doc)
local.document_cache[key] = doc
return doc
if doc := cache().hget('document_cache', key):
return _respond(doc, True)
# database
doc = get_doc(*args, **kwargs)
@ -895,9 +902,9 @@ def clear_document_cache(doctype, name):
del local.document_cache[key]
cache().hdel('document_cache', key)
def get_cached_value(doctype, name, fieldname, as_dict=False):
def get_cached_value(doctype, name, fieldname="name", as_dict=False):
try:
doc = get_cached_doc(doctype, name)
doc = get_cached_doc(doctype, name, _allow_dict=True)
except DoesNotExistError:
clear_last_message()
return