跳转至

diskcache2

这个项目是我对 python-diskcache 的一个 fork,主要是加了完整的类型注解。原项目是个牛逼的磁盘缓存库,用 SQLite 做索引,mmap 文件存数据,性能甩 Redis 一条街,尤其在本地缓存上。

https://github.com/CNSeniorious000/diskcache2

实现亮点

核心是用 SQLite 存元数据,数据分片到多个 mmap 文件里。支持 LRU/LFU 驱逐,原子操作,线程安全。代码纯 Python,没依赖。

我加的类型注解让它在 mypy 下爽歪歪,比如 Cache[K, V] 这种泛型。没改逻辑,就是个 drop-in replacement。

性能对比

比 Redis 读快,写也稳。适合本地缓存大块数据,比如 LLM 结果或网页快照。

深入洞见

SQLite 表 Cache 包含 key, rowid, raw, store_time, expire_time, access_time, access_count, tag, size, mode, filename, value,驱逐策略通过 EVICTION_POLICY 注入不同的索引/查询来做 cull(见 core.py)。大值走文件存储,Disk.store/Disk.fetch 负责把小值放到 SQLite 列里、把大值写成文件并记录 filename,因此可以用 mmap/文件系统来避免把整块数据读进内存。数据库层通过 WAL、PRAGMA(例如 sqlite_mmap_sizesqlite_journal_mode)和触发器更新 Settings 表以保持统计和原子性;并发操作用 Cache.transact/_transact 上的显式事务和重试来保证安全。

如果想看实现细节,参考源码:

我在这个 fork 中主要补全了类型注解(例如 Cache[K, V] 泛型),没有改动核心逻辑,所以它是向后兼容的 drop-in 替代。实际场景下它适合作为本地大对象缓存(网页快照、LLM 中间结果、二进制媒体)且在单机/多线程场景里表现优秀。