[。。。]不知道是事故还是故事的东西

是这样的,今天把我的活干完,看到一段代码

然后,我发现了这样一段代码

@cache.cached(timeout=60, key_prefix='binary')
def random_binary():
    return random.sample(range(10 ** 5, 10 ** 6), 1)[0]

当时第一感觉是,为了这个东西要计算两次乘方?这个开销不必要的吧

但是还是觉得不对劲。。。仔细看了看

range(10 ** 5, 10 ** 6)

??????为了这个随机数,要生成长度九万的数组?几百k的内存???

但是,还有什么呢。。。

继续。。

生成的是随机数,然后用flask-cache缓存了??

但是用来缓存函数的不应该是flask-memoize吗?

但是随机数结果用来缓存了,还是随机数吗??

去flask-cache源码里面看一下

 1 class Cache(object):
 2     ......
 3         def memoize(self, timeout=None, make_name=None, unless=None):
 4         def memoize(f):
 5             @functools.wraps(f)
 6             def decorated_function(*args, **kwargs):
 7                 #: bypass cache
 8                 if callable(unless) and unless() is True:
 9                     return f(*args, **kwargs)
10 
11                 try:
12                     cache_key = decorated_function.make_cache_key(f, *args, **kwargs)
13                     rv = self.cache.get(cache_key)
14                 except Exception:
15                     if current_app.debug:
16                         raise
17                     logger.exception("Exception possibly due to cache backend.")
18                     return f(*args, **kwargs)
19 
20                 if rv is None:
21                     rv = f(*args, **kwargs)
22                     try:
23                         self.cache.set(cache_key, rv,
24                                    timeout=decorated_function.cache_timeout)
25                     except Exception:
26                         if current_app.debug:
27                             raise
28                         logger.exception("Exception possibly due to cache backend.")
29                 return rv
30 
31             decorated_function.uncached = f
32             decorated_function.cache_timeout = timeout
33             decorated_function.make_cache_key = self._memoize_make_cache_key(
34                                                 make_name, decorated_function)
35             decorated_function.delete_memoized = lambda: self.delete_memoized(f)
36 
37             return decorated_function
38         return memoize

cache.memoize()是利用make_cache_key(f, *args, **kwargs)作为键存入redis的,那么make_cache_key是怎么工作的?

 1             def make_cache_key(*args, **kwargs):
 2                 if callable(key_prefix):
 3                     cache_key = key_prefix()
 4                 elif '%s' in key_prefix:
 5                     cache_key = key_prefix % request.path
 6                 else:
 7                     cache_key = key_prefix
 8 
 9                 return cache_key

结果就是,不管有多少请求,只要在60秒内,返回的结果都是一样的,随机的意义在哪呢。。。唯一的好处就是不会几百k的内存消耗变成几十M吧,画面太美

参考资料:

https://github.com/thadeusb/flask-cache/blob/master/flask_cache/__init__.py#L337

posted @ 2017-08-14 16:35  wilderness  阅读(423)  评论(0编辑  收藏  举报