type
status
date
slug
summary
tags
category
icon
password
本文实现了一个文件缓存,它类似于Python的
lru_cache, 但它将值存储在文件而不是内存中缓存函数
要使用它,只需将
file_cache装饰器添加到函数中即可。比如:与lru_cache的不同
lru_cache 非常适合用于缓存重复调用的函数,但它不支持两个关键功能。- 缓存持久化
lru_cache 将结果存储在内存中,这意味着下次运行程序时缓存将为空。 file_cache 将结果存储在磁盘上。当然,也可以使用Redis,但这需要额外的配置和成本,写入磁盘更加容易设置和管理,更适用于于一些特殊场景。lru_cache不支持参数的忽略
lru_cache 会根据函数的所有参数执行缓存策略,任意一个参数变化,都将使缓存失效。如果希望某些参数的变化不会让缓存失效,它是做不到的函数解析
文件缓存主要包括2个方法,
recursive_hash和file_cacherecursive_hash
Python本身并不支持对对象进行hash
hashlib.md5会报错TypeError: object supporting the buffer API required,而recursive_hash 则适用于任何python对象file_cache
file_cache 是一个装饰器,为我们处理缓存逻辑。缓存键的创建和失效条件
假如希望在下面两种情况下都是将缓存失效
- 函数的参数发生变化
- 函数代码发生变化
情况1通过
recursive_hash 处理,情况2使用inspect.getsource(func)将函数的源代码添加到哈希中,当代码更改时正确地丢失缓存。缓存的命中和未命中
最后,检查缓存键是否存在,并在缓存未命中的情况下写入缓存
- 作者:Jamessen
- 链接:/about/article/13b9c776-950d-80b1-86c1-e5f2699a5252
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。