Django後臺緩存運用,提升併發

圖片防盜鏈html

  -經過請求頭refer控制nginx

  -nginx處理redis

提升網站併發的通用方法數據庫

  QPS:每秒查詢率QPS是對一個特定的查詢服務器在規定時間內所處理流量多少的衡量標準。衡量一個服務器能抗多大併發的重要標準django

   TPS:是軟件測試結果的測量單位。一個事務是指一個客戶機向服務器發送請求而後服務器作出反應的過程。客戶機在發送請求時開始計時,收到服務器響應後結束計時,以此來計算使用的時間和完成的事務個數。後端

  -使用CDN,減小自身服務器因加載靜態資源致使的資源佔用緩存

  -精靈圖服務器

  -網頁本地緩存restful

  -Nginx作負載均衡,後臺服務器作集羣部署session

  -後臺緩存

  -數據庫作主從同步

  -數據庫讀寫分離

  -異步處理(celery:分佈式的異步處理框架)

 

可預見的併發每每是好處理的,好比秒殺,定點定時刻,能夠集中資源;不可碰見的併發是最有可能致使服務器崩潰的,好比微博的星軌,不可碰見何時發生。

 

Django後臺緩存是優化併發的一個環節,一塊兒來了解它的用法:

-django中的緩存
   -Django中的緩存方式:緩存的位置
      -開發調試階段:沒有緩存
      -緩存到內存中
      -緩存到數據庫
      -緩存到文件
      -緩存到redis

 

全站緩存配置,配置文件配置:

MIDDLEWARE = [
    'django.middleware.cache.UpdateCacheMiddleware',  # 返回時全部校驗經過後更新緩存
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django.middleware.cache.FetchFromCacheMiddleware'   # 請求來時全部校驗經過後取緩存
]
CACHE_MIDDLEWARE_SECONDS=5  # 緩存更新時間


# 如下手動配置
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',  # 指定緩存使用的引擎
        'LOCATION': 'D:\django\cache',  # 指定緩存的路徑
        'TIMEOUT': 300,  # 緩存超時時間(默認爲300秒,None表示永不過時)
        'OPTIONS': {
            'MAX_ENTRIES': 300,  # 最大緩存記錄的數量(默認300)
            'CULL_FREQUENCY': 3,  # 緩存到達最大個數以後,剔除緩存個數的比例,即:1/CULL_FREQUENCY(默認3)
        }
    }
}

 

這樣配置完後,全部的視圖都有5秒鐘的緩存,5秒鐘內訪問的資源不會改變

 

單個視圖緩存配置:

CBV:

from django.views.decorators.cache import cache_page  # cache_page是個裝飾器

@method_decorator(cache_page(5),name='dispatch')  # CBV須要用類方法裝飾器裝飾,括號內數字表示緩存時長
class Book(View):
    def get(self,request):
        mytime=time.time()
        return render(request,'index.html',locals())

以上時間戳5秒更新一次

 

FBV:

from django.views.decorators.cache import cache_page

@cache_page(5)   # 直接裝飾視圖函數
def index(request):
    mytime = time.time()
    return render(request, 'index.html', locals())

頁面局部緩存:

視圖:

import time
def home(request):
    t1 = time.strftime("%Y-%m-%d %X")
    t2 = time.strftime("%Y-%m-%d %X")
    return render(request,'home.html',locals())

頁面:

<body>
t1:{{ t1 }}   {# 直接渲染,每刷新一次頁面就會更新 #}

<br>

{% load cache %}    {# 導入cache模塊 #}
{% cache 5 'text'%}  {# 使用cache標籤,5表示更新間隔,'text'是key值,區分和方便查詢 #}
    t2:{{ t2 }}
{% endcache %}

</body>

渲染效果:

 

 

先後端分離項目中的緩存

以上是在先後端不分離的項目中使用緩存,那麼在先後端分離的項目中是怎麼處理的呢?

下面一塊兒來看看!

from app01 import models
from rest_framework.response import Response
from app01.MySerailizers import UserSerailizer
from django.core.cache import cache   # 這裏須要導入另一個cache模塊
class Bolg(APIView):
    def get(self,request):
        if cache.get("text_data"):    # 判斷是否過時
            return Response(cache.get("text_data"))
        else:
            data = models.Users.object.all()
            text_data = UserSerailizer(instance=data)   # 將數據庫數據序列化
            cache.set("text_data",text_data,5)    # 設置緩存,(鍵,值,有效時間)
            return Response(text_data)

對於以上返回數據並不太符合restful規範,咱們能夠來定義一個類,包裝一下Response

from rest_framework.response import Response

class MyResponse():
    def __init__(self):
        self.status_code = 100
        self.msg = '執行成功!'
    
    def get_response(self):
        return Response(self.__dict__)

基於本身定義的類來爲返回信息增長狀態碼,錯誤信息等信息

from rest_framework.serializers import Serializer,ModelSerializer
from app01 import models

class BlogSerailzer(ModelSerializer):
    class Meta():
        model = models.Blog
        fields = "__all__"


class Blog(APIView):
    def post(self,request):
        response = MyResponse()
        ret = BlogSerailzer(data=request.data)
        if ret.isvalid():
            obj = models.Blog.object.Create(**ret.data)
            response.data = ret.data
        else:
            response.status_code = 101
            response.msg = '執行失敗!'  
            response.errors = ret.errors   # 只須要根據不一樣結果加入不一樣鍵值對便可
        return response.get_response()
相關文章
相關標籤/搜索