Django之缓存笔记

Posted 海筒学苑

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django之缓存笔记相关的知识,希望对你有一定的参考价值。

一、缓存

  1. 概念:可以更快读取数据的介质统称,也指其它可以加快数据读取的存储方式。

  2. 为什么使用缓存?
    视图渲染有一定成本,对于低频变动的页面可以考虑使用缓存技术,减少实际渲染次数。

    from django.shortcuts import render

    def index(request):
    # 时间复杂度极高的渲染
    book_list = Book.objects.all() #-> 此处假设耗时2s
    return render(request, 'index.html', locals())
    given a URL, try finding that page in the cache

    if the page is in the cache:
    return the cached page
    else:
    generate the page
    save the generated page in the cache (for next time)
    return the generated page
    1. 博客列表页
    2. 电商商品详情页
    3. 缓存导航及页脚
    • 使用场景: 数据更新不会太频繁

    • 优化思想

    • 案例分析

二、Django中设置缓存

Django中提供多种缓存方式,如需使用需要在settings.py中进行配置。

  1. 数据库缓存修改配置,添加缓存配置项。

    # Django可以将其缓存的数据存储在您的数据库中
    CACHES = {
    'default': {
    'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
    'LOCATION': 'my_cache_table',
    'TIMEOUT': 300, #缓存保存时间 单位秒,默认值为300,
    'OPTIONS':{
    'MAX_ENTRIES': 300, #缓存最大数据条数
    'CULL_FREQUENCY': 2,#缓存条数达到最大值时 删除1/x的缓存数据
    }
    }
    }

    创建缓存表 python3 manage.py createcachetable

  2. 文件系统缓存

    CACHES = {
    'default': {
    'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
    'LOCATION': '/var/tmp/django_cache',#这个是文件夹的路径
    #'LOCATION': 'c:\test\cache',#windows下示例
    }
    }
  3. 本地内存缓存

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

三、Django使用缓存

  1. 使用装饰器整体缓存:createcachetable 优点:使用简单;缺点:不太灵活,无法缓存部分数据。

  2. 部分缓存,使用缓存api(cache.set/get/delete;cache.set_many/get_many/delete_many):
    作用:克服整体缓存的缺点,可以缓存部分结果,也可以动态的删除缓存。

    # 指定配置引入
    from django.core.cache import caches
    cache1 = caches['myalias']
    cache2 = caches['myalias_2']

    # 默认配置引入[指的配置中的default项]等同于caches['default']
    from django.core.cache import cache

    # 常规命令 set
    # key: 字符串类型
    # value: Python对象
    # timeout: 缓存存储时间 默认为settings.py CACHES对应配置的TIMEOUT
    # 返回值:None
    cache.set('my_key','myvalue',30)

    # 常规命令 get
    # 返回值:为key的具体值,如果没有数据,则返回None
    cache.get('my_key')
    # 可添加默认值,如果没取到返回值默认值
    cache.get('my_key','default值')

    # 常规命令 add 只有在key不存在的时候才能设置成功
    # 返回值 True or False ,若my_key已存在,此次赋值失效
    cache.add('my_key','value')

    # 常规命令 get_or_set 如果未获取到数据 则执行set操作
    # 返回值 key的值
    cache.get_or_set('my_key','value',10)

    # 常规命令 get_many(key_list) set_many(dict,timout)
    # 返回值 set_many:返回插入不成功的Key数组
    # get_many:取到key和value的字典
    >>> cache.set_many({'a':1,'b':2,'c':3})
    >>> cache.get_many(['a','b','c'])

    # 常规命令 delete
    # 返回值 None
    cache.delete('my_key')

    # 常规命令 delete_many
    # 返回值 成功删除的数据条数
    cache.delete_many(['a','b','c'])

三、浏览器使用缓存

浏览器缓存分类:

  1. 强缓存:不会向服务器发送请求,直接从缓存中读取资源

    • 1,Expires 缓存过期时间,用来指定资源到期时间,是服务器端的具体时间点。

    • 2,Cache-Contro 在HTTP/1.1中,Cache-Control主要用于控制网页缓存。

  2. 协商缓存:强制缓存失效后,浏览器携带缓存标识向服务器发起请求,由服务器根据缓存标识决定是否使用缓存的过程

    • 精度不一样-Etag高

    • 性能上-Last-Modifi 高

    • 优先级-Etag高

    • 1,Last-Modified和If-Modified-Since:第一次访问时,服务器返回Last-Modified:XX(时间),浏览器下次请求时携带if-modified这个header,该值为last-maodified.服务器接收请求后,对比结果,若资源发生改变,则返回304,否则返回200并将新资源返回给浏览器。缺点:只能精确到秒,秒内多次修改,检测不到。

    • ETag和If-None-Match:Etag是服务器响应请求时,返回当前资源文件一个唯一标识(服务器生成),资源发生变化,Etag就会重新生成(访问流程同上)

    • Last-Modified VS ETag

以上是关于Django之缓存笔记的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis 学习笔记总结

hibernate笔记--缓存机制之 一级缓存(session缓存)

django-缓存的三种应用

Django框架之缓存数据库

Django之缓存

django之缓存的用法, 文件形式与 redis的基本使用