使用缓存是提升Django网站访问速度的方法之一,而且Django支持多种形式的缓存方式,包括Memcached缓存,文件缓存,Redis缓存等。具体的介绍可以查看英文官方文档,也可查看中文翻译教程:

  • 官方文档:docs.djangoproject.com/
  • 中文教程:liujiangblog.com/course

今天给大家介绍的是如何通过使用Memcached缓存加速你的Django网站,这里我以我的个人博客网站:eastnotes.com为例,给大家做实例演示,废话不多说,接下来详解具体步骤。

1.所需环境

  • 可正常运行的Django网站一个:eastnotes.com
  • Ubuntu:线上部署环境
  • Memcached软体:非Django自带,需独立安装在Ubuntu中
  • python-memcached:这是一个python库,有了它Django才能够使用Memcached缓存

2. 安装Memcached

sudo apt-get install memcached

然后安装memcached的依赖环境:

sudo apt-get install libevent-dev

使用下面的命令测试memcached是否安装正确,没有报错即安装成功

memcached -help

3.运行Memcached

memcached -d -m 512 -l 127.0.0.1 -p 11211 -u root

  • -d:表示启动守护进程
  • -l: 是监听的伺服器IP地址,这里我们填本地
  • -p:是埠号
  • -u:指定用哪个用户来运行,这里指定root

使用下面的命令查看Memcached是否正常运行

ps -ef | grep memcached

如果结果类似于如下,则表示启动成功

memcache 3652 1 0 16:43 ? 00:00:00 /usr/bin/memcached -m 64 -p 11211 -u memcache -l 127.0.0.1
root 4719 2099 0 16:54 pts/0 00:00:00 grep --color=auto memcached

如果想要关掉Memcached可使用kill命令

kill -9 进程id

4.连接Memcached

这里我们使用telnet来连接,但是ubuntu中默认没有它,所以需要安装

apt-get install telnet

然后尝试连接:

telnet 127.0.0.1 11211

若提示如下,表示连接成功,然后输入quit就可以退出telnet

Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is ^].

此时,Memcached就已经成功安装在了Ubuntu中,接下来我们安装python-memcached,如果你使用的是python的虚拟环境,请一定要切换到Django项目所在的python虚拟环境:

pip install python-memcached

5.配置Django

首先我们在django的配置文件settings.py中添加如下代码:

CACHES = {
default: {
BACKEND: django.core.cache.backends.memcached.MemcachedCache,
LOCATION: 127.0.0.1:11211,
}
}

然后设置缓存时间,由于我的网站更新并不频繁,所以我设置1天,也就是60*60*12秒

CACHE_MIDDLEWARE_SECONDS=900

接著我们在中间件MIDDLEWARE添加memcached所需Django中间件,由于我选择的是缓存全站,所以需要的东西如下:

MIDDLEWARE = [
# 缓存全站
django.middleware.cache.UpdateCacheMiddleware,
django.middleware.common.CommonMiddleware,
django.middleware.cache.FetchFromCacheMiddleware,
]

好了,以上就是我们的全部配置和安装,重启nginx和uwsgi之后你就可以打开网站测速了,第一次打开的时候可能会比较慢,因为此时刚刚把你请求的东西放到缓存中,当你再次打开,或者说在你刚刚设定的缓存时间内打开,都是秒开的。

5.注意事项

启用缓存之后网站的访问速度是提升了,但是有一点你需要清楚,就是说当你在后台更新网站内容的时候,比如说新增一篇文章,网站的首页不会立即显示这篇文章,因为首页的内容已经被放到了缓存中,当你再次访问的时候,Django不是从资料库中捞数据,而是从缓存中捞数据。

当然,我们可以使用如下的命令简单地清除当下的缓存:

# 连接memcached
telnet 127.0.0.1 11211

# 清除缓存
flush_all

flush_all的作用只是让你的缓存过期,但是不会删除缓存的项目,这些缓存的项目依然会占据你的内存。


推荐阅读:
相关文章