Django開發之redis的使用


前言:爲了提高性能,我們需要把數據庫中大部分不經常變動的數據加入到緩存中,這樣避免了用戶瀏覽數據的時候,頻繁訪問數據庫,可以提高性能。下面我們就介紹一下如何在Django中使用redis緩存!


1.Windows上安裝 Redis

點擊下載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.完整代碼下載

基於django+redis的前後端分離demo


結束!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章