Merge pull request #19716 from resilient-tech/simpler-doc-cache

chore!: remove special local cache for documents (and related `cache_locally` parameter)
This commit is contained in:
Ritwik Puri 2023-01-25 22:21:12 +05:30 committed by GitHub
commit fb9ae0823e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 9 additions and 37 deletions

View file

@ -238,7 +238,6 @@ def init(site: str, sites_path: str = ".", new_site: bool = False) -> None:
local.jenv = None
local.jloader = None
local.cache = {}
local.document_cache = {}
local.form_dict = _dict()
local.preload_assets = {"style": [], "script": []}
local.session = _dict()
@ -1075,25 +1074,10 @@ def set_value(doctype, docname, fieldname, value=None):
def get_cached_doc(*args, **kwargs) -> "Document":
def _respond(doc, from_redis=False):
if isinstance(doc, dict):
local.document_cache[key] = doc = get_doc(doc)
elif from_redis:
local.document_cache[key] = doc
if (key := can_cache_doc(args)) and (doc := cache().hget("document_cache", key)):
return doc
if key := can_cache_doc(args):
# local cache - has "ready" `Document` objects
if doc := local.document_cache.get(key):
return _respond(doc)
# redis cache
if doc := cache().hget("document_cache", key):
return _respond(doc, True)
# Not found in local/redis, fetch from DB
# Not found in cache, fetch from DB
doc = get_doc(*args, **kwargs)
# Store in cache
@ -1106,14 +1090,7 @@ def get_cached_doc(*args, **kwargs) -> "Document":
def _set_document_in_cache(key: str, doc: "Document") -> None:
local.document_cache[key] = doc
# Avoid setting in local.cache since we're already using local.document_cache above
# Try pickling the doc object as-is first, else fallback to doc.as_dict()
try:
cache().hset("document_cache", key, doc, cache_locally=False)
except Exception:
cache().hset("document_cache", key, doc.as_dict(), cache_locally=False)
cache().hset("document_cache", key, doc)
def can_cache_doc(args) -> str | None:
@ -1139,12 +1116,11 @@ def get_document_cache_key(doctype: str, name: str):
def clear_document_cache(doctype, name):
cache().hdel("last_modified", doctype)
key = get_document_cache_key(doctype, name)
if key in local.document_cache:
del local.document_cache[key]
cache().hdel("document_cache", key)
cache().hdel("document_cache", get_document_cache_key(doctype, name))
if doctype == "System Settings" and hasattr(local, "system_settings"):
delattr(local, "system_settings")
if doctype == "Website Settings" and hasattr(local, "website_settings"):
delattr(local, "website_settings")

View file

@ -127,8 +127,6 @@ def clear_doctype_cache(doctype=None):
for key in ("is_table", "doctype_modules", "document_cache"):
cache.delete_value(key)
frappe.local.document_cache = {}
def clear_single(dt):
for name in doctype_cache_keys:
cache.hdel(name, dt)

View file

@ -45,7 +45,7 @@ class RedisWrapper(redis.Redis):
return f"{frappe.conf.db_name}|{key}".encode()
def set_value(self, key, val, user=None, expires_in_sec=None, shared=False, cache_locally=True):
def set_value(self, key, val, user=None, expires_in_sec=None, shared=False):
"""Sets cache value.
:param key: Cache key
@ -55,7 +55,7 @@ class RedisWrapper(redis.Redis):
"""
key = self.make_key(key, user, shared)
if not expires_in_sec and cache_locally:
if not expires_in_sec:
frappe.local.cache[key] = val
try:
@ -169,7 +169,6 @@ class RedisWrapper(redis.Redis):
key: str,
value,
shared: bool = False,
cache_locally: bool = True,
*args,
**kwargs,
):
@ -179,8 +178,7 @@ class RedisWrapper(redis.Redis):
_name = self.make_key(name, shared=shared)
# set in local
if cache_locally:
frappe.local.cache.setdefault(_name, {})[key] = value
frappe.local.cache.setdefault(_name, {})[key] = value
# set in redis
try: