摘要:自帶了一個(gè)健壯的緩存系統(tǒng)來保存動(dòng)態(tài)頁面,避免每次請求都重新計(jì)算。緩存中的和方法是很常見的。盡量放在第一個(gè)繼承的類設(shè)置過期時(shí)間根據(jù)自己需求加緩存。目前這個(gè)緩存使用的是內(nèi)存。
概述:對于中等流量的網(wǎng)站來說,盡可能的減少開銷是非常必要的。緩存數(shù)據(jù)就是為了保存那些需要很多計(jì)算資源的結(jié)果,這樣的話就不必在下次重復(fù)消耗計(jì)算資源。獲取數(shù)據(jù)的數(shù)據(jù)的時(shí)候就是去緩存中拿,拿到了直接返回,沒拿到就去數(shù)據(jù)庫中查詢,篩選,然后緩存到數(shù)據(jù)庫, 然后返回給模板。
Django自帶了一個(gè)健壯的緩存系統(tǒng)來保存動(dòng)態(tài)頁面,避免每次請求都重新計(jì)算。
Django提供了不同級別的緩存策略,可以緩存特定的視圖的輸出、可以僅僅緩存那些很難計(jì)算出來的部分、或者緩存整個(gè)網(wǎng)站
目的:優(yōu)化數(shù)據(jù)結(jié)構(gòu);優(yōu)化了對數(shù)據(jù)的查詢;篩選,過濾;減少了對磁盤的IO
官方文檔:https://docs.djangoproject.co...
設(shè)置緩存通過設(shè)置決定把數(shù)據(jù)緩存在哪里,是數(shù)據(jù)庫中、文件系統(tǒng)中還是內(nèi)存中
默認(rèn)緩存(內(nèi)存)CACHES={ "default":{ "BACKEND":"django.core.cache.backends.locmem.LocMemCache", "LOCATION": "unique-snowflake", "TIMEOUT":60 } }
參數(shù)TIMEOUT:緩存的默認(rèn)過期時(shí)間,以秒為單位
默認(rèn)為300秒
設(shè)置為None,表示永不過期
設(shè)置為0造成緩存立即失效
文件緩存CACHES = { "default": { "BACKEND": "django.core.cache.backends.filebased.FileBasedCache", "LOCATION": "c:/foo/bar", "TIMEOUT":300, } }數(shù)據(jù)庫緩存
CACHES = { "default": { "BACKEND": "django.core.cache.backends.db.DatabaseCache", "LOCATION": "my_cache_table", "TIMEOUT": "60", "KEY_PREFIX": "bbs", "VERSION": "1", "OPTIONS": { "MAX_ENTRIES": "300" } } }
創(chuàng)建緩存表:?python manage.py createcachetable
drf的緩存https://github.com/chibisov/drf-extensions
這是drf的一個(gè)擴(kuò)展,不止增強(qiáng)了緩存還有其他的。
pip install drf-extensions
緩存viewset中的retrieve和list 方法是很常見的。這就是為什么CacheResponseMixin存在。
獲取數(shù)據(jù)的才會(huì)用到cache
from rest_framework_extensions.cache.mixins import CacheResponseMixin
把這個(gè)CacheResponseMixin,放在list之前。盡量放在第一個(gè)繼承的類
class GoodsListViewSet(CacheResponseMixin,mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet):設(shè)置過期時(shí)間
REST_FRAMEWORK_EXTENSIONS = { "DEFAULT_CACHE_RESPONSE_TIMEOUT": 5 }
根據(jù)自己需求加緩存。目前這個(gè)緩存使用的是內(nèi)存。每次系統(tǒng)重啟會(huì)丟失。
redis緩存官網(wǎng):?http://django-redis-chs.readt...
redis操作文檔:http://redisdoc.com
默認(rèn)使用redis中的1數(shù)據(jù)庫,但可以指定使用哪個(gè)db
安裝pip install django-redis
配置# ---配置Session和Cache--- CACHES={ "default":{ "BACKEND": "django_redis.cache.RedisCache", "LOCATION":"127.0.0.1:6379/12", # 指定db12 "TIMEOUT":60, "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", # 指定連接Redis的客戶端類 # "PASSWORD": "mysecret", # "SOCKET_CONNECT_TIMEOUT": 5, # in seconds # "SOCKET_TIMEOUT": 5, # in seconds # "CONNECTION_POOL_KWARGS": {"max_connections": 100}, # "CONNECTION_POOL_CLASS": "myproj.mypool.MyOwnPool", } } } SESSION_ENGINE = "django.contrib.sessions.backends.cache" # --結(jié)束Session和Cache配置
參數(shù) | 解釋 |
---|---|
SOCKET_CONNECT_TIMEOUT | socket 建立連接超時(shí)設(shè)置 |
SOCKET_TIMEOUT | 連接建立后的讀寫操作超時(shí)設(shè)置 |
CONNECTION_POOL_KWARGS | 設(shè)置連接池的最大連接數(shù)量 |
CONNECTION_POOL_CLASS | 自己的連接池子類 |
django-redis 使用 redis-py 的連接池接口, 并提供了簡單的配置方式. 除此之外, 你可以為 backend 定制化連接池的產(chǎn)生。redis-py 默認(rèn)不會(huì)關(guān)閉連接, 盡可能重用連接。
連接池概念
為什么使用連接池?首先Redis也是一種數(shù)據(jù)庫,它基于C/S模式,因此如果需要使用必須建立連接,稍微熟悉網(wǎng)絡(luò)的人應(yīng)該都清楚地知道為什么需要建立連接,C/S模式本身就是一種遠(yuǎn)程通信的交互模式,因此Redis服務(wù)器可以多帶帶作為一個(gè)數(shù)據(jù)庫服務(wù)器來獨(dú)立存在。假設(shè)Redis服務(wù)器與客戶端分處在異地,雖然基于內(nèi)存的Redis數(shù)據(jù)庫有著超高的性能,但是底層的網(wǎng)絡(luò)通信卻占用了一次數(shù)據(jù)請求的大量時(shí)間,因?yàn)槊看螖?shù)據(jù)交互都需要先建立連接,假設(shè)一次數(shù)據(jù)交互總共用時(shí)30ms,超高性能的Redis數(shù)據(jù)庫處理數(shù)據(jù)所花的時(shí)間可能不到1ms,也即是說前期的連接占用了29ms,連接池則可以實(shí)現(xiàn)在客戶端建立多個(gè)鏈接并且不釋放,當(dāng)需要使用連接的時(shí)候通過一定的算法獲取已經(jīng)建立的連接,使用完了以后則還給連接池,這就免去了數(shù)據(jù)庫連接所占用的時(shí)間。
配置默認(rèn)連接池
配置默認(rèn)連接池很簡單, 你只需要在?CACHES?中使用?CONNECTION_POOL_KWARGS?設(shè)置連接池的最大連接數(shù)量即可
你可以得知連接池已經(jīng)打開多少連接:
from django.core.cache import get_cache from django_redis import get_redis_connection r = get_redis_connection("default") # Use the name you have defined for Redis in settings.CACHES connection_pool = r.connection_pool print("Created connections so far: %d" % connection_pool._created_connections)
使用自己的連接池子類
有時(shí)你想使用自己的連接池子類. django-redis 提供了?CONNECTION_POOL_CLASS?來配置連接池子類
myproj/mypool.py
from redis.connection import ConnectionPool class MyOwnPool(ConnectionPool): # Just doing nothing, only for example purpose pass緩存的用法 單個(gè)view緩存
django.views.decorators.cache.cache_page裝飾器用于對視圖的輸出進(jìn)行緩存
from django.views.decorators.cache import cache_page @cache_page(60 * 2) def index(request): # return HttpResponse("sunck is a good man") return HttpResponse("sunck is a nice man")
參數(shù): timeout : 有效時(shí)長 # we"ve written it as 60 * 15 for the purpose of readability cache: 緩存到哪一個(gè)庫中;很少使用;針對于系統(tǒng)配置了多個(gè)緩存 如: @cache_page(timeout=60, cache="filecache") key_prefix: 前綴模板片段緩存
cache標(biāo)簽: 參數(shù)
緩存時(shí)間,以秒為單位
給緩存片段起名字
{#{% load static from staticfiles %}#} {% load static %} {% load cache %}原生cache主頁 {# #}sunck is a nice man
{% cache 120 sunck %}nice man
{% endcache %}
from django.core.cache import cache 查看所有緩存的key: cache.keys("*") 設(shè)置:cache.set(鍵, 值, 有效時(shí)間) 獲?。篶ache.get(鍵) 刪除:cache.delete(鍵) 清空:cache.clear() >>> cache.set_many({"a": 1, "b": 2, "c": 3}) >>> cache.getmany(["a","b","c"]) {"a": 1, "b": 2, "c": 3} cache.delete_pattern("foo_*") # 全局通配符
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/62038.html
摘要:緩存數(shù)據(jù)就是為了保存那些需要很多計(jì)算資源的結(jié)果,這樣的話就不必在下次重復(fù)消耗計(jì)算資源。自帶了一個(gè)健壯的緩存系統(tǒng)來保存動(dòng)態(tài)頁面,避免每次請求都重新計(jì)算。默認(rèn)不會(huì)關(guān)閉連接盡可能重用連接。 發(fā)送郵件 概述:Django中內(nèi)置了郵件發(fā)送功能,發(fā)送郵件需要使用SMTP服務(wù),常用的免費(fèi)服務(wù)器有:163、126、QQ 注冊并登陸163郵箱 打開POP3/SMTP服務(wù)與IMAP/SMTP服務(wù) 重置授...
摘要:官方緩存系統(tǒng)介紹配置方式及內(nèi)部實(shí)現(xiàn)機(jī)制中大體分為三種,即針對全站的緩存配置針對視圖的緩存配置針對數(shù)據(jù)的緩存配置。本站采用數(shù)據(jù)庫全站緩存。每個(gè)頁面應(yīng)該被緩存的秒數(shù)重啟就可以體驗(yàn)緩存了。 最近博客增加了許多新功能,訪問速度有所下降,在國內(nèi)某搜索引擎上查找的時(shí)候看到了這篇文字,簡單明了,所以轉(zhuǎn)發(fā)過來,雖不是原創(chuàng)但是希望能夠幫助更多的朋友。 Django 官方緩存系統(tǒng)介紹: https://d...
摘要:概述作用視圖接收請求并返回響應(yīng)方法就是在視圖里使用函數(shù)處理請求。 概述 作用:視圖接收WEB請求并返回WEB響應(yīng)方法:1. FBV(function base views)?就是在視圖里使用函數(shù)處理請求。 ? 2. CBV(class base views)?就是在視圖里使用類處理請求。 響應(yīng): 可以是一個(gè)HTML頁面,一個(gè)重定向,一個(gè)404錯(cuò)誤、一個(gè)...
有了memcached做緩存,django的速度就像飛起來了 安裝 sudo apt-get install memcached pip install python-memcached sudo apt-get install python-dev sudo apt-get install libmemcached-dev pip install pylibmc 配置 CACHES = { ...
閱讀 3907·2021-11-22 13:54
閱讀 2680·2021-09-30 09:48
閱讀 2363·2021-09-28 09:36
閱讀 3117·2021-09-22 15:26
閱讀 1346·2019-08-30 15:55
閱讀 2513·2019-08-30 15:54
閱讀 1427·2019-08-30 14:17
閱讀 2345·2019-08-28 18:25