前面的兩篇部落格介紹了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...