python-diskcache

python-diskcache

高效的Python磁盘缓存解决方案

DiskCache是一个纯Python实现的磁盘缓存库,兼容Django框架。它利用数据库和内存映射文件技术,提供高效的磁盘存储缓存方案。DiskCache支持多种缓存淘汰策略,保证线程和进程安全,并提供标签元数据、跨进程同步等功能。该库经过全面测试,具有完整的测试覆盖和压力测试,适合需要大容量高性能缓存的Python应用场景。

缓存Python数据库性能DjangoGithub开源项目

DiskCache: 基于磁盘的缓存

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 次循环,3 次中最佳用时: 25.4 µs

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 次循环,3 次中最佳用时: 11.8 µs

注意: 微基准测试有其用处,但不能替代真实测量。DiskCache 提供缓存基准测试来证明其性能主张。虽然避免了微优化,但你的实际体验可能有所不同。

DiskCache 高效地将GB级存储空间用于缓存。通过利用坚如磐石的数据库库和内存映射文件,缓存性能可以匹配甚至超越行业标准解决方案。无需 C 编译器或运行其他进程。性能是一项特性,测试覆盖率达到 100%,包括单元测试和数小时的压力测试。

推荐语

Daren Hasenkamp, 创始人 --

"这是一个有用的、简单的 API,就像我喜欢 Redis 那样。它为一个每天有超过百万用户(每秒 100 多次点击)的网站减少了超过 25% 击中 Elasticsearch 集群的查询。"

Mathias Petermann, 高级 Linux 系统工程师 --

"我将它实现到我们的 Ansible 查找模块的包装器中,我们能够将一些 Ansible 运行的速度提高近 3 倍。DiskCache 为我们节省了大量时间。"

你的公司或网站是否使用 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 安装 DiskCache 很简单::

$ 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 的文档字符串是快速入门的好方法,但并不能取代 DiskCache 教程和 DiskCache API 参考。

用户指南

对于想要更多细节的人,文档的这一部分描述了教程、基准测试、API 和开发。

比较

DiskCache_相关的流行项目的比较。

键值存储 ................

DiskCache_主要是一个简单的键值存储。下表展示了与其他四个项目的功能比较。

  • dbm_是Python标准库的一部分,它实现了一个通用接口,用于访问DBM数据库的变体 — dbm.gnu或dbm.ndbm。如果这些模块都没有安装,则会使用速度较慢但简单的dbm.dumb。
  • shelve_是Python标准库的一部分,它将"架子"实现为一个持久的、类似字典的对象。与"dbm"数据库的区别在于,其值可以是pickle模块能处理的任何对象。
  • sqlitedict_是Python的sqlite3数据库的一个轻量级封装,具有简单、Pythonic的类字典接口,并支持多线程访问。键是任意字符串,值是任意可pickle的对象。
  • pickleDB_是一个轻量级简单的键值存储。它基于Python的simplejson模块构建,并受Redis启发。它使用BSD三条款许可证。

.. _dbm: https://docs.python.org/3/library/dbm.html .. _shelve: https://docs.python.org/3/library/shelve.html .. _sqlitedict: https://github.com/RaRe-Technologies/sqlitedict .. _pickleDB: https://pythonhosted.org/pickleDB/

功能

================ ============= ========= ========= ============ ============ 功能 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_cachemru_cache。Klepto为所有缓存和存档使用简单的字典式接口。

.. _klepto: https://pypi.org/project/klepto/ .. _joblib.Memory: https://joblib.readthedocs.io/en/latest/memory.html

数据结构 ...............

  • dict_是一个映射对象,将可哈希的键映射到任意值。映射是可变对象。目前Python只有一种标准映射类型,即字典。
  • pandas_是一个Python包,提供快速、灵活和富有表现力的数据结构,旨在使处理"关系型"或"标记性"数据变得简单直观。
  • Sorted Containers_是一个Apache2许可的排序集合库,用纯Python编写,速度与C扩展相当。Sorted Containers实现了排序列表、排序字典和排序集合数据类型。

.. _dict: https://docs.python.org/3/library/stdtypes.html#typesmapping .. _pandas: https://pandas.pydata.org/ .. _Sorted Containers: http://www.grantjenks.com/docs/sortedcontainers/

纯Python数据库 .....................

  • ZODB_支持数据库操作的同构接口,这意味着使对象持久化对你的代码影响很小,并且没有部分隐藏数据库的数据库映射器。
  • CodernityDB_是一个开源的、纯Python的、多平台、无模式的NoSQL数据库,包括HTTP服务器版本和一个Python客户端库,旨在与嵌入式版本100%兼容。
  • TinyDB_是一个微型的、面向文档的数据库,为你的便利而优化。如果你需要一个具有简洁API的简单数据库,无需大量配置就能正常工作,TinyDB可能是你的正确选择。 .. _ZODB: http://www.zodb.org/ .. _CodernityDB: https://pypi.org/project/CodernityDB/ .. _TinyDB: https://tinydb.readthedocs.io/

对象关系映射(ORM) ................................

  • Django ORM_ 提供的模型是关于数据的单一、权威信息源,包含存储数据的基本字段和行为。通常,每个模型对应一个单独的SQL数据库表。
  • SQLAlchemy_ 是Python的SQL工具包和对象关系映射器,为应用程序开发者提供SQL的全部功能和灵活性。它提供了一套完整的知名企业级持久化模式。
  • Peewee_ 是一个简单而小巧的ORM。它有少量但富有表现力的概念,使其易于学习和直观使用。Peewee支持Sqlite、MySQL和PostgreSQL,并有大量扩展。
  • SQLObject_ 是一个流行的对象关系管理器,为数据库提供对象接口,将表作为类,行作为实例,列作为属性。
  • Pony ORM_ 是一个具有优美查询语法的Python ORM。使用Python语法与数据库交互。Pony将这些查询转换为SQL,并以最高效的方式在数据库中执行它们。

.. _Django ORM: https://docs.djangoproject.com/en/dev/topics/db/ .. _SQLAlchemy: https://www.sqlalchemy.org/ .. _Peewee: http://docs.peewee-orm.com/ .. _SQLObject: http://sqlobject.org/ .. _Pony ORM: https://ponyorm.com/

SQL数据库 .............

  • SQLite_ 是Python标准库的一部分,提供了一个轻量级的基于磁盘的数据库,不需要单独的服务器进程,并允许使用SQL查询语言的非标准变体访问数据库。
  • MySQL_ 是世界上最流行的开源数据库之一,已成为基于Web的应用程序的首选数据库。MySQL为Python平台和开发提供了标准化的数据库驱动程序。
  • PostgreSQL_ 是一个强大的开源对象关系数据库系统,拥有超过30年的活跃开发历史。Psycopg是Python编程语言最受欢迎的PostgreSQL适配器。
  • Oracle DB_ 是Oracle公司的关系数据库管理系统(RDBMS)。最初开发于1977年,Oracle DB是最受信赖和广泛使用的企业关系数据库引擎之一。
  • Microsoft SQL Server_ 是由Microsoft开发的关系数据库管理系统。作为数据库服务器,它根据其他软件应用程序的请求存储和检索数据。

.. _SQLite: https://docs.python.org/3/library/sqlite3.html .. _MySQL: https://dev.mysql.com/downloads/connector/python/ .. _PostgreSQL: http://initd.org/psycopg/ .. _Oracle DB: https://pypi.org/project/cx_Oracle/ .. _Microsoft SQL Server: https://pypi.org/project/pyodbc/

其他数据库 ...............

  • Memcached_ 是免费开源的、高性能、分布式内存对象缓存系统,本质上是通用的,但旨在通过减轻数据库负载来加速动态Web应用程序。
  • Redis_ 是一个开源的、内存数据结构存储,用作数据库、缓存和消息代理。它支持字符串、哈希、列表、集合、带范围查询的有序集合等数据结构。
  • MongoDB_ 是一个跨平台的面向文档的数据库程序。作为一个NoSQL数据库程序,MongoDB使用类似JSON的带模式的文档。PyMongo是在Python中使用MongoDB的推荐方式。
  • LMDB_ 是一个闪电般快速的内存映射数据库。通过内存映射文件,它具有纯内存数据库的读取性能,同时保留了标准磁盘数据库的持久性。
  • BerkeleyDB_ 是一个旨在为键/值数据提供高性能嵌入式数据库的软件库。Berkeley DB是一个程序化工具包,为桌面和服务器应用程序提供内置数据库支持。
  • LevelDB_ 是Google编写的快速键值存储库,提供了从字符串键到字符串值的有序映射。数据按键排序存储,用户可以提供自定义比较函数。

.. _Memcached: https://pypi.org/project/python-memcached/ .. _MongoDB: https://api.mongodb.com/python/current/ .. _Redis: https://redis.io/clients#python .. _LMDB: https://lmdb.readthedocs.io/ .. _BerkeleyDB: https://pypi.org/project/bsddb3/ .. _LevelDB: https://plyvel.readthedocs.io/

参考

  • DiskCache文档_
  • PyPI上的DiskCache_
  • GitHub上的DiskCache_
  • DiskCache问题追踪器_

.. _DiskCache文档: http://www.grantjenks.com/docs/diskcache/ .. _PyPI上的DiskCache: https://pypi.python.org/pypi/diskcache/ .. _GitHub上的DiskCache: https://github.com/grantjenks/python-diskcache/ .. _DiskCache问题追踪器: https://github.com/grantjenks/python-diskcache/issues/

许可证

版权所有 2016-2023 Grant Jenks

根据Apache许可证2.0版("许可证")授权;除非遵守许可证,否则不得使用此文件。你可以在以下位置获得许可证的副本:

http://www.apache.org/licenses/LICENSE-2.0

除非适用法律要求或书面同意,根据许可证分发的软件是基于"按原样"分发的,不附带任何明示或暗示的担保或条件。请参阅许可证以了解特定语言下的权限和限制。

.. _DiskCache: http://www.grantjenks.com/docs/diskcache/

编辑推荐精选

Vora

Vora

免费创建高清无水印Sora视频

Vora是一个免费创建高清无水印Sora视频的AI工具

Refly.AI

Refly.AI

最适合小白的AI自动化工作流平台

无需编码,轻松生成可复用、可变现的AI自动化工作流

酷表ChatExcel

酷表ChatExcel

大模型驱动的Excel数据处理工具

基于大模型交互的表格处理系统,允许用户通过对话方式完成数据整理和可视化分析。系统采用机器学习算法解析用户指令,自动执行排序、公式计算和数据透视等操作,支持多种文件格式导入导出。数据处理响应速度保持在0.8秒以内,支持超过100万行数据的即时分析。

AI工具酷表ChatExcelAI智能客服AI营销产品使用教程
TRAE编程

TRAE编程

AI辅助编程,代码自动修复

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
AIWritePaper论文写作

AIWritePaper论文写作

AI论文写作指导平台

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

AI辅助写作AI工具AI论文工具论文写作智能生成大纲数据安全AI助手热门
博思AIPPT

博思AIPPT

AI一键生成PPT,就用博思AIPPT!

博思AIPPT,新一代的AI生成PPT平台,支持智能生成PPT、AI美化PPT、文本&链接生成PPT、导入Word/PDF/Markdown文档生成PPT等,内置海量精美PPT模板,涵盖商务、教育、科技等不同风格,同时针对每个页面提供多种版式,一键自适应切换,完美适配各种办公场景。

AI办公办公工具AI工具博思AIPPTAI生成PPT智能排版海量精品模板AI创作热门
潮际好麦

潮际好麦

AI赋能电商视觉革命,一站式智能商拍平台

潮际好麦深耕服装行业,是国内AI试衣效果最好的软件。使用先进AIGC能力为电商卖家批量提供优质的、低成本的商拍图。合作品牌有Shein、Lazada、安踏、百丽等65个国内外头部品牌,以及国内10万+淘宝、天猫、京东等主流平台的品牌商家,为卖家节省将近85%的出图成本,提升约3倍出图效率,让品牌能够快速上架。

iTerms

iTerms

企业专属的AI法律顾问

iTerms是法大大集团旗下法律子品牌,基于最先进的大语言模型(LLM)、专业的法律知识库和强大的智能体架构,帮助企业扫清合规障碍,筑牢风控防线,成为您企业专属的AI法律顾问。

SimilarWeb流量提升

SimilarWeb流量提升

稳定高效的流量提升解决方案,助力品牌曝光

稳定高效的流量提升解决方案,助力品牌曝光

Sora2视频免费生成

Sora2视频免费生成

最新版Sora2模型免费使用,一键生成无水印视频

最新版Sora2模型免费使用,一键生成无水印视频

下拉加载更多