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)
浙公网安备 33010602011771号