在Python中使用AOP实现缓存(Redis)

import redis
enable=True
#enable=False
def readRedis(key):
    if enable:
        r = redis.Redis(host='10.224.38.31', port=8690,db=0, password='xxxx')    
        val = r.get(key)
        if val is None:
            print "can not find data for KEY:%s \n" % (key)
            return None
        else:
            print "====Get VALUE from Redis by KEY:%s \n" % ( key)
            return pickle.loads(val)
    else:
        print "disable cache"
    
def writeRedis(key, val):
    r = redis.Redis(host='10.224.38.31', port=8690,db=0, password='xxxx')
    if val is None:
        print "Val is None, don't save it to redis \n"
    else:
        r.set(key, pickle.dumps(val) )
        r.expire(key, 60*60*24*7) #1week
        print "====Write value of KEY:%s to redis \n" % (key)
    
import pickle, functools
def cache(f):
  def wrapper(*args, **kwargs):
    key = pickle.dumps((f.__name__, args, kwargs)).replace("\n","")
    val = readRedis(key)
    if val is None:
      val = f(*args, **kwargs) # call the wrapped function, save in cache
      writeRedis(key, val)
    return val # read value from cache
  functools.update_wrapper(wrapper, f) # update wrapper's metadata
  return wrapper  

@cache
def foo(n):
  return n*2

foo(10) # first call with parameter 10, sleeps
foo(10) # returns immediately
foo(15) # returns immediately
foo(19) # returns immediately

相关推荐