21、Django-缓存(强缓存和协商缓存)-@cache-page()装饰器

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

意义:视图渲染有一定的成本、数据库的频繁查询过高、所以对于低频变动的页面可以考虑使用缓存技术、减少实际渲染的次数、用户拿到相应的时间成本会更低

 

缓存优化:当请求视图时、优先从缓存拿数据、如果缓存中没有数据就正常从数据库中差、查完后就保存至缓存中

 

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

 

posted @ 2024-07-09 22:33  little小新  阅读(4)  评论(0编辑  收藏  举报