浅析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进行新浪微博的mid和url互相转换实例(10进制和62进制互算)
Apr 25 Python
python实现根据月份和日期得到星座的方法
Mar 27 Python
python类和函数中使用静态变量的方法
May 09 Python
使用Python编写爬虫的基本模块及框架使用指南
Jan 20 Python
Python中运算符"=="和"is"的详解
Oct 08 Python
python绘制铅球的运行轨迹代码分享
Nov 14 Python
python用BeautifulSoup库简单爬虫实例分析
Jul 30 Python
python如何查看微信消息撤回
Nov 27 Python
python使用phoenixdb操作hbase的方法示例
Feb 28 Python
python调用接口的4种方式代码实例
Nov 19 Python
python队列原理及实现方法示例
Nov 27 Python
使用opencv识别图像红色区域,并输出红色区域中心点坐标
Jun 02 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
一些星际专用术语解释
2020/03/04 星际争霸
基于Zookeeper的使用详解
2013/05/02 PHP
PHP获取本周第一天和最后一天示例代码
2014/02/24 PHP
在PHP模板引擎smarty生成随机数的方法和math函数详解
2014/04/24 PHP
yii2中添加验证码的实现方法
2016/01/09 PHP
Yii Framework框架开发微信公众平台示例
2020/04/26 PHP
JQuery 绑定select标签的onchange事件,弹出选择的值,并实现跳转、传参
2011/01/06 Javascript
js中继承的几种用法总结(apply,call,prototype)
2013/12/26 Javascript
jQuery简单图表peity.js使用示例
2014/05/02 Javascript
javascript进行四舍五入方法汇总
2014/12/16 Javascript
jQuery选择id属性带有点符号元素的方法
2015/03/17 Javascript
JavaScript定义数组的三种方法(new Array(),new Array('x','y')
2016/10/04 Javascript
jQuery插件MovingBoxes实现左右滑动中间放大图片效果
2017/02/28 Javascript
angular中实现控制器之间传递参数的方式
2017/04/24 Javascript
nodejs 子进程正确的打开方式
2017/07/03 NodeJs
JavaScript函数绑定用法实例分析
2017/11/14 Javascript
Angular实现可删除并计算总金额的购物车功能示例
2017/12/26 Javascript
深入理解js 中async 函数的含义和用法
2018/05/13 Javascript
详解AngularJS 过滤器的使用
2018/06/02 Javascript
对angularJs中ng-style动态改变样式的实例讲解
2018/09/30 Javascript
Vue.js实现开发购物车功能的方法详解
2019/02/22 Javascript
VUE 直接通过JS 修改html对象的值导致没有更新到数据中解决方法分析
2019/12/02 Javascript
django在接受post请求时显示403forbidden实例解析
2018/01/25 Python
python tensorflow学习之识别单张图片的实现的示例
2018/02/09 Python
Python拼接微信好友头像大图的实现方法
2018/08/01 Python
Python continue语句实例用法
2020/02/06 Python
numpy 矩阵形状调整:拉伸、变成一位数组的实例
2020/06/18 Python
Python实现手绘图效果实例分享
2020/07/22 Python
拥有超过850家商店的美国在线派对商店:Party City
2018/10/21 全球购物
初中毕业生的自我评价
2014/03/03 职场文书
学习教师敬业奉献模范事迹材料思想汇报
2014/09/19 职场文书
同学毕业留言寄语
2015/02/27 职场文书
中学语文教学反思
2016/02/16 职场文书
MySQL索引是啥?不懂就问
2021/07/21 MySQL
Win11怎么修改电源模式?Win11修改电源模式的方法
2022/04/05 数码科技
Android实现图片九宫格
2022/06/28 Java/Android