def redis_memoize(timeout=100, make_name=None, unless=None):
"""
?????????
:param timeout: ??????, ??100s
:param make_name: ????,???????????,???????????,?????????,??????????
:param unless: ??????????
:return: ???????????
"""
def decorator(f):
@functools.wraps(f) # ??????
def decorated_function(*args, **kwargs):
if callable(unless) and unless() is True:
return f(*args, **kwargs)
if kwargs.get('nocache'):
return f(*args, **kwargs) # ????????? nocache ???????
try:
cache_key = decorated_function.make_cache_key(make_name, args, kwargs)
rv = redis_get(cache_key)
except Exception:
if current_app.debug:
raise
return f(*args, **kwargs)
if rv is None:
rv = f(*args, **kwargs)
try:
redis_set(cache_key, rv, timeout=decorated_function.cache_timeout)
except Exception:
if current_app.debug:
raise
return f(*args, **kwargs)
return rv
def make_cache_key(make_name, keyargs, keykwargs):
fname = f.__name__
if callable(make_name):
fname = make_name(fname)
if isinstance(make_name, str):
fname = make_name
alt_fname = '.'.join((f.__module__, fname))
try:
origin_str = "{0}{1}{2}".format(alt_fname, keyargs, keykwargs)
except AttributeError:
origin_str = "%s%s%s" % (alt_fname, keyargs, keykwargs)
cache_key = hashlib.md5(origin_str.encode('utf-8')).hexdigest()
cache_key = '_'.join((get_version(level='day'), cache_key))
return cache_key
decorated_function.uncached = f
decorated_function.cache_timeout = timeout
decorated_function.make_cache_key = make_cache_key
return decorated_function
return decorator
评论列表
文章目录