大家好,我是木木。
今天给大家分享一个耐用的 Python 库,python-diskcache。
python-diskcache
python-diskcache 的包名是 diskcache,它把缓存落在磁盘上,底层用 SQLite 和文件系统管理数据。它不像普通内存缓存那样进程退出就丢,也不需要你额外部署 Redis。对命令行工具、数据处理脚本、本地服务和中小型后台任务来说,它很适合缓存下载结果、计算结果、临时索引和可复用中间状态。需要注意的是,它不是跨机器缓存平台,重点是本机可靠和简单。
项目地址:https://github.com/grantjenks/python-diskcache
官方文档:https://grantjenks.com/docs/diskcache/
三大特点
磁盘持久
缓存数据写到本地磁盘,进程重启后还能继续复用。
接口简单
像 dict 一样 set/get,也支持过期、memoize 和队列能力。
部署轻
不需要 Redis 服务,适合脚本、本地任务和单机应用。
最佳实践
安装方式:pip install diskcache。
第一段代码解决的问题是:创建一个本地 Cache,写入结构化值并读取出来,适合缓存下载结果或计算结果。
importtempfilefromdiskcacheimportCachefromimportlib.metadataimportversionwithtempfile.TemporaryDirectory()astmp:cache=Cache(tmp)cache.set("user:7",{"name":"Alice","score":18})cache.set("user:8",{"name":"Bob","score":9})print("package:",version("diskcache"))print("size:",len(cache))print("alice:",cache.get("user:7"))cache.close()
第二段代码解决的问题是:给缓存值设置过期时间,适合短期 token、临时接口响应和周期性刷新数据。
importtempfile,timefromdiskcacheimportCachewithtempfile.TemporaryDirectory()astmp:cache=Cache(tmp)cache.set("token","abc",expire=1)print("before sleep:",cache.get("token"))time.sleep(1.2)print("after sleep:",cache.get("token",default="expired"))print("count:",len(cache))cache.close()
环境与版本信息
本文示例使用 Python 3.11.0,diskcache 5.6.3。示例使用临时目录,不会污染本地项目目录。
高级功能
进阶一点看 memoize。如果某个函数输入稳定、输出可复用,diskcache 可以把结果写进磁盘缓存。第二次相同参数调用不会重复执行真实计算,适合慢解析、慢下载和可复用的数据转换。
importtempfilefromdiskcacheimportCachewithtempfile.TemporaryDirectory()astmp:cache=Cache(tmp)calls={"count":0}@cache.memoize()defnormalize(name):calls["count"]+=1returnname.strip().lower().replace("","-")print(normalize(" Alice Chen "))print(normalize(" Alice Chen "))print(normalize(" Bob Li "))print("real calls:",calls["count"])cache.close()
适用场景
适合本机缓存、命令行工具、数据抓取、模型中间结果、下载文件索引、重复计算结果,以及不想引入外部缓存服务的单机应用。
不适用场景
不适合多机器共享缓存、强一致分布式缓存、需要统一运维面板,或磁盘 IO 本身已经是瓶颈的高并发在线服务。
上线检查
- 给缓存目录设置容量上限和清理策略,避免磁盘被写满。
- 多进程使用前压测锁竞争和磁盘 IO,确认延迟可接受。
总结
diskcache 是一个很踏实的本地缓存选择。它没有 Redis 那样的集中能力,但在单机和脚本场景里,磁盘持久化能省掉很多重复劳动。