存储缓存数据#

CacheControl 带有几个存储后端,用于存储缓存的对象。

DictCache#

DictCache 是在没有提供其他缓存时使用的默认缓存。它是一个简单的线程安全字典。它不会尝试对死锁或强制清除缓存做任何智能处理,但使用起来应该是相当安全的。

此外,DictCache 不会以任何方式转换请求或响应对象。因此,不太可能将整个缓存持久化到磁盘。反过来,它应该非常快。

FileCache#

FileCache 类似于 httplib2 提供的缓存机制。它要求安装 filelock,因为它可以防止多个线程同时写入同一文件。

注意

请注意,你可以通过请求filecache 附加项,使用 pip 自动安装此依赖项

pip install cachecontrol[filecache]

以下是一个使用 FileCache 的示例

import requests
from cachecontrol import CacheControl
from cachecontrol.caches.file_cache import FileCache

sess = CacheControl(requests.Session(),
                    cache=FileCache('.web_cache'))

FileCache 支持一个 forever 标志,该标志禁用从缓存中删除。这有助于调试不需要重复的发出许多 Web 请求的应用程序。它在测试中也很有帮助。以下是如何使用它的示例

forever_cache = FileCache('.web_cache', forever=True)
sess = CacheControl(requests.Session(), forever_cache)

SeparateBodyFileCache#

这类似于 FileCache,但内存效率更高,因此如果你希望缓存大型下载,则建议使用它。 FileCache 导致的内存使用量可能是下载文件的 2 倍或 3 倍,而 SeparateBodyFileCache 应该具有固定的内存使用量。

请求的主体存储在与元数据不同的文件中,并流入和流出。

它要求安装 filelock,因为它可以防止多个线程同时写入同一文件。

注意

你可以通过请求filecache 附加项,使用 pip 自动安装此依赖项

pip install cachecontrol[filecache]

以下是如何使用缓存的示例

import requests
from cachecontrol import CacheControl
from cachecontrol.caches SeparateBodyFileCache

sess = CacheControl(requests.Session(),
                    cache=SeparatedBodyFileCache('.web_cache'))

SeparateBodyFileCache 支持与 FileCache 相同的选项。

RedisCache#

RedisCache 使用 Redis 数据库来存储值。这些值以字符串形式存储在 Redis 中,这意味着使用了 get、set 和 delete 操作。它要求安装 redis 库。

注意

请注意,您可以通过请求redis额外功能来自动使用 pip 安装此依赖项

pip install cachecontrol[redis]

RedisCache 还提供了一种清除方法来删除数据库中的所有键。显然,这应谨慎使用,因为它很幼稚,并且以迭代方式工作,循环遍历每个键并将其删除。

以下是使用 RedisCache 的示例

import redis
import requests
from cachecontrol import CacheControl
from cachecontrol.caches.redis_cache import RedisCache


pool = redis.ConnectionPool(host='localhost', port=6379, db=0)
r = redis.Redis(connection_pool=pool)
sess = CacheControl(requests.Session(), RedisCache(r))

这主要是一个概念验证,因此如果有更好的方法将 Redis 用作缓存,请提交错误。

第三方缓存提供程序#