Skip to content

Commit

Permalink
refactor: refactor memcache keys getting (#2525)
Browse files Browse the repository at this point in the history
  • Loading branch information
NiedielnitsevIvan authored Apr 1, 2024
1 parent d8577f3 commit fa51b75
Showing 1 changed file with 28 additions and 3 deletions.
31 changes: 28 additions & 3 deletions cms/djangoapps/contentstore/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from collections import defaultdict
from contextlib import contextmanager
from datetime import datetime, timezone
from urllib.parse import quote_plus
from urllib.parse import quote_plus, unquote
from uuid import uuid4

from django.conf import settings
Expand Down Expand Up @@ -2299,5 +2299,30 @@ def drop_course_sidebar_blocks_cache(course_id: str):
Drop the course sidebar blocks cache for the given course.
"""
cache_key_prefix = f"course_sidebar_blocks_{course_id}"
all_cache_keys = cache.keys('*') if hasattr(cache, 'keys') else []
cache.delete_many(filter(lambda key: key.startswith(cache_key_prefix), all_cache_keys))
cache_keys = get_cache_keys(cache_key_prefix)

cache.delete_many(cache_keys)


def get_cache_keys(cache_key_prefix):
"""
Get all cache keys for the given cache key prefix.
LocMemCache does not have a keys method, so we need to iterate over the cache
and manually filter out the keys that match the given prefix.
"""
cache_backend = settings.CACHES['default']['BACKEND']
if cache_backend == 'django_redis.cache.RedisCache':
yield cache.iter_keys(f"{cache_key_prefix}*")
elif cache_backend == 'django.core.cache.backends.locmem.LocMemCache':
for key in cache._cache.keys(): # pylint: disable=protected-access
try:
decoded_key = unquote(key.split(':', 2)[-1], encoding='utf-8')
except IndexError:
continue

if decoded_key.startswith(cache_key_prefix):
yield decoded_key
else:
log.error(f"Unsupported cache backend: {cache_backend}")
yield

0 comments on commit fa51b75

Please sign in to comment.