1. 程式人生 > 遊戲 >次世代恐怖遊戲《木衛四協議》首席創意官專訪:真實到人物面板上的每個毛孔

次世代恐怖遊戲《木衛四協議》首席創意官專訪:真實到人物面板上的每個毛孔

目錄

相關部落格

在動態網站中,使用者所有的請求,伺服器都會去資料庫中進行相應的增,刪,查,改,渲染模板,執行業務邏輯,最後生成使用者看到的頁面.

當一個網站的使用者訪問量很大的時候,每一次的的後臺操作,都會消耗很多的服務端資源,所以必須使用快取來減輕後端伺服器的壓力.

快取是將一些常用的資料儲存記憶體或者memcache中,在一定的時間內有人來訪問這些資料時,則不再去執行資料庫及渲染等操作,而是直接從記憶體或memcache的快取中去取得資料,然後返回給使用者.

快取位置通過配置檔案來操作(以檔案快取為例子

# 前後端混合開發快取的使用
#settings.py中配置

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', #指定快取使用的引擎
        'LOCATION': 'E:\cache測試',        #指定快取的路徑
        'TIMEOUT':300,              #快取超時時間(預設為300秒,None表示永不過期)
        'OPTIONS':{
            'MAX_ENTRIES': 300,            # 最大快取記錄的數量(預設300)
            'CULL_FREQUENCY': 3,           # 快取到達最大個數之後,剔除快取個數的比例,即:1/CULL_FREQUENCY(預設3)
        }
    }
}

# 前後端分離快取的使用

快取的粒度:

-全站快取
-單頁面快取
 在檢視函式上加裝飾器
-頁面區域性快取
單頁面快取
#views.py 
@cache_page(5)  # 表示快取5秒中
def test_cache(request):
    import time
    ctime = time.time()
    return render(request, 'index.html', context={'ctime': ctime})
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{{ ctime }}
</body>
</html>
頁面區域性快取

重新整理頁面時,整個網頁有一部分實現快取

def test_cache(request):
    import time
    ctime = time.time()
    return render(request, 'index.html', context={'ctime': ctime})
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!---<script src="../jQuery-3.6.0-min.js"></script>--->

</head>
<body>
{{ ctime }}

<hr>
頁面區域性快取
{% load cache %}
{% cache 5 'name' %}   #5表示5秒鐘,name是唯一key值
    {{ ctime }}
{% endcache %}
</body>
</html>
全站快取

既然是全站快取,當然要使用Django中的中介軟體.

使用者的請求通過中介軟體,經過一系列的認證等操作,如果請求的內容在快取中存在,則使用FetchFromCacheMiddleware獲取內容並返回給使用者

當返回給使用者之前,判斷快取中是否已經存在,如果不存在,則UpdateCacheMiddleware會將快取儲存至Django的快取之中,以實現全站快取

快取整個站點,是最簡單的快取方法
在 MIDDLEWARE_CLASSES 中加入 “update” 和 “fetch” 中介軟體

MIDDLEWARE_CLASSES = (
    'django.middleware.cache.UpdateCacheMiddleware', #第一
     .....
     ......
    'django.middleware.cache.FetchFromCacheMiddleware', #最後
)

“update” 必須配置在第一個
“fetch” 必須配置在最後一個
#settings.py
MIDDLEWARE_CLASSES = (
    'django.middleware.cache.UpdateCacheMiddleware',   #響應HttpResponse中設定幾個headers
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'django.middleware.cache.FetchFromCacheMiddleware',   #用來快取通過GET和HEAD方法獲取的狀態碼為200的響應

)


CACHE_MIDDLEWARE_SECONDS=10   #快取時間10秒鐘

檢視

from django.core.cache import cache
cache.set('key',value可以是任意資料型別)
cache.get('key')
#views.py
from django.core.cache import cache

class Person:
    def __init__(self,name,age):
        self.name=name
        self.age=age

def test_cache(request):
    p=Person('zhao','18')
    cache.set('name', p)
    return HttpResponse('資料放進去')


def test_cache2(request):
    p = cache.get('name')
    print(type(p))
    print(p.name)
    return HttpResponse('資料拿出來')


#urls.py
path('test/',views.test_cache),
path('test2/',views.test_cache2)