Opened 19 years ago
Last modified 19 years ago
#2341 closed enhancement
[patch] CacheDebugWrapper — at Initial Version
| Reported by: | Owned by: | Adrian Holovaty | |
|---|---|---|---|
| Component: | Core (Other) | Version: | |
| Severity: | normal | Keywords: | |
| Cc: | Triage Stage: | Unreviewed | |
| Has patch: | yes | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
add some instrumentation to the cache object so we can see how effective it is.
personally I think the counters could go on all the cache objects.
Index: __init__.py
===================================================================
--- __init__.py (revision 3337)
+++ __init__.py (working copy)
@@ -18,6 +18,8 @@
from cgi import parse_qsl
from django.conf import settings
from django.core.cache.backends.base import InvalidCacheBackendError
+from django.core import signals
+from django.dispatch import dispatcher
BACKENDS = {
# name for use in settings file --> name of module in "backends" directory
@@ -48,7 +50,55 @@
if host.endswith('/'):
host = host[:-1]
- cache_class = getattr(__import__('django.core.cache.backends.%s' % BACKENDS[scheme], '', '', ['']), 'CacheClass')
- return cache_class(host, params)
+ cache_class = getattr(__import__('django.core.cache.backends.%s' % BACKENDS[scheme], '', '', ['']), 'CacheClass')
+ if settings.DEBUG:
+ return CacheDebugWrapper( cache_class(host,params ))
+ else:
+ return cache_class(host, params)
+class CacheDebugWrapper(object):
+ def __init__(self, real_cache ):
+ self._cache = real_cache
+ self.gets = 0
+ self.get_hits = 0
+ self.sets = 0
+ self.deletes= 0
+ self.get_manys= 0
+ self.queries = []
+
+ def get(self,key,default=None):
+ self.gets += 1
+ val = self._cache.get( key )
+ self.queries.append( key )
+ if val is None:
+ return default
+ else:
+ self.get_hits += 1
+ return val
+
+ def set(self, key, value, timeout=0):
+ self.sets += 1
+ self._cache.set(key, value, timeout)
+
+ def delete(self, key):
+ self.deletes += 1
+ self._cache.delete(key)
+
+ def get_many(self, keys):
+ self.get_manys += 1
+ return self._cache.get_multi(keys)
+
+def reset_queries():
+ if settings.DEBUG:
+ cache.queries = []
+ cache.gets = 0
+ cache.get_hits = 0
+ cache.sets = 0
+ cache.deletes= 0
+ cache.get_manys= 0
+ cache.queries = []
+
+
+dispatcher.connect(reset_queries, signal=signals.request_started)
+
cache = get_cache(settings.CACHE_BACKEND)
Note:
See TracTickets
for help on using tickets.