Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions redis_cache/backends/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -392,6 +392,19 @@ def ttl(self, client, key):
return client.ttl(key)
return 0

def _get_pattern(self, client, pattern):
keys = client.keys(pattern)
if len(keys):
recovered_data = {}
results = client.mget(keys)
for key, value in zip(keys, results):
if value is not None:
recovered_data[key] = self.get_value(value)
return recovered_data

def get_pattern(self, pattern, version=None):
raise NotImplementedError

def _delete_pattern(self, client, pattern):
keys = client.keys(pattern)
if len(keys):
Expand Down
3 changes: 3 additions & 0 deletions redis_cache/backends/dummy.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@ def ttl(self, key):
def delete_pattern(self, pattern, version=None):
return None

def get_pattern(self, pattern, version=None):
return None

def get_or_set(self, key, func, timeout=None):
if not callable(func):
raise Exception("Must pass in a callable")
Expand Down
9 changes: 9 additions & 0 deletions redis_cache/backends/multiple.py
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,15 @@ def delete_pattern(self, pattern, version=None):
for client in self.clients.values():
self._delete_pattern(client, pattern)

def get_pattern(self, pattern, version=None):
pattern = self.make_key(pattern, version=version)
recovered_data = {}
for client in self.clients.values():
data = self._get_pattern(client, pattern)
if data:
recovered_data.update(data)
return recovered_data if recovered_data else None

def reinsert_keys(self):
"""
Reinsert cache entries using the current pickle protocol version.
Expand Down
4 changes: 4 additions & 0 deletions redis_cache/backends/single.py
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,10 @@ def incr_version(self, key, delta=1, version=None):
# Extra api methods #
#####################

def get_pattern(self, pattern, version=None):
pattern = self.make_key(pattern, version=version)
return self._get_pattern(self.master_client, pattern)

def delete_pattern(self, pattern, version=None):
pattern = self.make_key(pattern, version=version)
self._delete_pattern(self.master_client, pattern)
Expand Down
10 changes: 10 additions & 0 deletions tests/testapp/tests/base_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -429,6 +429,16 @@ def test_setting_bool_retrieves_bool(self):
self.assertTrue(self.cache.set("bool_f", False))
self.assertFalse(self.cache.get("bool_f"))

def test_get_pattern(self):
data = {
'a': 'a',
'aba': 'b',
'aaa': 'c'
}
self.cache.set_many(data)
data = self.cache.get_pattern('a*a')
self.assertEquals(len(data.keys()), 2)

def test_delete_pattern(self):
data = {
'a': 'a',
Expand Down