Django之缓存篇

     阅读:25

1.什么是缓存

定义:缓存是一类可以更快的读取数据的介质统称,也指其他可以加快得数据读取的存储方式。一般来存储临时数据,常用的介质是快速很快据的内存。

意义:试图渲染有一定的成本,数据库查询的频率过高;所以对于低频变动的页面可以考虑缓存技术,减少实际渲染次数;用户得到响应的时间也会减少。

简单例子:网上购物如果的推荐图片一个月换一次,属于低频变动,因此可以通过缓存技术,这样子就不需要花费时间去数据库寻找了。

2.Django的缓存方式

1.数据库缓存

说明:将变动低频的数据放入数据库当中。

简单理解:假设有一个表中有亿万行数据,在页面中你需要恰好需要查找亿万次才能找到该数据会花费巨量的时间,可若一开始将该数据放入缓存表当中,他的查找时间要大大少于亿万次。

setting.py配置

CACHES = {
    'default':{
        'BACKEND':'django.core.cache.backends.db.DatabaseCache',#引擎
        'LOCATION':'my_chache_table', #缓存表
        'TIMEOUT':300, #缓存保存时间 单位秒,默认值300,
        'OPTIONS':{
            'MAX_ENTRIES':300, #最大缓存数据
            'CULL_FREQUENCY':2, #缓存条数达到最大值时,删除1/x的缓存数据 max_entries*(1/cull_frequency)
        }
    }
}

在上面配置setting完成后,需要创建我们的表‘my_cache_table’

python manage.py createcachetable
python manage.py migrate

 A.整体缓存

整体缓存是对整个视图函数进行缓存,具体操作有两种:

1.适配器方式

import time
from django.views.decorators.cache import cache_page
@cache_page(15)
def test_cache(request):
    t = time.time()
    return HttpResponse('t is %s'%(t))

2.在urls.py的url配置进行配置

from django.contrib import admin
from django.urls import path,re_path,include
from . import views
from django.views.decorators.cache import cache_page
urlpatterns = [
    path('admin/', admin.site.urls),
    path('test/cache',cache_page(15)(views.test_cache)) #如果采用这种方式,视图函数不需要适配器
]

运行结果预测:第一次进入页面,缓存数据表中并没有缓存数据,因此需要在视图函数获得t,渲染页面并将视图函数响应存入数据表中。接下来的15秒内,缓存表有了数据,因此无论我们怎么刷新都是一个值。15秒后才有新的值。

 B.局部缓存

我们在整体缓存将整个视图函数响应存入,而局部内存考虑的是将某个数据存入。如上面的t

局部缓存有两种方式:

方式1:

from django.core.cache import caches
def test_cache1(request):
    cache1 = caches['default']
    #cache1 = caches['mycache'] 
    #如果调用这个,需要在setting.py文件中的CACHE这个字典进行配置'mycache'
    #而且要与default同等级。
    t = time.time()
    #cache1.set('t',t,15) #cache.set(key,value,timeout).如果timeout不给就采取默认值
    t1 = cache1.get_or_set('t',t,15)
    return HttpResponse('t is %s'%(t1))
    #获得缓存
    cache.get('t')
    #添加缓存,只有key不存在才可以存,存成功返回True,失败False
    cache.add('t1',123)
    #获取缓存,如果没有就set
    cache.get_or_set('t',t,15)
    #批量缓存
    cache.set_many(dict,timeout)
    #批量获取
    cache.get_many(key_list)
    #删除缓存
    cache.delete(key)
    #批量删除
    cache.delete_mant(list_key)

 方式2:

from django.core.cache import cache


#cache相当于第一种方式的cache = caches['default'] 就是获得默认的这个

2.本地内存缓存

说明:数据缓存到服务器内存中

setting.py配置

CACHES = {
    'default':{
        'BACKEND':'django.core.backends.locmem.LOCmemCache',
        'LOCATION': 'unique-snowflake'
    }
}

3.文件系统缓存

说明:数据缓存到本地文件中(不推荐)

CACHES = {
    'default':{
        'BACKEND':'django.core.backends.filebased.FileBasedCache',
        'LOCATION': '/xx/xxx/xxx'#文件夹路径
    }
}

4.浏览器缓存