# 緩存
* 緩存數據就是為了保存需要計算資源的結果,這樣的話就不必在下次重復消耗計算資源
* Django自帶了一個健壯的緩存系統來保存動態頁面,避免對于每次請求都重新計算
* Django提供了不同級別的緩存粒度,可以緩存特定視圖的輸出,可以僅僅緩存哪些很難生產出來的部分、或者可以緩存整個網站
## 設置緩存
* 通過設置決定把數據緩存在哪里,是數據中,文件系統,還是內存中
* 通過設置settings文件的CACHES配置來實現
* 參數TIMEOUT:緩存的默認過期時間,以秒為單位,這個參數默認是300秒,即5翻照片那個;設置TIMEOUT為None表示永遠不會過期,值設置成0造成緩存立即失效
```text
# 本地緩存
CACHES = {
'default':{
'BACKEND':'django.core.cache.backends.locmem.LocMemCache',
'TIMEOUT':60,
}
}
```
* MemcachedCache
```text
緩存包:pip install python-memcached pip install pylibmc
# 緩存
CACHES = {
'default':{
'BACKEND':'django.core.cache.backends.loca.MemcachedCache',
#'BACKEND':'django.core.backends.memcached.PyLibMCCache'
'TIMEOUT':60,
'LOCATION':'127.0.0.1:11211',
}
}
在此示例中,高速緩存通過在IP地址172.19.26.240和172.19.26.242上運行的Memcached實例共享,這兩個實例都位于端口11211上:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': [
'172.19.26.240:11211',
'172.19.26.242:11211',
]
}
}
```
* 可以將cache存到redis中,默認采用1數據庫,需要安裝包并配置如下:
```text
安裝包:pip install django-redis-cache
# 緩存
CACHES = {
'default':{
'BACKEND':'redis_cache.cache.RedisCache',
#'BACKEND':'django.core.backends.memcached.PyLibMCCache'
'TIMEOUT':60,
'LOVATION':'localhost:6379',
}
}
```
* 連接redis,查看存儲的數據
```text
開啟redis服務:net start reids
連接:redis-cli
切換數據庫:select 1
查看鍵:keys *
查看值:get 鍵
```

## 單個view緩存
* django.views.decorators.cache定義了cache\_page裝飾器,用于對視圖的輸出進行緩存
* 示例代碼
```text
urls.py
# 配置路由
urlpatterns = [
path('cache/<int:code>/',views.cache),
]
views.py
#創建視圖
@cache_page(60 * 15)
def cache(request,code):
# return render(request,'html/cache.html')
return HttpResponse("hello world")
```
* cache\_page:timeout參數,緩存超時,以秒為單位,上述實體,cache視圖的結果將被緩存15分鐘
* 視圖緩存與URL無關,如果多個URL指向同一視圖,每個URL將會分別緩存
## 模板片段緩存
* 使用cache模板標簽來緩存模板的一個片段
* 需要兩個參數:
* 緩存時間,以秒為單位
* 給緩存片段起的名稱
* 示例:
```text
{% load cache %}
{% cache 500 hello %}
hello world
{% endcache %}
```
## 底層的緩存api
```text
views.py
#緩存視圖
from django.core.cache import cache
from django.core.cache.utils import make_template_fragment_key
def cachesettings(request):
cache.set('name', 'angle', 60*30)
print(cache.get('name'))
# cache.delete('name')
# cache.clear()
return render(request,'html/test.html')
urls.py
#配置路由
url(r'^test/$',views.cachesettings)
```
```text
from django.core.cache import cache
設置:cache.set(鍵,值,有效時間)
獲取:cache.get(鍵)
刪除:cache.delete(鍵)
清空:cache.clear()
設置多個值:cache.set_many({'a':1,'b':2})
獲取多個值:cache.get_cache(['a','b','c'])
刪除多個值:cache.delete_many(['a','b'])
遞增:cache.incr('num')
遞減:cache.decr('num')
關閉連接:cache.close()
```