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()

README区域截图

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

更多推荐