浅析Python的Django框架中的Memcached


Posted in Python onJuly 23, 2015

动态网站的问题就在于它是动态的。 也就是说每次用户访问一个页面,服务器要执行数据库查询,启动模板,执行业务逻辑以及最终生成一个你所看到的网页,这一切都是动态即时生成的。 从处理器资源的角度来看,这是比较昂贵的。

对于大多数网络应用来说,过载并不是大问题。 因为大多数网络应用并不是washingtonpost.com或Slashdot;它们通常是很小很简单,或者是中等规模的站点,只有很少的流量。 但是对于中等至大规模流量的站点来说,尽可能地解决过载问题是非常必要的。

这就需要用到缓存了。

缓存的目的是为了避免重复计算,特别是对一些比较耗时间、资源的计算。 下面的伪代码演示了如何对动态页面的结果进行缓存。

given a URL, try finding that page in the cache
if the page is in the cache:
  return the cached page
else:
  generate the page
  save the generated page in the cache (for next time)
  return the generated page

为此,Django提供了一个稳定的缓存系统让你缓存动态页面的结果,这样在接下来有相同的请求就可以直接使用缓存中的数据,避免不必要的重复计算。 另外Django还提供了不同粒度数据的缓存,例如: 你可以缓存整个页面,也可以缓存某个部分,甚至缓存整个网站。

Django也和”上游”缓存工作的很好,例如Squid(http://www.squid-cache.org)和基于浏览器的缓存。 这些类型的缓存你不直接控制,但是你可以提供关于你的站点哪部分应该被缓存和怎样缓存的线索(通过HTTP头部)给它们
设定缓存

缓存系统需要一些少量的设定工作。 也就是说,你必须告诉它缓存的数据应该放在哪里,在数据库中,在文件系统,或直接在内存中。 这是一个重要的决定,影响您的高速缓存的性能,是的,有些类型的缓存比其它类型快。

缓存设置在settings文件的 CACHE_BACKEND中。 这里是一个CACHE_BACKEND所有可用值的解释。
内存缓冲

Memcached是迄今为止可用于Django的最快,最有效的缓存类型,Memcached是完全基于内存的缓存框架,最初开发它是用以处理高负荷的LiveJournal.com随后由Danga Interactive公司开源。 它被用于一些站点,例如Facebook和维基百科网站,以减少数据库访问,并大幅提高站点的性能。

Memcached是免费的(http://danga.com/memcached)。它作为一个守护进程运行,并分配了特定数量的内存。 它只是提供了添加,检索和删除缓存中的任意数据的高速接口。 所有数据都直接存储在内存中,所以没有对使用的数据库或文件系统的开销。

在安装了Memcached本身之后,你将需要安装Memcached Python绑定,它没有直接和Django绑定。 这两个可用版本。 选择和安装以下模块之一:

    最快的可用选项是一个模块,称为cmemcache,在http://gijsbert.org/cmemcache。

    如果您无法安装cmemcache,您可以安装python - Memcached,在ftp://ftp.tummy.com/pub/python-memcached/。如果该网址已不再有效,只要到Memcached的网站http://www.danga.com/memcached/),并从客户端API完成Python绑定。

若要使用Memcached的Django,设置CACHE_BACKEND到memcached:/ / IP:port/,其中IP是Memcached的守护进程的IP地址,port是Memcached运行的端口。

在这个例子中,Memcached运行在本地主机 (127.0.0.1)上,端口为11211:

CACHE_BACKEND = 'memcached://127.0.0.1:11211/'

Memcached的一个极好的特性是它在多个服务器间分享缓存的能力。 这意味着您可以在多台机器上运行Memcached的守护进程,该程序会把这些机器当成一个单一缓存,而无需重复每台机器上的缓存值。 要充分利用此功能,请在CACHE_BACKEND里引入所有服务器的地址,用分号分隔。

这个例子中,缓存在运行在IP地址为172.19.26.240和172.19.26.242,端口号为11211的Memcached实例间分享:

CACHE_BACKEND = 'memcached://172.19.26.240:11211;172.19.26.242:11211/'

这个例子中,缓存在运行在172.19.26.240(端口11211),172.19.26.242(端口11212),172.19.26.244(端口11213)的Memcached实例间分享:

CACHE_BACKEND = 'memcached://172.19.26.240:11211;172.19.26.242:11212;172.19.26.244:11213/'

最后有关Memcached的一点是,基于内存的缓存有一个重大的缺点。 由于缓存的数据存储在内存中,所以如果您的服务器崩溃,数据将会消失。 显然,内存不是用来持久化数据的,因此不要把基于内存的缓存作为您唯一的存储数据缓存。 毫无疑问,在Django的缓存后端不应该用于持久化,它们本来就被设计成缓存的解决方案。但我们仍然指出此点,这里是因为基于内存的缓存是暂时的。

Python 相关文章推荐
Python学习笔记(二)基础语法
Jun 06 Python
Python标准库之sqlite3使用实例
Nov 25 Python
Python实现扩展内置类型的方法分析
Oct 16 Python
Python调用C语言的方法【基于ctypes模块】
Jan 22 Python
python遍历文件夹找出文件夹后缀为py的文件方法
Oct 21 Python
python2.7使用plotly绘制本地散点图和折线图
Apr 02 Python
Flask-WTF表单的使用方法
Jul 12 Python
python中的global关键字的使用方法
Aug 20 Python
在python中使用pymysql往mysql数据库中插入(insert)数据实例
Mar 02 Python
Python的PIL库中getpixel方法的使用
Apr 09 Python
解决numpy矩阵相减出现的负值自动转正值的问题
Jun 03 Python
什么是Python变量作用域
Jun 03 Python
详解Django中的权限和组以及消息
Jul 23 #Python
在Django的模板中使用认证数据的方法
Jul 23 #Python
在Django中管理Users和Permissions以及Groups的方法
Jul 23 #Python
Django中对通过测试的用户进行限制访问的方法
Jul 23 #Python
在Django中限制已登录用户的访问的方法
Jul 23 #Python
详解Django框架中用户的登录和退出的实现
Jul 23 #Python
在Django的session中使用User对象的方法
Jul 23 #Python
You might like
几种有用的变型 PHP中循环语句的用法介绍
2012/01/30 PHP
PHP实现今天是星期几的几种写法
2013/09/26 PHP
PHP执行shell脚本运行程序不产生core文件的方法
2016/12/28 PHP
Yii框架ACF(accessController)简单权限控制操作示例
2019/04/26 PHP
防止网站内容被拷贝的一些方法与优缺点好处与坏处分析
2007/11/30 Javascript
JavaScript 事件属性绑定带参数的函数
2009/03/13 Javascript
js 分页全选或反选标识实现代码
2011/08/09 Javascript
JS图片预加载 JS实现图片预加载应用
2012/12/03 Javascript
一个JavaScript变量声明的知识点
2013/10/28 Javascript
jquery如何获取复选框的值
2013/12/12 Javascript
javascript中解析四则运算表达式的算法和示例
2014/08/11 Javascript
解决ueditor jquery javascript 取值问题
2014/12/30 Javascript
javascript同步服务器时间和同步倒计时小技巧
2015/09/24 Javascript
Node.js与Sails ~项目结构与Mvc实现及日志机制
2015/10/14 Javascript
浅谈js中StringBuffer类的实现方法及使用
2016/09/02 Javascript
jQuery Validate表单验证插件实现代码
2017/06/08 jQuery
浅谈Webpack自动化构建实践指南
2017/12/18 Javascript
JS实现图片居中悬浮效果
2017/12/25 Javascript
Vue 拦截器对token过期处理方法
2018/01/23 Javascript
解决layer图标icon不加载的问题
2019/09/04 Javascript
JS面向对象编程实现的Tab选项卡案例详解
2020/03/03 Javascript
antd vue 刷新保留当前页面路由,保留选中菜单,保留menu选中操作
2020/08/06 Javascript
[01:00:53]2018DOTA2亚洲邀请赛3月29日 小组赛B组 iG VS Secret
2018/03/30 DOTA
使用python为mysql实现restful接口
2018/01/05 Python
python删除过期log文件操作实例解析
2018/01/31 Python
python如何使用unittest测试接口
2018/04/04 Python
Python类和对象的定义与实际应用案例分析
2018/12/27 Python
Python 实现中值滤波、均值滤波的方法
2019/01/09 Python
在自动化中用python实现键盘操作的方法详解
2019/07/19 Python
Keras实现DenseNet结构操作
2020/07/06 Python
python+selenium自动化实战携带cookies模拟登陆微博
2021/01/19 Python
马来西亚在线购物市场:PGMall.my
2019/10/13 全球购物
同步和异步有何异同,在什么情况下分别使用他们?
2012/12/28 面试题
优秀团员事迹材料1000字
2014/08/20 职场文书
团拜会主持词
2015/07/04 职场文书
Mysql8.0递归查询的简单用法示例
2021/08/04 MySQL