博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[。。。]不知道是事故还是故事的东西
阅读量:4568 次
发布时间:2019-06-08

本文共 2707 字,大约阅读时间需要 9 分钟。

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

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

@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                         raise17                     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                             raise28                         logger.exception("Exception possibly due to cache backend.")29                 return rv30 31             decorated_function.uncached = f32             decorated_function.cache_timeout = timeout33             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_function38         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

转载于:https://www.cnblogs.com/fcyworld/p/7358585.html

你可能感兴趣的文章
apache+tomcat负载均衡3种实现方式
查看>>
获取数组中重复的元素
查看>>
.NetCore 使用Jenkins发布多环境下的项目并适配数据库EFCore数据库更新及替换配置文件...
查看>>
Android环境变量的设置(详细图解版)
查看>>
TextView UI美化-------自适应字体控件
查看>>
Hive与HBase区别
查看>>
ALV的html表头
查看>>
static在C和C++中的用法和区别
查看>>
CSS选择符
查看>>
JavaScript-函数
查看>>
继承的作用以及在子类中初始化所有数据的方法
查看>>
PLSQL Developer对oracle中的数据进行备份恢复
查看>>
python内置模块笔记(持续更新)
查看>>
烧死那对异性恋
查看>>
OpenStack Object Storage Developer Guide/Swift官方API文档 -- 翻译 (五)
查看>>
网络基础之物理层和数据链路层
查看>>
mysql用户
查看>>
Linux_spool命令
查看>>
Js中的字符串/数组中常用的操作
查看>>
炒冷饭系列:设计模式 装饰模式
查看>>