cache,也就是缓存,对于网页应用的快速响应是非常必须的,毕竟没有谁愿意一直等着服务器返回数据。那么缓存在前面学习的MTV模型中处于哪一环节?究竟有多少种缓存方式?又该如何将数据放入缓存呢?这一节我们一起来看看这些问题。
我是T型人小付,一位坚持终身学习的互联网从业者。喜欢我的博客欢迎在csdn上关注我,如果有问题欢迎在底下的评论区交流,谢谢。
文章目录
操作环境
先总结下我的操作环境:
- Centos 7
- Python 3.7
- Pycharm 2019.3
- Django 2.2
因为Django长期支持版本2.2LTS和前一个长期支持版本1.11LTS有许多地方不一样,需要小心区分。
环境准备
离开之前的项目,新建一个DjangoCache项目。
步骤和之前是一样的,这里就不详细演示每一步的操作了:
- virtualenv创建虚拟环境,这里可以直接用之前的虚拟环境。记得activate环境
django-admin startproject DjangoCache
新建项目- pycharm打开项目,注意是在
manage.py
的上一级打开 - 配置解释器为虚拟环境内的python,前一个项目的第三方包都会自动识别
python manage.py startapp App
新建一个应用,并在settings中注册- mysql创好数据库DjangoCache,每次都用新的库,不然会有问题
- 修改配置文件
settings.py
,包括数据库连接信息,全局templates文件路径等等 - 全局
__init__.py
中对pymysql进行伪装pymysql.install_as_MySQLdb()
- 默认数据迁移
python manage.py migrate
- App应用新建
urls.py
并include到项目的urls.py
中,设置好namespace
cache的原理
cache就是缓存的意思,这里直接翻译一下官方文档的介绍。
对一个东西进行cache,就是将一个耗时的复杂运算的结果进行保存,这样下次进行同样访问的时候不用再重复进行计算
To cache something is to save the result of an expensive calculation so that you don’t have to perform the calculation next time
官方还给了一段伪代码来说明
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
所以应该就是将view函数返回的HttpResponse对象进行了cache,下次访问同样的view函数,如果cache还没过期就直接返回cache中的内容。如果cache过期了就重新运行一下view函数进行返回。
Django中的cache
流程图
按照上面的伪代码,我自己画了一个简单的流程图来对比一下加了cache前后的流程变化
没有加cache的时候,流程从①到⑧按照顺序;有了cache以后,当view.py
中的view函数配置了cache,程序直接去cache中进行查找,有则直接⑨到⑩然后到⑦;如果cache已经过期则⑨到⑩再去③重复一遍没cache的流程并⑥以后除了返回结果给⑦,还要把结果放进cache以便下一次查询。
Django内置的cache种类
-
基于Memcached缓存
Memcached是一种内存数据库,所有数据保存在内存中,所以速度非常快,而且Django原生支持。但是因为Redis的走红,Memcached有被逐步取代的趋势。不过因为Redis没有被Django原生支持,所以要额外安装第三方模块再使用。建议使用Redis而不是Memcached。 -
基于数据库缓存
和普通数据模型差不多,关联一张表专门用来存储cache。因为只是单张表,没有额外关联,所以速度相对会快很多。 -
基于文件系统缓存
将数据保存在磁盘中,因为磁盘和内存的速率相差几万倍,这种方式速度并不快,所以不做推荐。 -
基于本地内存缓存
如果系统无法支持Memcached或者Redis这种内存数据库,直接存在本地内存中也是可以。但是这样别的设备就无法共享cache内容了。也不做推荐。 -
自定义缓存
例如安装第三方的Redis模块来使用。
Django中cache设计宗旨
按照