Python:与Redis结合

1.service/__init__.py
import redis
from service.wredis import RedisWritedService
class Service(object):
    def __init__(self):
        self.cache = MClient(MC_SERVERS)
        self.redis = redis.Redis(REDIS_DB['book']['host'],REDIS_DB['book']['port'],REDIS_DB['book']['base_db'])
        self.redis_queue = redis.Redis(REDIS_DB['queue']['host'],REDIS_DB['queue']['port'],REDIS_DB['queue']['base_db'])
        self.redis_third = redis.Redis(REDIS_DB['third']['host'],REDIS_DB['third']['port'],REDIS_DB['third']['base_db'])
        self.redis_keyword = redis.Redis(REDIS_DB['keyword']['host'],REDIS_DB['keyword']['port'],REDIS_DB['keyword']['base_db'])
        self.redis_isbn = redis.Redis(REDIS_DB['isbn']['host'],REDIS_DB['isbn']['port'],REDIS_DB['isbn']['base_db'])
        self.sredis = redis.StrictRedis(REDIS_DB['book']['host'],REDIS_DB['book']['port'],REDIS_DB['book']['base_db'])
    @staticmethod
    def inst():
        name = '_instance'
        if not hasattr(Service, name):
            setattr(Service,name,Service())
        return getattr(Service,name)
 
#2.Redis操作的触发点
    def update_redis_by_isbn(self,book_id,isbn):
        '''
        更新redis中的ISBN信息,并刷新memcached缓存
        '''
        from model.scope import Scheme
        from model.ebk5 import Ebk5Book
        #对旧的ISBN进行处理
        old_isbn = ''
        if book_id:
            ebk5_book = Ebk5Book.mgr(ismaster=True).Q().filter(id=int(book_id))[0]
            old_isbn = ebk5_book.get('isbn')
            if isbn!=old_isbn:
                old_key = "isbn_%s"%(old_isbn)
                old_isbn_json = Service.inst().redis_isbn.lrange(old_key, 0, 1)#取出redis数组第一个元素
                old_isbn_json = [json.loads(i) if isinstance(i, str) else i for i in old_isbn_json]
                if len(old_isbn_json)>0 and str(old_isbn_json[0].get('hit_type'))=='HIT':
                    Service.inst().redis_isbn.lpop(old_key)#移除左边的第一个key
                elif len(old_isbn_json)>0 and str(old_isbn_json[0].get('hit_type'))=='HIT_HALF':
                    if old_isbn_json.has_key('book_id'):
                        old_isbn_json.update({'book_id':'0'})
                        Service.inst().redis_isbn.lset(key,0,json.dumps(old_isbn_json))#重新设置左边的第一个key
 
        #对新的ISBN进行处理
        scheme_list = Scheme.mgr().Q()
        key = "isbn_%s" % (isbn)
        isbn_json = Service.inst().redis_isbn.lrange(key, 0, 1)
        if isbn_json:
            isbn_json = [json.loads(i) if isinstance(i, str) else i for i in isbn_json]
            if len(isbn_json)>0 and str(isbn_json[0].get('hit_type'))=='HIT_HALF':
                json_val = {'hit_type':'HIT','book_id':str(book_id)}
                Service.inst().redis_isbn.lpush(key,json.dumps(json_val))
            elif len(isbn_json)>0 and str(isbn_json[0].get('hit_type'))=='HIT':
                json_val = {'hit_type':'HIT','book_id':str(book_id)}
                Service.inst().redis_isbn.lset(key,0,json.dumps(json_val))
 
        # 刷新缓存
        for scheme in scheme_list:
            mem_key = "isbn_%s_%s" % (scheme.get('scheme_id'),isbn)
            old_mem_key = "isbn_%s_%s"%(scheme.get('scheme_id'),old_isbn)
            json_string={}
            if isbn!=old_isbn:
                json_string['isbn'] = str([mem_key,old_mem_key])
            else:
                json_string['isbn'] = str([mem_key])
            Service.inst().wredis.refresh_cps_mem_by_keys(json_string)

posted on 2014-05-21 09:27  云梦山庄  阅读(317)  评论(0)    收藏  举报

导航