Appengine应用清除memcache缓存的方法

最近时不时地改改本blog的代码,一个挺让我头痛的问题就是新发布的版本总是不能立马展现出来,要怪就只能怪之前我为了节约资源设置了比较长的cache过期时间。但是这总不是个事,特别是今天因为新的首页代码老出不来,bshare的网站认证就老是过不了。

于是上网Google了一下,发现在stackoverflow里大家最推崇的方法是把自己的memcache记录的key都加上应用版本号作为前缀。但是这样的话,memcache记录的更新就依赖于应用版本的更新,一来我觉得cache更新的需求并不一定是由程序版本更新引起的,二来向我这种懒人,是不可能那么勤快地去改程序版本号的。当然,最大的原因还在于,改key就得改代码,我暂时还没那么闲……

所以,上面stackoverflow链接里的那一帖中某个回复里提到的remote_api就让我感了兴趣,实际上,想要清空cache可以利用appengine提供的remote_api_shell.py连接到自己的程序,并在控制台中执行memcache记录的清空。具体步骤如下:

首先确保appengine应用能够正确地映射remote_apt所要访问的url路径,具体文档参考:http://code.google.com/appengine/articles/remote_api.html
以perlfect用的micolog程序为例,就需要在app.yaml里配置如下handler:
handlers:

    - url: /remote_api
      script: $PYTHON_LIB/google/appengine/ext/remote_api/handler.py
      login: admin

然后,就可以在命令行下使用如下命令访问并清空应用的cache了:

lobatt@fw:~/workspace/google_appengine$ python remote_api_shell.py perlfectblog
Email: lobatt@perlfect.me
Password:
App Engine remote_api shell
Python 2.6.6 (r266:84292, Sep 15 2010, 16:22:56)
[GCC 4.4.5]
The db, users, urlfetch, and memcache modules are imported.

perlfectblog> memcache.flush_all()
True

另外,这个remote shell实际上是一个python shell,所以可以用dir来查看当前对象的帮助:

perlfectblog> dir(memcache)
['CAPABILITY', 'Client', 'DELETE_ITEM_MISSING', 'DELETE_NETWORK_FAILURE', 'DELETE_SUCCESSFUL', 'FLAG_COMPRESSED', 'FLAG_TYPE_MASK', 'MAX_KEY_SIZE', 'MAX_VALUE_SIZE', 'MemcacheBatchIncrementRequest', 'MemcacheBatchIncrementResponse', 'MemcacheDeleteRequest', 'MemcacheDeleteResponse', 'MemcacheFlushRequest', 'MemcacheFlushResponse', 'MemcacheGetRequest', 'MemcacheGetResponse', 'MemcacheIncrementRequest', 'MemcacheIncrementResponse', 'MemcacheSetRequest', 'MemcacheSetResponse', 'MemcacheStatsRequest', 'MemcacheStatsResponse', 'STAT_BYTES', 'STAT_BYTE_HITS', 'STAT_HITS', 'STAT_ITEMS', 'STAT_MISSES', 'STAT_OLDEST_ITEM_AGES', 'TYPE_BOOL', 'TYPE_INT', 'TYPE_LONG', 'TYPE_PICKLED', 'TYPE_STR', 'TYPE_UNICODE', '_CLIENT', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', '_add_name_space', '_decode_value', '_key_string', '_validate_encode_value', 'add', 'add_multi', 'api_base_pb', 'apiproxy_errors', 'apiproxy_stub_map', 'cStringIO', 'capabilities', 'debuglog', 'decr', 'delete', 'delete_multi', 'disconnect_all', 'flush_all', 'forget_dead_hosts', 'get', 'get_multi', 'get_stats', 'incr', 'math', 'memcache_service_pb', 'namespace_manager', 'offset_multi', 'pickle', 'replace', 'replace_multi', 'set', 'set_multi', 'set_servers', 'setup_client', 'sha', 'types']

本文网址:http://blog.perlfect.me/2010/11/12/flushing-cache-for-google-appengine.html

comments powered by Disqus