一、缓存基本介绍
1、为什么要有django缓存?
由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,5分钟内再有人来访问时,则不再去执行view中的操作,而是直接从内存或者Redis中之前缓存的内容拿到,并返回。
2、缓存是一类存储的总称,一般指的都是内存。
二、dgango中自带哪些缓存以及配置方法
1、django中的缓存方式(在django的settings中设置)
1、开发调试
2、内存
3、文件
4、数据库
5、Memcache缓存(python-memcached模块)
6、Memcache缓存(pylibmc模块)
2、开发者调试方式缓存
# 此为开始调试用,实际内部不做任何操作 # 配置: CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.dummy.DummyCache', # 引擎 'TIMEOUT': 300, # 缓存超时时间(默认300,None表示永不过期,0表示立即过期) 'OPTIONS':{ 'MAX_ENTRIES': 300, # 最大缓存个数(默认300) 'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3) }, 'KEY_PREFIX': '', # 缓存key的前缀(默认空) 'VERSION': 1, # 缓存key的版本(默认1) 'KEY_FUNCTION' 函数名 # 生成key的函数(默认函数会生成为:【前缀:版本:key】) } }
3、内存方式缓存(只是将开发者调试模式的引擎换成内存缓存引擎就可以了)
# 此缓存将内容保存至内存的变量中 # 配置: CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', #内存方式缓存引擎,主要是通过LocMemCache这个类来吧缓存内容写入内存中,也是通过它吧内存中的缓存取出来 'LOCATION': 'unique-snowflake', #指定存放本地内存中缓存的变量名 } } # 注:其他配置同开发调试版本
4、文件缓存方式
# 此缓存将内容保存至文件,由于服务器从数据库读取内容还要经过socket连接,还不如将内容存放在服务器的文件夹中省去了socket链接过程。
#数据库存放的数据需要经过渲染才能拿出来使用而存放咋文件中的数据是已经渲染完毕了的数据。 # 配置: CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', #文件缓存方式引擎 'LOCATION': '/var/tmp/django_cache', #指定本地文件的缓存地址 } } # 注:其他配置同开发调试版本
5、数据库缓存方式
# 此缓存将内容保存至数据库,该数据库中的数据存的是已经渲染完成了的字符串,省去了数据库渲染的步骤 # 配置: CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.db.DatabaseCache', #数据库缓存方式引擎 'LOCATION': 'my_cache_table', # 数据库表 #指定缓存在数据库中的表 } } # 注:执行创建表命令 python manage.py createcachetable
6、Memcache缓存(python-memcached模块)
# 此缓存使用python-memcached模块连接memcache CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', #Memcache方式缓存引擎 'LOCATION': '127.0.0.1:11211', #可以指定某个特定主机的ip+端口 } } CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 'LOCATION': 'unix:/tmp/memcached.sock', } } CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 'LOCATION': [ '172.19.26.240:11211', '172.19.26.242:11211', #可以指定多个Memcache的主机加端口
#('172.19.26.240:11211',8), #也可以通过加权重的方式指定
#('172.19.26.242:11211',5), ] } }
7、Memcache缓存(pylibmc模块)
# 此缓存使用pylibmc模块连接memcache CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache', 'LOCATION': '127.0.0.1:11211', } } CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache', 'LOCATION': '/tmp/memcached.sock', } } CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache', 'LOCATION': [ '172.19.26.240:11211', '172.19.26.242:11211', ] } }
三、dgango中缓存的应用
1、全站使用(粒度大,可以通过中间键处理所有请求)
使用中间件,经过一系列的认证等操作,如果内容在缓存中存在,则使用FetchFromCacheMiddleware获取内容并返回给用户,当返回给用户之前,判断缓存中是否已经存在,如果不存在则UpdateCacheMiddleware会将缓存保存至缓存,从而实现全站缓存 MIDDLEWARE = [ 'django.middleware.cache.UpdateCacheMiddleware', #可放在中间键的开始 # 其他中间件...
'django.middleware.cache.FetchFromCacheMiddleware', #可放在中间键的最后 ] CACHE_MIDDLEWARE_ALIAS = "" CACHE_MIDDLEWARE_SECONDS = 8 #表示缓存8s CACHE_MIDDLEWARE_KEY_PREFIX = ""
2、单独视图使用(粒度适中)
方式一:直接在单个视图函数上添加装饰器 from django.views.decorators.cache import cache_page @cache_page(60 * 15) # def my_view(request): ... 方式二:直接在url路径上添加缓存,相当于将url对应的视图函数上添加了装饰器 from django.views.decorators.cache import cache_page urlpatterns = [ url(r'^foo/([0-9]{1,2})/$', cache_page(60 * 15)(my_view)), ]
3、局部使用(粒度小)
#就是在html页面的某个地方使用缓存
a. 引入TemplateTag {% load cache %} b. 使用缓存 {% cache x 'y' %} #x代表的缓存秒数,y代表的缓存key也就是变量名 缓存内容 {% endcache %}