1. 程式人生 > 其它 >django設定redis做為快取

django設定redis做為快取

快取

  • 快取就是一種優化網站效能的方案,是一個利刃,用的好可以給伺服器大量降壓,用得不好,反而成為壓垮駱駝的最後一根草。

  • 所謂的快取,實際上往往是把資料庫中資料提取出來,並臨時存放到一個第三方裝置/檔案中。

  • 一般常見的快取儲存介質:記憶體(redis/memcached/mysql的記憶體表),硬碟檔案中,CDN(內容分發網路)

  • 對於中等流量的網站來說,儘可能地減少開銷是必要的。快取資料就是為了儲存那些需要很多計算資源的結果,這樣的話就不必在下次重複消耗計算資源

  • Django自帶了一個健壯的快取系統來儲存動態頁面,避免對於每次請求都重新計算

  • Django提供了不同級別的快取粒度:可以快取特定檢視的輸出、可以僅僅快取那些很難生產出來的部分、或者可以快取整個網站

    • 檢視快取

    • 模板快取

    • 快取API

設定快取

  • 通過設定決定把資料快取在哪裡,是資料庫中、檔案系統還是在記憶體中

  • 通過settings檔案的CACHES配置來實現

  • 引數TIMEOUT:快取的預設過期時間,以秒為單位,這個引數預設是300秒,即5分鐘;設定TIMEOUT為None表示永遠不會過期,值設定成0造成快取立即失效

CACHES={
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
'TIMEOUT': 60,
}
}
  • 可以將cache存到redis中,預設採用1號資料庫,此處我們暫時沒有學習到redis,但是學習的映象中已經預裝了redis了。

  • 需要安裝包並配置如下:

安裝包:pip install django-redis-cache 或者 pip install django_redis

CACHES = {
"default": {

"BACKEND": "redis_cache.cache.RedisCache", # django-redis-cache
# "BACKEND": "django_redis.cache.RedisCache", # django_redis
"LOCATION": "redis://:@127.0.0.1:6379/1", # 資料來源格式連線寫法 mysql://賬號:密碼@IP:埠/資料庫名稱?
'TIMEOUT': 60, # 快取失效時間,這裡60秒只是為了測試而已
},
}
  • 可以連線redis檢視存的資料

# 終端下連線redis,進行redis互動終端:
redis-cli
# 切換資料庫:
select 1
# 設定一個數據,儲存到指定變數名中 set 變數 值
set name xiaoming
# 檢視資料的變數(鍵/key):
keys *
# 獲取指定變數名的資料:
get 鍵

檢視快取

  • django.views.decorators.cache定義了cache_page裝飾器,用於對檢視的輸出進行快取

  • 示例程式碼如下:

from django.views.decorators.cache import cache_page
# 函式檢視
@cache_page(60 * 15)
def index(request):
return HttpResponse('hello!')

# 類檢視
from django.views.decorators.cache import cache_page # 這個方法方法只能用於裝飾函式檢視
# 針對一些只能用於裝飾函式檢視的裝飾器,想要在類檢視方法中使用必須要使用 method_decorator 來改寫
class Home(View):
@method_decorator(cache_page(60 * 15))
def get(self,request):
print("hello") # 執行了這裡的hello,則表示快取失效了。
return HttpResponse('Hello, async base view!')
  • cache_page接受一個引數:timeout,秒為單位,上例中快取了15分鐘

  • 檢視快取與URL無關,如果多個URL指向同一檢視,每個URL將會分別快取

快取API

from django.core.cache import cache
設定:cache.set(鍵,值,有效時間)
獲取:cache.get(鍵)
刪除:cache.delete(鍵)
清空:cache.clear() # 慎用

檢視,程式碼:

from django.core.cache import cache
class CacheView(View):
def get(self,request):
# 通過快取api先查詢快取
student_list = cache.get("student_list")
if not student_list:
print("如果沒有快取,則到資料庫查詢")
student_list = Student.objects.all()
# 查詢完成建立快取 過期時間 為60秒
cache.set("student_list", student_list, 60)
print(student_list)
return HttpResponse("ok")

urls.py,程式碼:

  path("cache", views.CacheView.as_view()),