欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

在Python中使用AOP实现缓存(Redis) 博客分类: 大数据数据库AOPRedisPython redispythonaopcache

程序员文章站 2024-02-13 16:36:10
...
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