Python中REST API的客户端缓存
一个简单的缓存,用于在客户端缓存REST API响应。这可以减少网络负载和API调用,提高性能。
我们正生活在一个启用了API的世界里。越来越多的应用程序被建立在(开放)API之上。有时频繁地调用相同的API,相同的端点和相同的参数,导致相同的响应。
对客户端缓存进行搜索并没有找到适合我使用的好的解决方案,所以我决定建立我自己的,非常简单的。在这个例子中,它缓存了来自REST apis的JSON结果。但JSON部分是可选的。
缓存建立在一个Python函数中,该函数执行一个网络调用,并将结果的JSON内容翻译成字典。当代码中某处需要REST调用时,就会用到这个函数。
json_api_call 执行一个HTTPS请求到指定的主机和基本url。params 参数必须包含URL编码的参数,例如:start=5.110%2C52.088&end=5.113%2C52.088&units=km 。
第二个版本增加了一个缓存机制。请求的URL被用作键,响应的JSON解码值是值。如果缓存返回无(第17-18行),则进行API调用并将结果存储在缓存中(第24行)。通过使用主机名、基本URL和参数,我们有一个唯一的字符串。如果API调用的头信息包含使调用唯一的相关信息,它可以被添加到密钥中。就目前的目的而言,这不是必需的。
第一个天真的实现
缓存的第一个天真实现是存储一个[key, value]对,并将其无限期地保存在缓存中。
add 函数将 [key, value] 对添加到 dictionary 中。get 方法检查 key 是否被存储在 dictionary 中,如果是,则返回相关的值。
优化的实现
这个实现有两个主要的缺点。首先,由于没有过期时间,[key, value]被无限地存储。第二,它基于(长)字符串进行键的比较,而这些字符串可能只在结尾处有差异。
第一个问题可以通过增加一个过期时间(秒)来解决。一个 [key, value] 对在这个时间之后变得无效,不会被get 方法返回,而是被从 dictionary 中删除。[key, value] 对用过期时间扩展为 [key, expiration, value]。
第二个问题可以通过使用字符串的哈希值作为 key 而不是字符串本身来解决。当一个项目被添加时,该哈希值被用作密钥。这导致了下面这个版本的Cache 对象。
在构建类的过程中,为过期时间指定了一个默认值。当一个项目被添加到缓存中时,可以通过指定timeout 参数来覆盖这个默认值(第14-16行)。第28行创建了一个默认过期时间为60秒的缓冲区。
当从缓存中检索一个值时,会检查过期时间。如果该值仍然有效,它将被返回(第20-23行)。如果过期时间已过,该值将从字典中删除(第25行)并返回None 。
最后的话
我希望你喜欢这篇文章。要想获得更多的灵感,请查看我的其他一些文章。