2
37
For RedisCache you can get all available keys with.
from django.core.cache import cache
cache.keys('*')
- [Django]-How should I write tests for Forms in Django?
- [Django]-Django class-based views with inline model-form or formset
- [Django]-Django and Bootstrap: What app is recommended?
8
As mentioned there is no way to get a list of all cache keys within django. If you’re using an external cache (e.g. memcached, or database caching) you can inspect the external cache directly.
But if you want to know how to convert a django key to the one used in the backend system, django’s make_key() function will do this.
https://docs.djangoproject.com/en/1.8/topics/cache/#cache-key-transformation
>>> from django.core.cache import caches
>>> caches['default'].make_key('test-key')
u':1:test-key'
- [Django]-Add Text on Image using PIL
- [Django]-Best practice for Django project working directory structure
- [Django]-How to limit columns returned by Django query?
6
For debugging, you can temporarily switch to LocMemCache
instead of PyMemcacheCache
:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
'LOCATION': 'unique-snowflake',
}
}
then see this question:
from django.core.cache.backends import locmem
print(locmem._caches)
- [Django]-Access Django model's fields using a string instead of dot syntax?
- [Django]-How to run gunicorn from a folder that is not the django project folder
- [Django]-Django + Ajax
6
For Redis Backend
I’m going to add this answer because I landed on this SO question searching for exactly the same question but using a different cache backend. Also with REDIS in particular if you are using the same REDIS server for multiple applications you will want to scope your cache keys with the KEY_PREFIX
option otherwise you could end up with cache keys from another application.
My answer is for if you have setup KEY_PREFIX
in your settings.py
and if you are using either redis_cache.RedisCache
or django.core.cache.backends.redis.RedisCache
e.g.
CACHES = {
"default": {
"BACKEND": "redis_cache.RedisCache",
"LOCATION": f"redis://localhost:6379",
"KEY_PREFIX": "my_prefix",
},
}
or
CACHES = {
"default": {
"BACKEND": "django.core.cache.backends.redis.RedisCache",
"LOCATION": f"redis://localhost:6379",
"KEY_PREFIX": "my_prefix",
},
}
redis_cache.RedisCache
from django.conf import settings
from django.core.cache import cache
cache_keys = cache.get_client(1).keys(
f"*{settings.CACHES['default']['KEY_PREFIX']}*"
)
django.core.cache.backends.redis.RedisCache
Doing some tests shows that using Django’s built in RedisCache may already be scoped but in my case I’m doing it to be explicit. calling
.keys("*")
will also return keys that belong to celery tasks
from django.conf import settings
from django.core.cache import cache
cache_keys = cache._cache.get_client().keys(
f"*{settings.CACHES['default']['KEY_PREFIX']}*"
)
Bonus: Deleting all app keys
If you want to clear the cache for your specific app instead of ALL the keys in REDIS you’ll want to using the prior technique and then call cache.delete_many(cache_keys)
instead of cache.clear()
as the Django Docs warns that using cache.clear()
will remove ALL keys in your cache, not just the ones that are created by your app.
- [Django]-Get the name of a decorated function?
- [Django]-How do I output HTML in a message in the new Django messages framework?
- [Django]-What is the equivalent of "none" in django templates?
4
In my setup with Django 3.2 there is a method to get a "raw" client for Redis which you can get the keys from.
from django.core.cache import cache
cache.get_client(1).keys()
- [Django]-When to use get, get_queryset, get_context_data in Django?
- [Django]-Django model manager objects.create where is the documentation?
- [Django]-Django – How to do tuple unpacking in a template 'for' loop
3
The Memcached documentation recommends that instead of listing all the cache keys, you run memcached in verbose mode and see everything that gets changed. You should start memcached like this
memcached -vv
and then it will print the keys as they get created/updated/deleted.
- [Django]-'WSGIRequest' object has no attribute 'user' Django admin
- [Django]-Django admin and showing thumbnail images
- [Django]-How to understand lazy function in Django utils functional module
2
You can use memcached_stats from: https://github.com/dlrust/python-memcached-stats. This package makes it possible to view the memcached keys from within the python environment.
- [Django]-Calling Django `reverse` in client-side Javascript
- [Django]-Can I make an admin field not required in Django without creating a form?
- [Django]-How can I check the size of a collection within a Django template?
2
If this is not too out of date, I have had similar issue, due I have had to iterate over whole cache. I managed it, when I add something to my cache like in following pseudocode:
#create caches key list if not exists
if not my_cache.get("keys"):
my_cache.set("keys", [])
#add to my cache
my_cache.set(key, value)
#add key to keys
if key not in my_cache.get("keys"):
keys_list = my_cache.get("keys")
keys_list.append(key)
my_cache.set("keys", keys_list)
- [Django]-Can't connect to local MySQL server through socket '/tmp/mysql.sock
- [Django]-Django – get() returned more than one topic
- [Django]-Django: For Loop to Iterate Form Fields
0
this helps.
Ref:
https://lzone.de/blog/How-to%20Dump%20Keys%20from%20Memcache
https://github.com/dlrust/python-memcached-stats
import re, telnetlib, sys
key_regex = re.compile(r"ITEM (.*) \[(.*); (.*)\]")
slab_regex = re.compile(r'STAT items:(.*):number')
class MemcachedStats:
def __init__(self, host='localhost', port='11211'):
self._host = host
self._port = port
self._client = None
@property
def client(self):
if self._client is None:
self._client = telnetlib.Telnet(self._host, self._port)
return self._client
def command(self, cmd):
' Write a command to telnet and return the response '
self.client.write("{}\n".format(cmd).encode())
res = self.client.read_until('END'.encode()).decode()
return res
def slab_ids(self):
' Return a list of slab ids in use '
slab_ids = slab_regex.findall(self.command('stats items'))
slab_ids = list(set(slab_ids))
return slab_ids
def get_keys_on_slab(self, slab_id, limit=1000000):
cmd = "stats cachedump {} {}".format(slab_id, limit)
cmd_output = self.command(cmd)
matches = key_regex.findall(cmd_output)
keys = set()
for match_line in matches:
keys.add(match_line[0])
return keys
def get_all_keys(self):
slab_ids = self.slab_ids()
all_keys = set()
for slab_id in slab_ids:
all_keys.update(self.get_keys_on_slab(slab_id))
return list(all_keys)
def main():
m = MemcachedStats()
print(m.get_all_keys())
if __name__ == '__main__':
main()
- [Django]-How to get primary keys of objects created using django bulk_create
- [Django]-Foreignkey (user) in models
- [Django]-Django REST Framework: how to substitute null with empty string?
0
You can get all keys with cache._cache.keys()
in reverse order for LocMemCache.
For example, you set 4 cache values as shown below:
from django.core.cache import cache
cache.set("first_name", "John")
cache.set("last_name", "Smith", version=2)
cache.set("age", 36, version=3)
cache.set("gender", "Male")
Then, you can get all the keys with cache._cache.keys()
in reverse order as shown below. *:1:
, :2:
or :3:
before each key indicates version:
from django.core.cache import cache
print(cache._cache.keys())
# odict_keys([':1:gender', ':3:age', ':2:last_name', ':1:first_name'])
And, you can iterate all the keys as shown below:
from django.core.cache import cache
for key in cache._cache.keys():
print(key)
Output:
:1:gender
:3:age
:2:last_name
:1:first_name
And, you can iterate all the keys with the versions as shown below:
from django.core.cache import cache
for key in cache._cache.keys():
new_key = key.split(":", 2)[2]
version = key.split(":", 2)[1]
print(new_key, version)
Output:
gender 1
age 3
last_name 2
first_name 1
Lastly, you can iterate all the key’s values which match the keys and versions as shown below. *list() is needed for cache._cache.keys()
otherwise you get error and specifying a version is needed for cache.delete() otherwise you cannot delete all the cache values and the answer of my question explains the default version of a cache value with LocMemCache
:
from django.core.cache import cache
# `list()` is needed
for key in list(cache._cache.keys()):
new_key = key.split(":", 2)[2]
version = key.split(":", 2)[1]
print(cache.get(new_key, version=version))
Output:
Male
36
Smith
John
- [Django]-Django TypeError: 'RelatedManager' object is not iterable
- [Django]-How to expire Django session in 5minutes?
- [Django]-Django filter vs exclude
0
>>> from django.core.cache import cache
>>> cache.keys("foo_*")
["foo_1", "foo_2"]
A simple search like this will return all matched values. In databases with a large number of keys this isn’t suitable method. Instead, you can use the iter_keys function that works like the keys function but uses Redis server side cursors. Calling iter_keys will return a generator that you can then iterate over efficiently.
>>> from django.core.cache import cache
>>> cache.iter_keys("foo_*")
<generator object algo at 0x7ffa9c2713a8>
>>> next(cache.iter_keys("foo_*"))
"foo_1"
https://github.com/jazzband/django-redis#scan–delete-keys-in-bulk
- [Django]-'function' object has no attribute 'as_view'
- [Django]-(13: Permission denied) while connecting to upstream:[nginx]
- [Django]-Django cannot import name x
-2
There are some weird workarounds you can do to get all keys from the command line, but there is no way to do this with memcached inside of Django. See this thread.
- [Django]-What is the way to ignore/skip some issues from python bandit security issues report?
- [Django]-Use Django ORM as standalone
- [Django]-Setting default value for Foreign Key attribute in Django