Skip to content

Instantly share code, notes, and snippets.

@Bpless
Created April 3, 2012 19:00
Show Gist options
  • Save Bpless/2294720 to your computer and use it in GitHub Desktop.
Save Bpless/2294720 to your computer and use it in GitHub Desktop.
Caching Mongo DealUser Documents
from django.core.cache import cache
DEALUSER_CACHE_THRESHOLD = 20000
HIGH_DEALUSER_CACHE_THRESHOLD = 50000
def make_cache_key(self, deal_id, user_id):
return "%s__%d__%d" % (self._document._class_name, deal_id, user_id)
def get_from_cache(self, deal_id, user_id, force=False):
cache_key = self.make_cache_key(deal_id, user_id)
dealuser_dict = cache.get(cache_key)
if not dealuser_dict:
dealuser_doc = self.active().filter(deal_id=deal_id, user_id=user_id)[0]
if force:
self.set_in_cache(deal_id, user_id, dealuser_doc.as_dict)
logger.debug("DB :(")
else:
from deal.mongo_models import RecDocument
logger.debug("Cache!!!")
dealuser_dict['user_id'] = user_id
dealuser_dict['deal_id'] = deal_id
raw_rec_docs = dealuser_dict.pop('recs', None)
rec_docs = [RecDocument(**rec) for rec in raw_rec_docs]
dealuser_dict['recs'] = rec_docs
dealuser_doc = self._document(**dealuser_dict)
return dealuser_doc
def set_in_cache(self, deal_id, user_id, details):
total_score = details['total_score']
if total_score >= DEALUSER_CACHE_THRESHOLD:
duration = 60 * 60 * 24
if total_score >= HIGH_DEALUSER_CACHE_THRESHOLD:
duration *= 3
cache_key = self.make_cache_key(deal_id, user_id)
dealuser_dict = details if details else self.active().filter(deal_id=deal_id, user_id=user_id).as_dict
del dealuser_dict['deal_id']
del dealuser_dict['user_id']
cache.set(cache_key, dealuser_dict, duration)
logger.info('Dealuser cache set for deal %d and user %d', deal_id, user_id)
def delete_from_cache(self, user_id, deal_id):
cache_key = self.make_cache_key(deal_id, user_id)
cache.delete(cache_key)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment