定义:缓存是一类可以更快的读取数据的介质的统称、也指其它可以加快数据读取的存储方式、一般用来存储临时数据、常用介质的是读取速度很快的内存
意义:视图渲染有一定的成本、数据库的频繁查询过高、所以对于低频变动的页面可以考虑使用缓存技术、减少实际渲染的次数、用户拿到相应的时间成本会更低
缓存优化:当请求视图时、优先从缓存拿数据、如果缓存中没有数据就正常从数据库中差、查完后就保存至缓存中
django中使用缓存的方案:全局缓存、局部缓存
from django.views.decorators.cache import cache_page
from django.http import HttpResponse
import time
#全局缓存-将整个视图函数结果缓存起来
#方法1:
@cache_page(30) -> 单位s #语法糖装饰器、当前这个视图函数的缓存时间-如果缓存有数据就拿缓存的数据、没有则正常走视图并将结果缓存
def my_view(request):
t = time.time()
return HttpResponse('t is %s' %(t))
#方法2:在路由中
from django.views.decorators.cache import cache_page
urlpatterns = [
path('foo/', cache_page(60)(my_view)), #my_view 视图函数
]
==============================================================================================
局部缓存-缓存指定的值
#缓存api的使用
#方式1:
#使用caches['CACHE配置key']导入具体对象
from django.core.cache import caches
cache1 = caches['myalias']
cache2 = caches['myalias_2']
#方式2:
from django.core.cache import cache #相当于直接引入CACHES配置项中的'defalult'-(setting.py中的CACHES配置项)项
缓存方案:
1、在数据库缓存:
在setting.py中配置
----------------------------------------------------------------
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.db.DatabaseCache', #引擎
'LOCATION': 'table_name', # 表名 执行 'python manage.py createcachetable my_cache_table' 创建表
# 'TIMEOUT': 60000, # 缓存保存时间、单位秒、默认值是300s
'OPTIONS': { #特殊的参数
'CLIENT_CLASS': 'django_redis.client.DefaultClient',
'MAX_ENTRIES': 3000000, # 最大缓存记录的数量(默认300)
# 'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
}
}
}
---------------------------------------------------------------------
2、数据缓存到服务器的内存中
在setting.py中配置:
----------------------------------------------------------------------------
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
'LOCATION': 'unique-snowflake' #雪花算法
}
}
-------------------------------------------------------------------------------
3、将数据缓存到文件中
在setting.py中配置:
-------------------------------------------------------------------------
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
'LOCATION': '/var/tmp/django_cache' #文件夹的路径
}
}
--------------------------------------------------------------------------
4、
缓存api的使用
1、cache.set(key, value, timeout) - 存储缓存
-- key:缓存的key、字符串类型
-- value:python对象
-- timeout:缓存存储的时间(s)、默认为CACHES中的TIMEOUT值
-- 返回值:None
2、cache.get(key) - 获取缓存
-- key:缓存的key
-- 返回值:为key的具体值、如果没有数据、则返回None
3、cache.add(key,value) - 存储缓存、只在key不存在时生效
-- 返回值:True[存储成功] or False[存储失败]
4、cache.get_or_set(key,value,timeout) - 如果没有获取到数据、就执行set操作
-- 返回值:value
5、cache.set_many(dict, timeout) - 批量存储缓存
-- dict:key和value的字典
-- timeout:存储的时间(s)
-- 返回值:插入不成功的key的数组
6、cache.get_many(key_list) - 批量获取存储数据
-- key_list:包含key的数组
-- 返回值:取到的key和value的字典
7、cache.delete(key) - 删除key的缓存数据
-- 返回值:None
8、cache.delete_many(key_list) - 批量删除
-- 返回值:None
浏览器缓存策略
#浏览器的缓存
-- 强缓存
-- 协商缓存
1、强缓存:--
-- 响应头 - Expires
-- 定义缓存的时间、用来指定资源缓存到期的时间、是服务器端的具体的时间点
-- 样例:Expires:Thu, 02 Apr 2030 05:14:08 GMT
2、响应头 - Cache-Control
-- 在HTTP/1.1中,Cache-Control主要用于控制网页缓存、比如当:Cache-Control:max-age=120 代表请求创建时间后的120秒、缓存就失效
说明:目前服务器都会带着这两个头同时相应给浏览器、浏览器优先使用Cache-Control
===========================================================
#协商缓存 -- 一旦静态文件到期就去协商
#一般用于缓存静态文件、避免重复获取没有改变的静态文件、浪费资源
1、Last-Modified响应头个if-Modified-Since请求头 -- 少用、不是最优解
说明:
-- 1、Last-Modified为文件的最近修改时间、浏览器第一次请求静态文件是、服务器如果返回Last-Modified响应头、则代表该资源为需要协商的缓存
-- 2、当缓存到期后,浏览器将获取到的Last-Modified值作为请求头if-Modified-Since的值、与服务器发请求协商、服务端返回304响应码[响应体为空]、代表缓存继续使用、200响应码代表缓存不可用[响应体为最新的资源]
2、ETag响应头和if-None-Match请求头
说明:
-- 1、Etag是服务器是响应请求时、返回当前资源文件的一个唯一标识(由服务器生成)、只要资源有变化、Etag就会重新生成
-- 2、缓存到期后、浏览器将ETag响应头的值作为if-None-Match请求头的值、给服务器发请求协商;服务器街道请求头后,比对文件标识、不一致则认为资源不可用、返回200响应码[响应体为最新资源];可用则返回304响应码
案例:
创建项目:cache
1、先在setting.py中配置缓存
-----------------------------------------------------------------------
.............
#缓存配置
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.db.DatabaseCache', #引擎
'LOCATION': 'my_cache_table', # 表名 执行 'python manage.py createcachetable my_cache_table' 创建表
# 'TIMEOUT': 60000, # 缓存保存时间、单位秒、默认值是300s
'OPTIONS': { #特殊的参数
'CLIENT_CLASS': 'django_redis.client.DefaultClient',
'MAX_ENTRIES': 3000000, # 最大缓存记录的数量(默认300)
# 'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
}
}
}
---------------------------------------------------------------
2、执行:
-- python manage.py createcachetable my_cache_table #创建缓存用的表
-- 表一般有三个字段:
-- key、value、expires(缓存过期时间)
3、数据库迁移:
-- python manage.py migrate
标签:缓存,21,--,cache,django,key,py From: https://www.cnblogs.com/littlecc/p/18188231