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:
parent
4193a251a5
commit
7d50ef19d3
2 changed files with 26 additions and 9 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue