Django學習Day11 模型的使用(三)

2021-10-19 11:43:53 字數 3393 閱讀 3644

前面的兩篇部落格介紹了django中orm的基礎知識及其使用,我們配合使用的資料庫是關係型資料庫mysql,這篇部落格我們介紹如何在django中使用非關係型資料庫redis。

redis是乙個基於記憶體的非關係型資料庫。它通過

key:

value

的形式儲存。有著多種資料結構,如字串,列表,集合等。通過redis,

我們可以進行資料快取,防止底層資料庫頻繁

io,提公升效能。

因為mysql資料庫中的資料儲存於本地磁碟,在mysql中進行查詢,需要在磁碟進行資料的io操作,當訪問量較大的時候,頻繁的磁碟io會降低系統的效能;而redis是基於記憶體的資料庫,資料儲存在記憶體當中,查詢效能較好,如果把頻繁讀取的資料存在記憶體當中,可以極大提公升系統的效能。

下面介紹如何在django中使用redis資料庫。

這篇部落格主要實現的功能是:編寫裝飾器函式,對查詢函式進行優化,如果記憶體中存在查詢的資料,直接從記憶體中進行讀取;如果記憶體中不存在查詢的資料,則再去本地資料庫中進行查詢,然後將該資料新增到記憶體當中,下次查詢就可以從記憶體中獲取。

1. 電腦上完成redis安裝,並啟動redis服務

2. 安裝python依賴庫,django-redis

3. django專案中進行相關的配置(settings.py)

(1)django中呼叫redis

基於我們安裝的python依賴庫django_redis可以進行redis資料庫的呼叫,使用方式如下:

from django_redis import get_redis_connection

# default為我們在配置檔案中的配置資訊

conn = get_redis_connection('default')

conn.set('key', 'value', 'valid_time')

result = conn.get('key')

(2)在模型類user中實現普通的查詢函式(在本地資料庫mysql中進行查詢)

class user(models.model):

# 設定姓名為unique;不允許有相同名稱的使用者,也不允許姓名為空

name = models.charfield(max_length=50, unique=true, null=false)

# 使用者的年齡不會出現特別大的數值,因此設定為smallinteger

age = models.smallintegerfield(default=0)

# **資訊可以允許為空;設定為普通索引,將來可以根據**進行查詢

phone = models.integerfield(null=true, db_index=true)

email = models.emailfield(null=true, default='')

info = models.textfield(null=true)

create_time = models.datetimefield(auto_now_add=true)

update_time = models.datetimefield(auto_now=true)

class meta:

# 普通聯合索引

index_together = ['name','age']

# 唯一聯合索引

unique_together = ['name','phone']

# classmethod 修飾符對應的函式不需要例項化,不需要 self 引數,

# 但第乙個引數需要是表示自身類的 cls 引數,可以來呼叫類的屬性,類的方法,例項化物件等。

@classmethod

def get(cls, id):

re = cls.objects.get(id=id)

return

(3)裝飾器函式的實現

from django_redis import get_redis_connection

from functools import wraps

import json

_conn = get_redis_connection('default')

def cache(func):

@wraps(func)

# 對於用於修飾類中函式的裝飾器,第乙個引數應該是obj,對應類中函式的self或者cls

# *args表示函式實際傳入的引數

def read_from_redis(obj, *args):

key = func.__name__ + "_" + str(args[0])

# 首先從記憶體中獲取資料

result = _conn.get(key)

if result:

print('成功從redis中讀取到資料!!!')

return json.loads(result)

print('redis中沒有相關資料。。。。')

result = func(obj, *args)

add = _conn.set(key, json.dumps(result))

if add:

print('成功將資料儲存到redis中!')

return '裝飾器執行完畢'

return read_from_redis

(4)呼叫過程如下:因為user類中的get函式使用@classmethod修飾符進行修飾,所以我們在呼叫user中的get方法的時候,不需要例項化物件:

第一次呼叫get函式的時候,因為記憶體中沒有資料,所以會顯示上面的資訊,此時id=1的資料被新增到記憶體當中。

這時,我們在redis資料庫中進行檢視:

此時,記憶體中有了id=1的資料,當我們再次呼叫get函式,獲取id=1的使用者資訊時,會直接從記憶體中讀取,不再進行本地mysql查詢的步驟,如下所示:

MATLAB學習打卡Day11

書寫格式 plot3 x,y,z x,y,z為同維的向量或矩陣,有關線的規範的設定與二維的線性圖完全相同。書寫格式 bar3 y bar3 x,y bar3 width bar3 y 繪製向量y的每乙個元素的條形圖,立體條形的幅值代表元素值,條形圖的下標為向量y的序列。若y為矩陣,則產生代表矩陣每一...

機器學習學習筆記 day11

周志華 機器學習 學習筆記 最近開始學習機器學習,參考書籍西瓜書,做點筆記。第十一章 特徵選擇與稀疏學習 11.1 子集搜尋與評價 無關特徵 與訓練任務無關的特徵 冗餘特徵 包含的資訊能從其他特徵中推演出來 子集搜尋 前向 後向 雙向 子集評價 計算子集增益 資訊增益越大意味著特徵自己包含的有助於分...

手機衛士day11

系統程序顯示和隱藏 建立程序管理設定頁面 processmanagersettingactivity 編寫設定頁面布局檔案 監聽checkbox的勾選事件,更新本地sharepreference 根據本地記錄,更新checkbox狀態 boolean showsystem mprefs.getboo...