Django(缓存系统)
什么是缓存Cache
缓存是一类可以更快的读取数据的介质统称,也指其它可以加快数据读取的存储方式。一般用来存储临时数据,常用介质的是读取速度很快的内存。一般来说从数据库多次把所需要的数据提取出来,要比从内存或者硬盘等一次读出来付出的成本大很多。对于中大型网站而言,使用缓存减少对数据库的访问次数是提升网站性能的关键之一。
为什么要使用Cache
在Django中,当用户请求到达视图后,视图会先从数据库提取数据放到模板中进行动态渲染,
渲染后的结果就是用户看到的网页。如果用户每次请求都从数据库提取数据并渲染,将极大降低性能,
不仅服务器压力大,而且客户端也无法即时获得响应。如果能将渲染后的结果放到速度更快的缓存中,
每次有请求过来,先检查缓存中是否有对应的资源,如果有,直接从缓存中取出来返回响应,
节省取数据和渲染的时间,不仅能大大提高系统性能,还能提高用户体验。
缓存Cache的应用场景
缓存主要适用于对页面实时性要求不高的页面。存放在缓存的数据,通常是频繁访问的,而不会经常修改的数据。我们来举几个应用例子:博客文章。假设用户一天更新一篇文章,那么可以为博客设置1天的缓存,一天后会刷新。购物网站。商品的描述信息几乎不会变化,而商品的购买数量需要根据用户情况实时更新。我们可以只选择缓存商品描述信息。缓存网页片段。比如缓存网页导航菜单和脚部(Footer)。
django-cache文档地址
.1/topics/cache/
Django中如何使用Cache
1.在视图View中使用
from django.views.decorators.cache import cache_page# 在需要缓存的视图上添加装饰器, 参数是设置timeout 超时时间, 单位是秒
@cache_page(60 * 15) [单位:s,表示缓存15分钟]
def my_view(request):
...给视图添加缓存是有风险的,如果视图所展示的网页中有经常动态变动的信息,那么被添加缓存命令不可取。缓存整个视图最实用的场景应该是这个视图所展示的网页的内容基本上不怎么变动,或者说在很长一段时间内不需要变动,这样使用缓存就非常有效。
2.在路由URLConf中使用
from django.views.decorators.cache import cache_pageurlpatterns = [
path('foo/<int:code>/', cache_page(60 * 15)(my_view)),
]URLconf 使用缓存和视图函数使用缓存需要注意的地方是一样的,因为它们都是缓存整个页面,所有都需要考虑是否整个页面都应该缓存。
3.在模板中使用
{% load cache %}
# 第一个参数是时间,第二个参数是别名
{% cache 500 sidebar request.user.username %}
.. sidebar for logged in user ..
{% endcache %} 可以保证只缓存那些适合使用缓存的 HTML 片段
4.全局的使用(通过中间件实现)
用户的请求通过中间件,经过一系列的认证等操作,如果请求的内容在缓存中存在,则使用FetchFromCacheMiddleware获取内容并返回给用户当返回给用户之前,判断缓存中是否已经存在,如果不存在,则UpdateCacheMiddleware会将缓存保存至Django的缓存之中,以实现全站缓存MIDDLEWARE = [# 站点缓存 , 注意必须在第一个位置'django.middleware.cache.UpdateCacheMiddleware',...# 站点缓存, 注意必须在最后一个位置'django.middleware.cache.FetchFromCacheMiddleware',]
Django中缓存设置
1.Database caching[数据库缓存]
my_cache_table-->数据库缓存到表中
[先查询表中有没有对应路由的缓存数据,如果有则取出]问题:通过比对过期时间判断是否重新请求数据库,缓存过期该条记录仍旧在数据库表中,需要根据具体情况删除表中过期的缓存记录1.配置mysql数据库DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql', // mysql 为mysql 数据库'NAME': 'onlinetest', // 对应使用的数据库'USER': 'root', // 对应数据库用户名'PASSWORD': 'mysql', // 对应数据库密码'HOST': '127.0.0.1', // 本地数据库'PORT': 3306, // 对应数据库端口}}2.配置cacheCACHES = {'default': {'BACKEND': 'django.core.cache.backends.db.DatabaseCache','LOCATION': 'my_cache_table',}}3.创建cache tablepython manage.py createcachetable [自动产生my_cache_table表]
2.Filesystem caching[文件系统缓存]
不在表中保存信息,而将数据保存在本地磁盘中的文件中1.配置cache[自动创建c:/foo/bar文件夹]CACHES = {'default': {'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache','LOCATION': os.path.join(BASE_DIR,'cachedata'),}}
3.redis缓存[key:value]
到达过期时间自动删除key,不用考虑优化的问题
django-redis文档/ 0.安装redis.html
1.下载redispip install django-redis2.在settings中配置redis[注意阿里云放开6379端口]CACHES = {"default": {"BACKEND": "django_redis.cache.RedisCache","LOCATION": "redis://:password@ip:6379/0", #[0号数据库,1号数据库..]"OPTIONS": {"CLIENT_CLASS": "django_redis.client.DefaultClient",},}}REDIS_TIMEOUT=7*24*60*60CUBES_REDIS_TIMEOUT=60*60NEVER_REDIS_TIMEOUT=365*24*60*603.具体使用from django.core.cache import cache #引入缓存模块cache.set('k', '12314', 30*60) #写入key为k,值为12314的缓存,有效期30分钟cache.has_key('k') #判断key为k是否存在cache.get('k') #获取key为k的缓存 cache.keys('*') #获取所有的
4.开发调试缓存(这个模式是开发调试使用的,不需要执行任何操作)
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)},}
}
5.内存缓存(将缓存的内容保存到内存区域)
CACHES = {'default': {'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', # 指定缓存使用的引擎'LOCATION': 'unique-snowflake', # 写在内存中的变量的唯一值 'TIMEOUT':300, # 缓存超时时间(默认为300秒,None表示永不过期)'OPTIONS':{'MAX_ENTRIES': 300, # 最大缓存记录的数量(默认300)'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)} }
}
6.Memcache
缓存(使用python-memcached
模块)
Memcached是Django原生支持的缓存系统.要使用Memcached,需要下载Memcached的支持库python-memcached或pylibmcCACHES = {'default': {'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', # 指定缓存使用的引擎'LOCATION': '192.168.10.100:8888', # 指定Memcache缓存服务器的IP地址和端口'OPTIONS':{'MAX_ENTRIES': 300, # 最大缓存记录的数量(默认300)'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)}}
}
7.Memcache
缓存(使用pylibmc
模块)
CACHES = {'default': {'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache', # 指定缓存使用的引擎'LOCATION':'192.168.10.100:11211', # 指定本机的11211端口为Memcache缓存服务器'OPTIONS':{'MAX_ENTRIES': 300, # 最大缓存记录的数量(默认300)'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)}, }}
Django(缓存系统)
什么是缓存Cache
缓存是一类可以更快的读取数据的介质统称,也指其它可以加快数据读取的存储方式。一般用来存储临时数据,常用介质的是读取速度很快的内存。一般来说从数据库多次把所需要的数据提取出来,要比从内存或者硬盘等一次读出来付出的成本大很多。对于中大型网站而言,使用缓存减少对数据库的访问次数是提升网站性能的关键之一。
为什么要使用Cache
在Django中,当用户请求到达视图后,视图会先从数据库提取数据放到模板中进行动态渲染,
渲染后的结果就是用户看到的网页。如果用户每次请求都从数据库提取数据并渲染,将极大降低性能,
不仅服务器压力大,而且客户端也无法即时获得响应。如果能将渲染后的结果放到速度更快的缓存中,
每次有请求过来,先检查缓存中是否有对应的资源,如果有,直接从缓存中取出来返回响应,
节省取数据和渲染的时间,不仅能大大提高系统性能,还能提高用户体验。
缓存Cache的应用场景
缓存主要适用于对页面实时性要求不高的页面。存放在缓存的数据,通常是频繁访问的,而不会经常修改的数据。我们来举几个应用例子:博客文章。假设用户一天更新一篇文章,那么可以为博客设置1天的缓存,一天后会刷新。购物网站。商品的描述信息几乎不会变化,而商品的购买数量需要根据用户情况实时更新。我们可以只选择缓存商品描述信息。缓存网页片段。比如缓存网页导航菜单和脚部(Footer)。
django-cache文档地址
.1/topics/cache/
Django中如何使用Cache
1.在视图View中使用
from django.views.decorators.cache import cache_page# 在需要缓存的视图上添加装饰器, 参数是设置timeout 超时时间, 单位是秒
@cache_page(60 * 15) [单位:s,表示缓存15分钟]
def my_view(request):
...给视图添加缓存是有风险的,如果视图所展示的网页中有经常动态变动的信息,那么被添加缓存命令不可取。缓存整个视图最实用的场景应该是这个视图所展示的网页的内容基本上不怎么变动,或者说在很长一段时间内不需要变动,这样使用缓存就非常有效。
2.在路由URLConf中使用
from django.views.decorators.cache import cache_pageurlpatterns = [
path('foo/<int:code>/', cache_page(60 * 15)(my_view)),
]URLconf 使用缓存和视图函数使用缓存需要注意的地方是一样的,因为它们都是缓存整个页面,所有都需要考虑是否整个页面都应该缓存。
3.在模板中使用
{% load cache %}
# 第一个参数是时间,第二个参数是别名
{% cache 500 sidebar request.user.username %}
.. sidebar for logged in user ..
{% endcache %} 可以保证只缓存那些适合使用缓存的 HTML 片段
4.全局的使用(通过中间件实现)
用户的请求通过中间件,经过一系列的认证等操作,如果请求的内容在缓存中存在,则使用FetchFromCacheMiddleware获取内容并返回给用户当返回给用户之前,判断缓存中是否已经存在,如果不存在,则UpdateCacheMiddleware会将缓存保存至Django的缓存之中,以实现全站缓存MIDDLEWARE = [# 站点缓存 , 注意必须在第一个位置'django.middleware.cache.UpdateCacheMiddleware',...# 站点缓存, 注意必须在最后一个位置'django.middleware.cache.FetchFromCacheMiddleware',]
Django中缓存设置
1.Database caching[数据库缓存]
my_cache_table-->数据库缓存到表中
[先查询表中有没有对应路由的缓存数据,如果有则取出]问题:通过比对过期时间判断是否重新请求数据库,缓存过期该条记录仍旧在数据库表中,需要根据具体情况删除表中过期的缓存记录1.配置mysql数据库DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql', // mysql 为mysql 数据库'NAME': 'onlinetest', // 对应使用的数据库'USER': 'root', // 对应数据库用户名'PASSWORD': 'mysql', // 对应数据库密码'HOST': '127.0.0.1', // 本地数据库'PORT': 3306, // 对应数据库端口}}2.配置cacheCACHES = {'default': {'BACKEND': 'django.core.cache.backends.db.DatabaseCache','LOCATION': 'my_cache_table',}}3.创建cache tablepython manage.py createcachetable [自动产生my_cache_table表]
2.Filesystem caching[文件系统缓存]
不在表中保存信息,而将数据保存在本地磁盘中的文件中1.配置cache[自动创建c:/foo/bar文件夹]CACHES = {'default': {'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache','LOCATION': os.path.join(BASE_DIR,'cachedata'),}}
3.redis缓存[key:value]
到达过期时间自动删除key,不用考虑优化的问题
django-redis文档/ 0.安装redis.html
1.下载redispip install django-redis2.在settings中配置redis[注意阿里云放开6379端口]CACHES = {"default": {"BACKEND": "django_redis.cache.RedisCache","LOCATION": "redis://:password@ip:6379/0", #[0号数据库,1号数据库..]"OPTIONS": {"CLIENT_CLASS": "django_redis.client.DefaultClient",},}}REDIS_TIMEOUT=7*24*60*60CUBES_REDIS_TIMEOUT=60*60NEVER_REDIS_TIMEOUT=365*24*60*603.具体使用from django.core.cache import cache #引入缓存模块cache.set('k', '12314', 30*60) #写入key为k,值为12314的缓存,有效期30分钟cache.has_key('k') #判断key为k是否存在cache.get('k') #获取key为k的缓存 cache.keys('*') #获取所有的
4.开发调试缓存(这个模式是开发调试使用的,不需要执行任何操作)
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)},}
}
5.内存缓存(将缓存的内容保存到内存区域)
CACHES = {'default': {'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', # 指定缓存使用的引擎'LOCATION': 'unique-snowflake', # 写在内存中的变量的唯一值 'TIMEOUT':300, # 缓存超时时间(默认为300秒,None表示永不过期)'OPTIONS':{'MAX_ENTRIES': 300, # 最大缓存记录的数量(默认300)'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)} }
}
6.Memcache
缓存(使用python-memcached
模块)
Memcached是Django原生支持的缓存系统.要使用Memcached,需要下载Memcached的支持库python-memcached或pylibmcCACHES = {'default': {'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', # 指定缓存使用的引擎'LOCATION': '192.168.10.100:8888', # 指定Memcache缓存服务器的IP地址和端口'OPTIONS':{'MAX_ENTRIES': 300, # 最大缓存记录的数量(默认300)'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)}}
}
7.Memcache
缓存(使用pylibmc
模块)
CACHES = {'default': {'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache', # 指定缓存使用的引擎'LOCATION':'192.168.10.100:11211', # 指定本机的11211端口为Memcache缓存服务器'OPTIONS':{'MAX_ENTRIES': 300, # 最大缓存记录的数量(默认300)'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)}, }}