使用緩存是提升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的作用只是讓你的緩存過期,但是不會刪除緩存的項目,這些緩存的項目依然會佔據你的內存。


推薦閱讀:
相關文章