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


Django 配置緩存機制

**Django ** 是動態網站,一般來說需要實時地生成訪問的網頁,展示給訪問者,這樣,內容可以隨時變化,但是從數據庫讀多次把所需要的數據取出來,要比從內存或者硬盤等一次讀出來 付出的成本大很多。而使用緩存的話,可以將數據保存在緩存中,下次訪問的時候直接從緩存中獲得數據,而不用去請求后端數據庫,這樣服務器可以很快的響應請求,從而提高加載速度。

緩存系統工作原理

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

一般來說我們用 Django 來搭建一個網站,要用到數據庫等。

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

像這樣每次訪問都要讀取數據庫,一般的小網站沒什么問題,當訪問量非常大的時候,就會有很多次的數據庫查詢,肯定會造成訪問速度變慢,服務器資源占用較多等問題。

當使用了cache后,訪問情況就變化了。

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

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

當然可能出來內存不夠用的情況

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()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM