这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题
于是乎,我自己开发了一款面试宝典,希望能帮到大家,也希望有更多的Python新人真正加入从事到这个行业里,让python火不只是停留在广告上。
微信小程序搜索:Python面试宝典
或可关注原创个人博客:https://lienze.tech
也可关注微信公众号,不定时发送各类有趣猎奇的技术文章:Python编程学习
Django
是动态Web
后台框架,需要实时生成用户访问的页面,进行多次的数据库操作,但是多次的数据库访问操作对于整个Web
系统来说,会影响效率,尤其是当访问量增大时,数据库的压力也会越来越大。
相对于磁盘及内存操作,数据库的访问操作付出的成本要大的多
浏览器第一次请求时,cache
会缓存单个变量或整个网页等内容到硬盘或者内存中,同时设置response
头部
当浏览器再次发起请求时,会与缓存中的过期时间相比较,如果缓存时间比较新,则会重新请求数据,并缓存起来然后返回response
给客户端,如果缓存没有过期,则直接从缓存中提取数据,返回给response
给客户端
HTTP
协议头Cache-Control
,Cache-Control
与Expires
的作用一致,都是指明当前资源的有效期,控制浏览器是否直接从浏览器缓存取数据还是重新发请求到服务器取数据。只不过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'
在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
个字符或包含空格或控制字符的缓存键值;使用这样的键值将会导致异常