Django框架之缓存组件Cache

前言

这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题

于是乎,我自己开发了一款面试宝典,希望能帮到大家,也希望有更多的Python新人真正加入从事到这个行业里,让python火不只是停留在广告上。

微信小程序搜索:Python面试宝典

或可关注原创个人博客:https://lienze.tech

也可关注微信公众号,不定时发送各类有趣猎奇的技术文章:Python编程学习

缓存

Django 是动态Web后台框架,需要实时生成用户访问的页面,进行多次的数据库操作,但是多次的数据库访问操作对于整个Web系统来说,会影响效率,尤其是当访问量增大时,数据库的压力也会越来越大。

相对于磁盘及内存操作,数据库的访问操作付出的成本要大的多

浏览器第一次请求时,cache会缓存单个变量或整个网页等内容到硬盘或者内存中,同时设置response头部

当浏览器再次发起请求时,会与缓存中的过期时间相比较,如果缓存时间比较新,则会重新请求数据,并缓存起来然后返回response给客户端,如果缓存没有过期,则直接从缓存中提取数据,返回给response给客户端

Cache-Control

HTTP协议头Cache-ControlCache-ControlExpires的作用一致,都是指明当前资源的有效期,控制浏览器是否直接从浏览器缓存取数据还是重新发请求到服务器取数据。只不过Cache-Control的选择更多,设置更细致,如果同时设置的话,其优先级高于Expires

缓存引擎

  • django默认通过本地内存进行缓存,同时包括如下其他的一些
'django.core.cache.backends.db.DatabaseCache'
'django.core.cache.backends.dummy.DummyCache'
'django.core.cache.backends.filebased.FileBasedCache'
'django.core.cache.backends.locmem.LocMemCache'
'django.core.cache.backends.memcached.MemcachedCache'
'django.core.cache.backends.memcached.PyLibMCCache'

Memcached设置

  • memcached为例

python中使用memcached需要我们额外安装memcached作为memcache客户端的支持

pip3 install python-memcached -i https://pypi.tuna.tsinghua.edu.cn/simple
  • 安装memcached
apt-get install memcached # debian
yum install memcached # centos 
  • 配置文件:/etc/memcached.conf

配置文件中有两个可能需要修改的参数

-m 64 #memcached所能使用的内存大小
-l 127.0.0.1 #监听的IP地址
  • 开启|关闭memcached服务
systemctl start memcached # 开启
systemctl stop memcached # 关闭
  • 查看服务状态
systemctl status memcached
  • settings配置

在项目的settings文件下进行配置

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',  
        # 指定缓存使用的引擎
        'LOCATION':'172.16.19.26:11211', 
        # 指定缓存服务器地址,常为本机地址
    }
}

视图缓存

可以只为某些视图函数进行缓存

使用django.views.decorators.cache下的装饰器cache_page进行视图函数装饰即可

from django.views.decorators.cache import cache_page
  • 模型类的表代码
class People(models.Model):
    name = models.CharField(max_length=20,verbose_name='名字')
  • 视图函数代码
from django.views.decorators.cache import cache_page

@cache_page(10) # 缓存10秒
def index(request):
    print('视图函数被调用')
    ss = models.People.objects.all()
    return render(request, 'index.html', locals())
  • 模板页面代码



    
    
    展示数据


    {% for s in ss %}
        
  • {{ s.name }}
  • {% endfor %}

    在第一次刷新浏览器之后,立即在数据库中添加一个新的数据对象

    接着继续刷新浏览器,前端页面将会读取缓存中的结果,而不会显示刚才添加的用户

    除了在视图函数上使用装饰器进行缓存设置,还可以在路由匹配部分使用相同装饰器函数进行设置

    path('',cache_page(60 * 15)(my_view)),
    

    全站缓存

    将整站所有视图设置缓存,需要在配置文件的中间件设置首尾部分添加如下内容

    MIDDLEWARE = [
        'django.middleware.cache.UpdateCacheMiddleware', # 首部要添加的中间件
        # 将response缓存起来 
        'django.middleware.security.SecurityMiddleware',
    	...
        'django.middleware.cache.FetchFromCacheMiddleware',# 尾部要添加的中间件
        # 将缓存的response取出来
    ]
    
    • 设置当前全站缓存有效时间的全局变量
    CACHE_MIDDLEWARE_SECONDS = 10 # 每页页面缓存的秒数,默认为600
    

    局部缓存

    局部缓存主要为在模板页面,选择某个区域进行缓存,当用户再次访问相同页面时,如设置缓存未过期,则渲染时局部缓存不会重新生成

    {% load cache %}
    	局部缓存首先需要加载cache标签
    	
    {% cache sec key %}
    {% endcache %}
    

    以时间模板变量为例,做一个简单的测试,后台视图函数每次在访问时,返回当前时间

    import time 
    now = time.strftime('%H:%M:%S', time.localtime())
    

    模板页面在使用时的代码

    {% load cache %}
    
    

    这里是未缓存的时间:{{ now }}

    {% cache 10 time %}

    这里是缓存的时间:{{ now }}

    {% endcache %}

    手动缓存

    除了以上应用于各个业务中的缓存方式,还可以使用django所提供的cache接口进行缓存设置以及获取

    • 设置缓存
    from django.core.cache import cache
    #存储缓存数据
    cache.set('cache_key',data,60*15)
    #cache_key为存储在缓存中的唯一值,data为存储的数据,60*15为缓存有效时间
    
    • 获取缓存
    #获取缓存数据
    cache.get('cache_key','获取不到的默认值')
    #cache_key为储存缓存数据的唯一值
    
    • 避免key值重复导致更新缓存,可以使用cache.add函数,基本用法与set相同
    status = cache.add('add_key', 'New value')
    # 当指定key值的缓存存在,add方法不会尝试更新缓存
    # 返回值status为True时,代表存储成功,False代表存储失败
    
    • 清除缓存,通过cache.delete方法,该方法接收一个缓存key
    cache.delete('cache_key')
    
    • 清空缓存,通过cache.clear方法,直接从缓存中清除所有
    cache.clear()
    

    • 注意memcached不允许使用超过250个字符或包含空格或控制字符的缓存键值;使用这样的键值将会导致异常

    你可能感兴趣的:(Python学习,Django,django,python,后端)