緩存
計算機的讀寫速度在不同的硬件中是不同的,通常讀寫速度由慢到快順序為:
硬盤文件 > 內存空間 > 寄存器【數據運算】
當我們的web項目在大量用戶訪問大量數據的時候,已經不滿足快速展示數據,大大降低了用戶體驗,要提升程序處理的性能有一下幾種方法:
1、提高硬件配置,通過提升硬性條件提高性能
2、分布式集群部署項目,在高并發處理中有絕佳的提升
3、使用緩存——針對程序最慢的從數據庫獲取數據這一步驟進行優化
緩存是直接在內存寄存器中進行數據讀取,相對比從數據庫中讀取數據快了很多;通過緩存的方式,將頻繁查詢的數據,存儲在緩存中,省略掉了從數據庫查詢數據的過程,從而提高了數據處理性能。
Django中如何使用緩存
Django中常見的緩存手段:
1、memcache緩存
2、redis緩存
3、數據庫緩存
4、文件緩存
其中memcache和redis緩存是最常用的,這里介紹Django和redis配合完成緩存,提升性能和解決一些問題
django-redis第三方工具
官方文檔[中文]http://django-redis-chs.readthedocs.io/zh_CN/latest/
通過pip install django-redis 安裝
settings中配置django-redis
# 添加django-redis緩存配置
CACHES = {
"default": {
# 后臺引擎
"BACKEND": "django_redis.cache.RedisCache",
# 緩存器類型://host:port/1號庫
"LOCATION": "redis://127.0.0.1:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
處理函數中操作緩存
這里我們選擇將所有用戶的列表作為需要緩存的數據進行操作,首先創建用戶數據類型:
# models.py文件內容
from django.db import models
class Users(models.Model):
id = AutoField(primary_key=True)
name = models.CharField(max_length=50)
age = models.IntegerField(default=0)
birthday=models.DateField()
# 定義數據管理器對象
users_manager = models.Manager()
在處理函數中首先要引入django操作緩存的模塊,然后操作緩存
# views.py,導入包時遵循:framework > 內置庫 > 擴展庫 > 自定義包
from django.shortcuts import render redirect
from django.http import HttpResponse
from django.core.urlresolvers import reverse
from django.core.cache import cache
from datetime import datetime
from . import models
# 展示所有用戶的處理函數
def index(request):
# 首先從緩存中獲取數據,不存在則訪問數據庫并將數據添加到緩存提升以后訪問的性能
user_list = cache.get("cache_user_list")
if user_list is None:
# 數據管理器從數據庫獲取數據,按生日倒序排列
user_list = models.Users.users_manager.order_by("-birthday")
# 保存到緩存中
cache.set("cache_user_list",user_list)
return render(request,"index.html",{"user_list":user_list})
# 我們再定義一個創建用戶的處理函數
def create_user(request):
# 獲取請求體中的post數據
name = request.POST["name"]
age = request.POST.get["age"]
# 前端傳輸的數據是字符串時間如1991/01/01對其進行處理轉成時間對象入庫
birthday = request.POST["birthday"]
birthday = datetime.strptime(birthday,"%Y/%m/%d")
# 數據管理器入庫
models.Users.users_manager.create(name=name,age=age,birthday=birthday)
# 這時我們注意到了問題,添加數據后再次返回頁面時數據庫數據已經發生了改變,
# 但是緩存中的數據還是舊數據,所以需要刷新緩存,這是非常重要的步驟!
user_list = models.Users.users_manager.order_by("-birthday")
cache.set("cache_user_list",user_list)
# 直接通過路由name反向查找路由
return redirect(reverse("mysite:index"))
這樣就實現了簡單的緩存操作,但是以上的代碼有很多冗余,并且處理數據的操作函數和操作緩存的函數放在了一起,不符合編碼規范,所以對代碼進行一下改造:
# 新建一個文件cache_manager.py專門負責控制緩存的操作
from django.core.cache import cache
from . import models
def get_user_list(flush=False):
user_list = cache.get("cache_user_list")
if user_list is None or flush:
user_list = models.Users.users_manager.order_by("-birthday")
cache.set("cache_user_list",user_list)
return user_list
# views.py 修改部分
from . import cache_manager.py
def index(request):
user_list = cache_manager.get_user_list()
return render(request,"index.html",{"user_list":user_list})
def create_user(request):
...
# 刷新緩存
cache_manager.get_user_list(flush=True)
return redirect(reverse("mysite:index"))
什么樣的數據應該被緩存
通過以上的代碼我們發現如果數據頻繁被修改或新增,數據的展示總會伴隨著刷新緩存的操作,這樣反而增大了數據處理的負擔,所以頻繁改變的數據不應該被緩存,而大量的需要頻繁展示,很少改變的數據是可以被緩存的。
使用緩存:
1、大量的,頻繁展示,并且極少改變的數據;
2、需要設置過期時間,讓用戶在規定時間內操作的數據;
3、最長用的地方:分布式部署時,保證狀態保持讓所有的session儲存在同一個緩存服務器上,解決集群不同服務器對同一用戶頻繁訪問無法實現狀態保持的問題