Memcached 和 Gmail API 的问题与解决方案

如何使用 Memcached 缓存 Gmail API 的 HTTP 请求?一名开发者在尝试使用 Django 应用与 Gmail API 交互时遇到了一个问题,他希望在 HTTPlib2 层对请求进行缓存,但遇到了一个问题: 尽管调用成功,并且 Python 能够连接到 Memcached,但似乎在 Memcached 中从未找到键(如果正确解读了 Memcached 输出的话)。
在这里插入图片描述

2、解决方案

代码如下:

from django.core.cache import cache

flow = flow_from_clientsecrets(CLIENT_SECRET_FILE, scope=OAUTH_SCOPE)
http = httplib2.Http(cache=cache)

credentials = STORAGE.get()
if credentials is None or credentials.invalid:
    credentials = run(flow, STORAGE, http=http)

http = credentials.authorize(http)
gmail_client = build('gmail', 'v1', http=http)
batch = BatchHttpRequest()

messages = gmail_client.users().messages().list(userId='me', maxResults=1).execute()

if messages['messages']:
    for message in messages['messages']:
        batch.add(gmail_client.users().messages().get(userId='me', id=message['id'], format='metadata', fields="payload,threadId,id", metadataHeaders=['subject','date','to','from']), callback=messageCallback)

batch.execute()

根据 Memcached 的日志,我们可以观察到以下信息:

<27 new auto-negotiating client connection
27: Client using the ascii protocol
<27 get :1:https://www.googleapis.com/discovery/v1/apis/gmail/v1/rest
>27 END
<27 set :1:https://www.googleapis.com/discovery/v1/apis/gmail/v1/rest 0 300 53713
>27 STORED
<27 get :1:https://www.googleapis.com/gmail/v1/users/me/messages?alt=json&maxResults=1
>27 END
<27 get :1:https://accounts.google.com/o/oauth2/token
>27 END
<27 delete :1:https://accounts.google.com/o/oauth2/token
>27 NOT_FOUND
<27 get :1:https://www.googleapis.com/gmail/v1/users/me/messages?alt=json&maxResults=1
>27 END
<27 delete :1:https://www.googleapis.com/gmail/v1/users/me/messages?alt=json&maxResults=1
>27 NOT_FOUND
<27 get :1:https://www.googleapis.com/batch
>27 END
<27 delete :1:https://www.googleapis.com/batch
>27 NOT_FOUND
<27 quit
<27 connection closed.

经过分析,问题不在于 Memcached 本身,而是与 Gmail API 请求相关的缓存行为。

第一个请求通常是唯一发送允许缓存的缓存头部的请求。这些日志行:

<27 get :1:https://www.googleapis.com/discovery/v1/apis/gmail/v1/rest
>27 sending key :1:https://www.googleapis.com/discovery/v1/apis/gmail/v1/rest

表明缓存工作正常。此请求确实支持缓存,因为此页面发送头 Cache-Control: public, max-age=300, must-revalidate, no-transform。

其他请求(例如对 https://www.googleapis.com/batch 的请求)发送像 Cache-Control: no-cache, no-store, max-age=0, must-revalidate 这样的头。

https://www.googleapis.com/gmail/v1/users/me/messages?alt=json&maxResults=1 发送:

Date: Wed, 31 Dec 2014 22:05:35 GMT
Expires: Wed, 31 Dec 2014 22:05:35 GMT
Cache-Control: private, max-age=0

因此,除非您在同一秒内发送另一个请求,否则此页面会立即过期。

解决方法是:

  • 确保缓存头允许缓存:检查您的请求以确保它们发送允许缓存的缓存头,例如 Cache-Control: public, max-age=300。
  • 禁用缓存:禁用缓存可能是必要的,尤其是当数据必须保持最新时。您可以通过在 httplib2.Http() 构造函数中设置 disable_cache=True 来做到这一点。
  • 查看其他缓存机制:除了 Memcached,还有许多其他缓存机制可用,例如 Redis 和 MongoDB。这些机制可能具有不同的特点,更适合您的特定用例。
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值