磁盘缓存 -- 基于磁盘和文件的持久缓存。
项目描述
DiskCache 是一个Apache2许可证的磁盘和文件支持的缓存库,用纯Python编写,与Django兼容。
2023年的基于云的计算非常重视内存。由于进程争抢内存,磁盘上留下了大量的空白空间。在这些进程中包括Memcached(有时还包括Redis),它们被用作缓存。利用这些空白磁盘空间进行缓存不是很好吗?
Django是Python最受欢迎的Web框架,并附带几个缓存后端。不幸的是,Django中的基于文件的缓存基本上是损坏的。清除方法是随机的,大缓存反复扫描缓存目录,随着增长而线性减速。您真的能让它花费六十毫秒在包含一千个项的缓存中存储一个键吗?
在Python中,我们可以做得更好。而且我们可以用纯Python来做!
In [1]: import pylibmc In [2]: client = pylibmc.Client(['127.0.0.1'], binary=True) In [3]: client[b'key'] = b'value' In [4]: %timeit client[b'key'] 10000 loops, best of 3: 25.4 µs per loop In [5]: import diskcache as dc In [6]: cache = dc.Cache('tmp') In [7]: cache[b'key'] = b'value' In [8]: %timeit cache[b'key'] 100000 loops, best of 3: 11.8 µs per loop
注意:微基准测试有其位置,但不能代替真实测量。DiskCache提供缓存基准测试以支持其性能主张。避免微优化,但您的里程可能不同。
磁盘缓存高效地提供数GB的存储空间用于缓存。通过利用坚如磐石的数据库库和内存映射文件,缓存性能可以匹配甚至超过行业标准解决方案。无需C编译器或运行其他进程。性能是特色,测试覆盖率达到100%,包括单元测试和数小时的压力测试。
客户评价
Daren Hasenkamp,创始人 –
“这是一个有用且简单的API,就像我喜欢Redis一样。它使我的Elasticsearch集群的查询量减少了25%以上,而这个网站每天有超过一百万用户(每秒100+次点击)。”
Mathias Petermann,高级Linux系统工程师 –
“我将其实现为我们Ansible查找模块的包装器中,我们能够将Ansible运行的某些部分速度提高了近3倍。DiskCache为我们节省了大量时间。”
特性
纯Python
完全文档化
基准比较(替代方案、Django缓存后端)
100%测试覆盖率
数小时的压力测试
性能至关重要
Django兼容的API
线程安全和进程安全
支持多种驱逐策略(包括LRU和LFU)
键支持“标签”元数据和驱逐
基于Python 3.10开发
在CPython 3.6、3.7、3.8、3.9、3.10上进行了测试
在Linux、Mac OS X和Windows上进行了测试
使用GitHub Actions进行测试
快速入门
$ pip install diskcache
您可以使用Python的内置帮助函数在解释器中访问文档
>>> import diskcache >>> help(diskcache) # doctest: +SKIP
DiskCache的核心是三个用于缓存的内置数据类型。Cache对象管理SQLite数据库和文件系统目录来存储键值对。FanoutCache提供了一层分片层,用于利用多个缓存,而DjangoCache则与Django集成。
>>> from diskcache import Cache, FanoutCache, DjangoCache >>> help(Cache) # doctest: +SKIP >>> help(FanoutCache) # doctest: +SKIP >>> help(DjangoCache) # doctest: +SKIP
在缓存数据类型之上,还有Deque和Index,它们作为Python的collections.deque和dict的跨进程、持久替代品。这些实现了序列和映射容器基类
>>> from diskcache import Deque, Index >>> help(Deque) # doctest: +SKIP >>> help(Index) # doctest: +SKIP
最后,提供了一些使用底层缓存的跨进程同步菜谱。这些特性包括带有缓存雪崩预防的缓存记忆化、跨进程锁定和跨进程节流。
>>> from diskcache import memoize_stampede, Lock, throttle >>> help(memoize_stampede) # doctest: +SKIP >>> help(Lock) # doctest: +SKIP >>> help(throttle) # doctest: +SKIP
Python的docstrings是一个快速入门的好方法,但不打算替代DiskCache教程和DiskCache API参考。
用户指南
对于需要更多细节的人来说,本部分文档描述了教程、基准、API和开发。
比较
与DiskCache相关的流行项目的比较。
键值存储
《DiskCache》主要是一个简单的键值存储。下表显示了与其他四个项目的功能比较。
《dbm》是Python标准库的一部分,实现了对DBM数据库变体的通用接口——dbm.gnu或dbm.ndbm。如果这些模块都没有安装,则使用慢但简单的dbm.dumb。
《shelve》是Python标准库的一部分,实现了一个持久性的、类似字典的对象,称为“shelf”。与“dbm”数据库的不同之处在于,值可以是pickle模块可以处理的所有内容。
《sqlitedict》是Python的sqlite3数据库的一个轻量级包装器,具有简单、Python风格的dict-like接口和多线程访问支持。键是任意的字符串,值是任意可pickle对象。
《pickleDB》是一个轻量级且简单的键值存储。它基于Python的simplejson模块构建,并受到Redis的启发。它使用BSD三条款许可证。
特性
功能 |
diskcache |
dbm |
shelve |
sqlitedict |
pickleDB |
---|---|---|---|---|---|
原子性? |
总是 |
可能 |
可能 |
可能 |
不 |
持久性? |
是 |
是 |
是 |
是 |
是 |
线程安全? |
是 |
不 |
不 |
是 |
不 |
进程安全? |
是 |
不 |
不 |
可能 |
不 |
后端? |
SQLite |
DBM |
DBM |
SQLite |
文件 |
序列化? |
可定制 |
无 |
Pickle |
可定制 |
JSON |
数据类型? |
映射/双端队列 |
映射 |
映射 |
映射 |
映射 |
排序? |
插入/排序 |
无 |
无 |
无 |
无 |
驱逐? |
LRU/LFU/更多 |
无 |
无 |
无 |
无 |
真空? |
自动 |
可能 |
可能 |
手动 |
自动 |
事务? |
是 |
不 |
不 |
可能 |
不 |
多进程? |
是 |
不 |
不 |
不 |
不 |
可分叉? |
是 |
不 |
不 |
不 |
不 |
元数据? |
是 |
不 |
不 |
不 |
不 |
质量
项目 |
diskcache |
dbm |
shelve |
sqlitedict |
pickleDB |
---|---|---|---|---|---|
测试? |
是 |
是 |
是 |
是 |
是 |
覆盖率? |
是 |
是 |
是 |
是 |
不 |
压力测试? |
是 |
不 |
不 |
不 |
不 |
CI测试? |
Linux/Windows |
是 |
是 |
Linux |
不 |
Python? |
2/3/PyPy |
所有 |
所有 |
2/3 |
2/3 |
许可证? |
Apache2 |
Python |
Python |
Apache2 |
3条款BSD |
文档? |
详尽 |
摘要 |
摘要 |
README |
摘要 |
基准测试? |
是 |
不 |
不 |
不 |
不 |
源代码? |
GitHub |
GitHub |
GitHub |
GitHub |
GitHub |
纯Python? |
是 |
是 |
是 |
是 |
是 |
服务器? |
不 |
不 |
不 |
不 |
不 |
集成? |
Django |
无 |
无 |
无 |
无 |
计时
这些是粗略的测量值。有关更严格的数据,请参阅DiskCache 缓存基准测试。
项目 |
diskcache |
dbm |
shelve |
sqlitedict |
pickleDB |
---|---|---|---|---|---|
get |
25 µs |
36 µs |
41 µs |
513 µs |
92 µs |
set |
198 µs |
900 µs |
928 µs |
697 µs |
1,020 µs |
delete |
248 µs |
740 µs |
702 µs |
1,717 µs |
1,020 µs |
缓存库
joblib.Memory提供缓存函数,通过显式将输入和输出保存到文件来工作。它旨在与无法哈希的以及可能的大型输入和输出数据类型(如numpy数组)一起使用。
klepto扩展Python的lru_cache,以利用不同的键映射和替代缓存算法,如lfu_cache和mru_cache。klepto对所有缓存和存档使用简单的字典样式接口。
数据结构
dict是一个将可哈希键映射到任意值的映射对象。映射是可变对象。目前只有一个标准的Python映射类型,即字典。
pandas是Python的一个包,提供快速、灵活且表达性强的数据结构,旨在使处理“关系”或“标签”数据既容易又直观。
Sorted Containers是一个Apache2许可的排序集合库,使用纯Python编写,速度快如C扩展。Sorted Containers实现了排序列表、排序字典和排序集合数据类型。
纯Python数据库
ZODB 支持同构数据库操作接口,这意味着在使对象持久化时对代码的影响很小,并且没有部分隐藏数据库的数据库映射器。
CodernityDB 是一个开源、纯 Python、跨平台、无模式的 NoSQL 数据库,包含一个 HTTP 服务器版本和一个与嵌入式版本 100% 兼容的 Python 客户端库。
TinyDB 是一个小巧的面向文档的数据库,优化了您的愉悦感。如果您需要一个简单、API 清晰、无需大量配置即可正常工作的数据库,TinyDB 可能是您的正确选择。
对象关系映射(ORM)
Django ORM 提供了模型,它们是关于数据的唯一、最终信息来源,并包含存储数据的必要字段和行为。通常,每个模型映射到单个 SQL 数据库表。
SQLAlchemy 是一个 Python SQL 工具包和对象关系映射器,它为应用开发者提供了 SQL 的全部功能和灵活性。它提供了一套全面的企业级持久性模式。
Peewee 是一个简单且小巧的 ORM。它有几个(但表达性强的)概念,使其易于学习和直观使用。Peewee 支持 Sqlite、MySQL 和 PostgreSQL,并拥有大量扩展。
SQLObject 是一个流行的对象关系管理器,用于提供数据库的对象接口,其中表是类,行是实例,列是属性。
Pony ORM 是一个具有优美查询语法的 Python ORM。使用 Python 语法与数据库交互。Pony 将此类查询转换为 SQL 并以最有效的方式在数据库中执行。
SQL 数据库
SQLite 是 Python 的标准库的一部分,提供了一个轻量级的基于磁盘的数据库,不需要单独的服务器进程,并允许使用 SQL 查询语言的非标准变体访问数据库。
MySQL 是世界上最受欢迎的开源数据库之一,已经成为基于 Web 的应用程序的首选数据库之一。MySQL 包含了适用于 Python 平台和开发的标准化数据库驱动程序。
PostgreSQL 是一个功能强大的开源对象关系数据库系统,已有 30 多年的活跃开发历史。Psycopg 是 Python 编程语言中最受欢迎的 PostgreSQL 适配器。
Oracle DB 是 Oracle 公司的一个关系数据库管理系统(RDBMS)。最初于 1977 年开发,Oracle DB 是最受信任和最广泛使用的企业级关系数据库引擎之一。
Microsoft SQL Server 是由 Microsoft 开发的一个关系数据库管理系统。作为数据库服务器,它根据其他软件应用程序的请求存储和检索数据。
其他数据库
Memcached 是一个免费和开源的高性能分布式内存对象缓存系统,本质上是一般的,但旨在通过减轻数据库负载来加速动态 Web 应用程序。
Redis 是一个开源的内存数据结构存储库,用作数据库、缓存和消息代理。它支持字符串、散列、列表、集合、范围查询等数据结构。
MongoDB 是一个跨平台的面向文档的数据库程序。作为一个 NoSQL 数据库程序,MongoDB 使用具有模式的 JSON 类似的文档。PyMongo 是从 Python 操作 MongoDB 的推荐方式。
LMDB 是一个快速的内存映射数据库。通过内存映射文件,它具有纯内存数据库的读取性能,同时保留标准基于磁盘的数据库的持久性。
伯克利数据库(BerkeleyDB)是一个旨在提供高性能嵌入式数据库的软件库,用于键/值数据。伯克利数据库是一个程序工具包,为桌面和服务器应用程序提供内置的数据库支持。
LevelDB是Google编写的一个快速键值存储库,它提供从字符串键到字符串值的有序映射。数据按键排序存储,用户可以提供自定义比较函数。
参考资料
许可证
版权所有 2016-2023 Grant Jenks
本文件许可协议为Apache许可证第2版(以下简称“许可证”);除非遵守许可证规定,否则不得使用此文件。您可以在以下地址获得许可证副本:
除非适用法律要求或书面同意,否则在许可证下分发的软件按“原样”提供,不提供任何明示或暗示的保证或条件。有关许可证中规定的权限和限制的特定语言,请参阅许可证。
项目详情
下载文件
为您的平台下载文件。如果您不确定选择哪个,请了解更多关于安装包的信息。