跳转到主要内容

磁盘缓存 -- 基于磁盘和文件的持久缓存。

项目描述

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为我们节省了大量时间。”

您的公司或网站使用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进行测试

https://github.com/grantjenks/python-diskcache/workflows/integration/badge.svg https://github.com/grantjenks/python-diskcache/workflows/release/badge.svg

快速入门

使用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的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_cachemru_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版(以下简称“许可证”);除非遵守许可证规定,否则不得使用此文件。您可以在以下地址获得许可证副本:

https://apache.ac.cn/licenses/LICENSE-2.0

除非适用法律要求或书面同意,否则在许可证下分发的软件按“原样”提供,不提供任何明示或暗示的保证或条件。有关许可证中规定的权限和限制的特定语言,请参阅许可证。

项目详情


发布历史 发布通知 | RSS订阅

下载文件

为您的平台下载文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码分发

diskcache-5.6.3.tar.gz (67.9 kB 查看哈希值)

上传时间 源代码

构建分发

diskcache-5.6.3-py3-none-any.whl (45.5 kB 查看哈希值)

上传时间 Python 3

由以下支持