天天看點

網站性能優化倆大技術:頁面靜态化和緩存資料

對網站本身性能進行優化,可以減少資料的查詢的次數,一定程度上防止惡意攻擊:DDOS(黑客控制很多電腦同時通路)

一、頁面靜态化

頁面靜态化:把原本動态的頁面處理結果儲存成html檔案,讓使用者直接通路這個生成出來的靜态的html頁面,而不需要動态的去重新請求這個頁面以及不需要頁面視圖需要重新請求資料庫, 這個可以用在未登入使用者顯示的同樣界面上頁面靜态化,登入的使用者就需要使用動态的頁面處理結果。

當管理者修改首頁表使用表中的資料時,就應該重新更改靜态頁面的資料,這個可以利用該應用中admin.py定義的模型管理類中save_model()函數以及delete_model()函數來實作,當一個模型類的資料修改或添加時,會自動調用save_model()該方法;當一個模型類的資料删除時,會自動調用delete_model()該方法。

對于靜态html頁面的生成,可以通過celery異步處理來實作,就跟發送郵件等待對方激活時不需要等待對方确認,讓celery伺服器來繼續處理。這裡也一樣,當頁面資料修改的時候,就調用celery中的tasks任務來,讓celery伺服器來處理下面的内容,而不需要管理者花費時間等待靜态html頁面的生成。

class BaseModelAdmin(admin.ModelAdmin):
    """admin管理器類"""
    def save_model(self, request, obj, form, change):
        """新增或更新表中的資料時自動調用"""
        super().save_model(request, obj, form, change)

        # 發出任務,讓celery worker重新生成首頁靜态頁面
        from celery_tasks.tasks import generate_static_index_html
        generate_static_index_html()

        # 清楚首頁的緩存資料
        cache.delete("index_page_date")

    def delete_model(self, request, obj):
        """删除表中的資料時自動調用"""
        super().delete_model(request, obj)

        # 發出任務,讓celery worker重新生成靜态頁面
        from celery_tasks.tasks import generate_static_index_html
        generate_static_index_html()

        # 清楚首頁的緩存資料
        cache.delete("index_page_date")
           
二、使用緩存

将處理計算的結果先臨時儲存起來,下次使用的時候可以先直接使用,如果沒有這個備份的資料,重新進行計算處理,将緩存資料儲存在記憶體中, 一般在首頁的圖檔這個樣的資料,基本都是一樣的,這裡就可以用到緩存資料, 緩存要設定有效期, 秒為機關

from django.core.cache import cache
 # 嘗試從緩存中擷取資料
        context = cache.get("index_page_date")
        if context is None:
            # 緩存中沒有資料
			# 省略擷取types、goods_banners、promotion_banners資訊流程
            context = {
                'types': types,
                'goods_banners': goods_banners,
                "promotion_banners": promotion_banners
            }

            # 設定緩存
            cache.set("index_page_date", context, 3600)
           

當如果修改了資料庫的資料,直接删除緩存

from django.core.cache import cache
class BaseModelAdmin(admin.ModelAdmin):
    """admin管理器類"""
    def save_model(self, request, obj, form, change):
        """新增或更新表中的資料時自動調用"""
        super().save_model(request, obj, form, change)

        # 發出任務,讓celery worker重新生成首頁靜态頁面
        from celery_tasks.tasks import generate_static_index_html
        generate_static_index_html()

        # 清楚首頁的緩存資料
        cache.delete("index_page_date")

    def delete_model(self, request, obj):
        """删除表中的資料時自動調用"""
        super().delete_model(request, obj)

        # 發出任務,讓celery worker重新生成靜态頁面
        from celery_tasks.tasks import generate_static_index_html
        generate_static_index_html()

        # 清楚首頁的緩存資料
        cache.delete("index_page_date")