cachetools:Python 缓存,一个库全搞定
·
cachetools:Python 缓存,一个库全搞定
cachetools 在 GitHub 上已经拿到 2,746 Star 了。
这个库只做一件事——给 Python 函数加缓存。标准库的 @lru_cache 只有一个 LRU 策略,它直接补上了一整套:TTL、LFU、FIFO、RR 全有,用起来跟操作字典一样顺手。
1、 这东西解决什么
Python 自带的 functools.lru_cache 好用,但局限也明显。如果你的数据需要按时间过期,或者想按访问频率淘汰冷数据,标准库就接不住了。
cachetools 填补了这个空白。它把各种缓存淘汰算法做成了可变的映射对象,满了自动踢掉旧数据。关键是,它的使用体验跟标准库的 @lru_cache 一致——一个装饰器套上去就完事。

2、 三种典型用法
最简单的,内存字典缓存,适合计算结果固定的场景:
@cached(cache={})
def fib(n):
return n if n < 2 else fib(n - 1) + fib(n - 2)
LRU 缓存,控制内存上限,淘汰最近最少用的数据:
@cached(cache=LRUCache(maxsize=32))
def get_pep(num):
url = 'http://www.python.org/dev/peps/pep-%04d/' % num
with urllib.request.urlopen(url) as s:
return s.read()
TTL 缓存,数据按时间自动过期:
@cached(cache=TTLCache(maxsize=1024, ttl=600))
def get_weather(place):
return owm.weather_at_place(place).get_weather()

3、 缓存策略一览
cachetools 内置了八种缓存类:
| 类 | 淘汰策略 |
|---|---|
| Cache | 无上限,手动管理 |
| FIFOCache | 先进先出 |
| LFUCache | 最不常用优先 |
| LRUCache | 最近最少使用 |
| MRUCache | 最近最多使用 |
| RR-Cache | 随机淘汰 |
| TTLCache | 按存活时间过期 |
| TLRUCache | LRU 加 TTL 组合 |
每种缓存都实现了 Python 标准的 MutableMapping 接口,支持字典式读写。你可以直接当字典用,也可以配合 @cached 装饰器。
4、 生态和扩展
如果你用 asyncio,社区提供了 asyncache 和 cachetools-async 两个异步封装,给协程函数加缓存一样顺手。
需要持久化,shelved-cache 把 cachetools 的缓存策略对接到 Python shelve 模块,重启进程缓存还在。
CacheToolsUtils 在 cachetools 之上加了加密、统计、共享缓存等功能,后端可以挂 Redis 或 Memcached。
5、 适合哪些人用
- 写后端 API、需要给接口响应做缓存的开发者
- 做爬虫或数据管道、处理大量外部请求的场景
- 想在函数级别加缓存、暂时不想引入 Redis 这类中间件的小项目
安装只有一行:
pip install cachetools
数级别加缓存、暂时不想引入 Redis 这类中间件的小项目
安装只有一行:
pip install cachetools
更多推荐


所有评论(0)