Django緩存之django—redis

緩存

計算機的讀寫速度在不同的硬件中是不同的,通常讀寫速度由慢到快順序為:
硬盤文件 > 內存空間 > 寄存器【數據運算】
當我們的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儲存在同一個緩存服務器上,解決集群不同服務器對同一用戶頻繁訪問無法實現狀態保持的問題

來自P站畫師:WLOP
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,622評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,716評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,746評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,991評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,706評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,036評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,029評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,203評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,725評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,451評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,677評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,161評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,857評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,266評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,606評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,407評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,643評論 2 380

推薦閱讀更多精彩內容