Python中的缓存选项或加速urlopen的方法
大家好,我有一个网站,它可以为用户查找信息,使用的是Python语言,并且需要执行几个urlopen命令。因此,页面加载起来有点慢。我在想有没有什么办法可以让它更快一点?有没有简单的方法可以在Python中缓存数据,或者让urlopen的脚本更有效率呢?
这些urlopen命令是用来访问亚马逊的API来获取价格信息,所以网站需要保持一定的更新。我能想到的唯一办法就是写一个脚本来创建一个mySQL数据库,然后不时地运行它,但这样会很麻烦。
谢谢大家!
5 个回答
你可以使用memcached。它就是为了这个目的设计的,这样你就可以轻松地在不同的程序或脚本之间共享缓存。而且在Python中使用起来非常简单,看看这个:
Python中使用python-memcache(memcached)的好例子?
然后,当某个键不存在时,你就更新memcached,还可以通过一些定时脚本来更新,这样你就可以开始使用了。
另一个更简单的选择是自己做一个缓存,可能会把数据存储在一个字典里,或者使用cPickle把它序列化到磁盘上(如果你想让数据在不同的运行之间共享的话)。
你可以做几件事情。
urllib
的缓存机制是暂时关闭的,但你可以自己动手做一个,方法是把从亚马逊获取的数据存储在内存中或者某个文件里。和上面类似,你可以写一个单独的脚本,定期刷新价格,然后用
cron
设置每半小时运行一次(比如说)。这些数据可以存放在任何地方。你可以在一个新的线程或进程中运行获取网址的操作,因为大部分时间它都是在等待。
httplib2 是一个处理 HTTP 请求的工具,它能理解请求的缓存,稍微简化了 urllib 和 urllib2 的一些复杂之处,还支持 gzip 压缩等其他功能。
http://code.google.com/p/httplib2/
除了用这个工具获取数据,如果数据集不太大,我还会实现某种函数缓存或记忆化的功能。举个例子:
http://wiki.python.org/moin/PythonDecoratorLibrary#Memoize
修改这个装饰器,让它支持基于时间的过期也不难,比如只缓存结果 15 分钟。
如果结果比较大,那就需要考虑使用 memcached 或 redis 这样的工具了。