存储缓存数据#
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 用作缓存,请提交错误。
第三方缓存提供程序#
cachecontrol-django 使用 Django 的缓存机制。
cachecontrol-uwsgi 使用 uWSGI 的缓存框架。