Created
April 3, 2012 19:00
-
-
Save Bpless/2294720 to your computer and use it in GitHub Desktop.
Caching Mongo DealUser Documents
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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