Django開發之redis的使用
前言:爲了提高性能,我們需要把數據庫中大部分不經常變動的數據加入到緩存中,這樣避免了用戶瀏覽數據的時候,頻繁訪問數據庫,可以提高性能。下面我們就介紹一下如何在Django中使用redis緩存!
1.Windows上安裝 Redis
下載後解壓,進入到目錄 Redis-x64-3.2.100 ,運行裏面的 redis-server.exe 就啓動了 Redis服務,如下圖所示:
2.Django項目緩存配置
2.1 安裝django-redis庫
python -m pip install django-redis -i https://pypi.tuna.tsinghua.edu.cn/simple
2.2 配置 settings.py
注意:此配置項目是在上一個《Django開發之前後端分離快速入門》項目基礎之上進行的‘。
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
# 記錄全局的緩存key,防止重複
class CK:
# 列出學生 的 緩存 key
StudentList = 'list_student'
3.代碼使用緩存
3.1 分頁查詢添加redis緩存
在 apps/students/student.py 文件開頭處,進行如下修改
from django_redis import get_redis_connection
from django_demo import settings
rconn = get_redis_connection("default")
def liststudents2(request):
"""分頁查詢"""
try:
# 查看是否有 關鍵字 搜索 參數
keywords = request.params.get('keywords', None)
# 要獲取的第幾頁
pagenum = request.params['pagenum']
# 每頁要顯示多少條記錄
pagesize = request.params['pagesize']
# 先看看緩存中是否有
cacheField = f"{pagesize}|{pagenum}|{keywords}" # 緩存 field
cacheObj = rconn.hget(settings.CK.StudentList,cacheField)
# 緩存中有,需要反序列化
if cacheObj:
print('緩存命中')
retObj = json.loads(cacheObj)
# 如果緩存中沒有,再去數據庫中查詢
else:
print('緩存中沒有')
qs = Stdudent.objects.values()
if keywords:
conditions = [Q(name__contains=one) for one in keywords.split(' ') if one]
query = Q()
for condition in conditions:
query &= condition
qs = qs.filter(query)
# 使用分頁對象,設定每頁多少條記錄
pgnt = Paginator(qs, pagesize)
# 從數據庫中讀取數據,指定讀取其中第幾頁
page = pgnt.page(pagenum)
# 將 QuerySet 對象 轉化爲 list 類型
retlist = list(page)
retObj = {'ret': 0, 'retlist': retlist, 'total': pgnt.count}
# 存入緩存
rconn.hset(settings.CK.StudentList,cacheField,json.dumps(retObj))
return JsonResponse(retObj)
except EmptyPage:
return JsonResponse({'ret': 0, 'retlist': [], 'total': 0},charset='utf-8')
except:
return JsonResponse({'ret': 2, 'msg': f'未知錯誤\n{traceback.format_exc()}'},charset='utf-8')
測試運行截圖:
第一次運行:
再次運行:
3.2 緩存數據更新
如果我們對數據庫進行了變動,這時候我們就要通知redis從新進行緩存,所以我們只需要把緩存的數據刪掉就行了。
def addstudent(request):
info = request.params['data']
try:
student = Stdudent.objects.get(name=info['name'])
except Stdudent.DoesNotExist:
student = None
if student:
return JsonResponse({'ret': 1, 'msg': '用戶名已經存在'},charset='utf-8')
record = Stdudent.objects.create(name=info['name'], number=info['number'], addre=info['addre'])
rconn.delete(settings.CK.StudentList) #刪掉緩存
return JsonResponse({'ret':0,'id':record.id})
同樣在其他需要對數據庫的數據有變動的情況下,加入刪除緩存的代碼即可!
4.完整代碼下載
結束!!!