Django緩存機制以及使用redis緩存數據庫

Django 配置緩存機制

Django 是動態網站,通常來講須要實時地生成訪問的網頁,展現給訪問者,這樣,內容能夠隨時變化,可是從數據庫讀屢次把所須要的數據取出來,要比從內存或者硬盤等一次讀出來 付出的成本大不少。而使用緩存的話,能夠將數據保存在緩存中,下次訪問的時候直接從緩存中得到數據,而不用去請求後端數據庫,這樣服務器能夠很快的響應請求,從而提升加載速度。python

緩存系統工做原理

對於給定的網址,嘗試從緩存中找到網址,若是頁面在緩存中,直接返回緩存的頁面,若是緩存中沒有,一系列操做(好比查數據庫)後,保存生成的頁面內容到緩存系統以供下一次使用,而後返回生成的頁面內容。linux

通常來講咱們用 Django 來搭建一個網站,要用到數據庫等。redis

from django.shortcuts import render
def index(request):
    # 讀取數據庫等 並渲染到網頁
    # 數據庫獲取的結果保存到 queryset 中
    return render(request, 'index.html', {'book_list':book_list})

像這樣每次訪問都要讀取數據庫,通常的小網站沒什麼問題,當訪問量很是大的時候,就會有不少次的數據庫查詢,確定會形成訪問速度變慢,服務器資源佔用較多等問題。數據庫

當使用了cache後,訪問狀況就變化了。django

from django.shortcuts import render
from django.views.decorators.cache import cache_page

@cache_page(60 * 15) # 秒數,這裏指緩存 15 分鐘,不直接寫900是爲了提升可讀性
def index(request):
    # 讀取數據庫等 並渲染到網頁
    return render(request, 'index.html', {'book_list':book_list})


# 訪問一個網址時, 嘗試從 cache 中找有沒有緩存內容
# 若是網頁在緩存中顯示緩存內容,不然生成訪問的頁面,保存在緩存中以便下次使用,顯示緩存的頁面。

Django settings 中 默認cache

也就是默認利用本地的內存來當緩存,速度很快。後端

固然可能出來內存不夠用的狀況api

from  django.conf import settings
print(settings.CACHES)
{'default': {'BACKEND': 'django.core.cache.backends.locmem.LocMemCache'}}


{
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
    }
}

下面咱們就來介紹一下各類緩存的配置:緩存

緩存配置

利用文件系統來緩存

這個很簡單,就是將數據緩存在指定的目錄中。配置以下:服務器

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
        'LOCATION': '/var/tmp/django_cache',    # linux 中的目錄,前提目錄必須存在
        'TIMEOUT': 600,
        'OPTIONS': {
            'MAX_ENTRIES': 1000
        }
    }
}

使用Memcache來緩存:

Memcached 是目前 Django 可用的最快的緩存,

可是memcache須要你的服務器支持,也就是說須要有Memcache服務,

Linux系統安裝Memcached,首先要先安裝libevent庫。

$ yum -y install libevent ibevent-devel         聯網自動下載安裝

$ yum -y install install memcached      linux安裝memcached 的方法我就不說了,本身去找去

而後須要pip3安裝Memcached的插件Python-mencached 和 pylibmc

$ pip3 install Python-mencached
$ pip3 install pylibmc

最後在setting.py配置:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '127.0.0.1:11211',
        'TIMEOUT': 600,
        'OPTIONS': {
            'MAX_ENTRIES': 2000
        }
    }
}

使用Local-memory來緩存:

這種緩存方式會將數據保存在服務器的內存中。

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
        'LOCATION': 'unique-snowflake',
        'TIMEOUT': 600,
        'OPTIONS': {
            'MAX_ENTRIES': 2000
        }
    }
}

最推薦的緩存方式是Memcache或者Local-memory,要不就是文件緩存

Django使用Redis做爲緩存

redis相信你們都很熟悉了,和memcached同樣是一個高性能的key-value數據庫,至於什麼是緩存服務器,度娘都有很明白的介紹了,

安裝該數據庫是爲了作服務器緩存。如下兩種狀況都適合使用服務器緩存:

1)數據非常常更新。若每次都從硬盤讀取一次,浪費服務器資源、拖慢響應速度。

2)數據更新頻率較高,服務器負擔比較大。

這些數據只需天天更新一次。而我每次都從數據庫獲取相應的數據,計算統計排行狀況和閱讀數。很明顯浪費服務器資源,浪費時間。解決方法是定時統計一次數據,保存到數據庫或文件中。每次讀取數據從中獲取。

若保存到數據庫,還須要額外創建一張對應的表存儲數據。在Django中創建表一般作法是創建一個模型。看似簡單,問題調試麻煩、開發時長久。因此我一直拖着沒處理該問題。畢竟一開始訪問量不是不少。後來很多網友訪客打開慢(固然服務器在國外也是個緣由),查了資料發現Redis內存數據庫。能夠將數據寫入到內存,再進行讀寫。減小計算量,能夠有效提升服務器響應速度。

這麼一來,我就不用建立新表建立模型。直接將數據寫入緩存,定時更新。獲取數據從服務器緩存獲取便可。

下面我就來介紹如何在Django中配置使用redis數據庫!

安裝django-redis

pip3 install django-redis

settings配置

# redis 緩存數據庫配置
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://192.168.32.130:6379",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "CONNECTION_POOL_KWARGS": {"max_connections": 100},
            "DECODE_RESPONSES":True,
            "PASSWORD": "root",
        }
    }
}

views視圖中使用redis

# 視圖中使用redis緩存數據庫
from django_redis import get_redis_connection
conn = get_redis_connection('default')

全站緩存

在django中的settings配置文件中設置

'django.middleware.cache.UpdateCacheMiddleware',
# 其餘中間件...
'django.middleware.cache.FetchFromCacheMiddleware',

單視圖緩存

from django.views.decorators.cache import cache_page

@cache_page(60 * 15)
def cache(request):
    # return HttpResponse('hello')      # 當咱們第一次訪問的時候,redis中已經存在了一個hello的值,當咱們發送的數據發生改變的時候,這時候由於過時時間還沒到,不會清除緩存的信息。
    return HttpResponse('hellodsafnjsakfaskfg')

在頁面中局部進行緩存

  • 使用cache模板標籤來緩存模板的一個片斷
  • 須要兩個參數:
    • 緩存時間,以秒爲單位
    • 給緩存片斷起的名稱
步驟I. 引入TemplateTag
        {% load cache %}
步驟II. 使用緩存
        {% cache 5000 緩存key %}      緩存時間 5000秒
            緩存內容
        {% endcache %}

底層的緩存API

from django.core.cache import cache

設置:cache.set(鍵,值,有效時間)
獲取:cache.get(鍵)
刪除:cache.delete(鍵)
清空:cache.clear()
相關文章
相關標籤/搜索