perf: Delete multiple keys in O(1) redis calls

Currently we call redis for each key, redis already supports deleting
multiple keys in one go.
This commit is contained in:
Ankush Menat 2023-06-03 21:25:04 +05:30 committed by Ankush Menat
parent 4193a251a5
commit 7d50ef19d3
2 changed files with 26 additions and 9 deletions

View file

@ -210,3 +210,18 @@ class TestDocumentCache(FrappeAPITestCase):
with self.assertQueryCount(0):
frappe.get_cached_doc(self.TEST_DOCTYPE, self.TEST_DOCNAME)
class TestRedisWrapper(FrappeAPITestCase):
def test_delete_keys(self):
c = frappe.cache()
prefix = "test_del_"
for i in range(5):
c.set_value(f"{prefix}{i}", 1)
self.assertEqual(len(c.get_keys(prefix)), 5)
c.delete_keys(prefix)
self.assertEqual(len(c.get_keys(prefix)), 0)

View file

@ -127,20 +127,22 @@ class RedisWrapper(redis.Redis):
def delete_value(self, keys, user=None, make_keys=True, shared=False):
"""Delete value, list of values."""
if not keys:
return
if not isinstance(keys, (list, tuple)):
keys = (keys,)
if make_keys:
keys = [self.make_key(k, shared=shared, user=user) for k in keys]
for key in keys:
if make_keys:
key = self.make_key(key, shared=shared)
frappe.local.cache.pop(key, None)
if key in frappe.local.cache:
del frappe.local.cache[key]
try:
self.delete(key)
except redis.exceptions.ConnectionError:
pass
try:
self.delete(*keys)
except redis.exceptions.ConnectionError:
pass
def lpush(self, key, value):
super().lpush(self.make_key(key), value)