缓存针对于动态网站居多,动态网站的数据来自于数据库,或者其他存储容器,当请求页面的时候需要先查询数据,动态的渲染数据,当请求频繁的时候,响应效率会变低,服务器压力变大。
所以在第一次访问的时候,就将数据先放在一个地方,这个地方可以是内存,数据库,本地,然后再次访问的时候访问刚才的地方即可,那么这种技术叫缓存。
如果查询的页面在缓存中就从缓存中取出数据,如果不在缓存中的话,就把数据加入到缓存中,然后再返回数据。
常见的缓存方式
缓存常用的方式:Memcache缓存、本地缓存、数据库缓存。
缓存使用的方式:全栈粒度缓存、视图粒度缓存、路由粒度缓存、页面粒度缓存等。
Memcache缓存
Memcache缓存是一种分布式的高速缓存系统,通常用来提高网站的访问速度。
软件下载和安装地址:https://www.newasp.net/soft/63735.html
下载解压缓存包,在解压目录下,以管理员身份打开命令行,安装memcache。命令为:memcached.exe -d install
打开memcache
计算机 --> 鼠标右击 --> 管理
安装django-memcache
激活虚拟环境,安装django-memcache ,命令: pip install python-memcached
Cache的配置
Cache需要有自己的配置,主settings配置结构可以参考global_settings.py中的配置。
在自己的主settings当中配置
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', #申请使用memcache缓存 'LOCATION':[ '127.0.0.1:11211' #memcache端口 ] #memcache地址 } }
memcache视图缓存
from django.views.decorators.cache import cache_page @cache_page(60*15) #对当前视图进行缓存,缓存的时间是15分钟 def littlewrite(request): rep = HttpResponse('I am response') #定义HttpResponse return rep #返回hello方法里的内容
查看缓存
memcache 路由缓存
在开发过程当中,有可能使用不同的路由指向同一个视图。比如商品的上架和下架功能,不同的路由,指向同一个视图,这个时候就需要针对路由进行缓存。
from django.views.decorators.cache import cache_page urlpatterns += [ path('lw/',littlewrite), path(r'lw1/',cache_page(10*60)(littlewrite)), #cache_page(10*60)(littlewrite),10*60为缓存时间,littlewrite为路由对应的视图 ]
本地缓存
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', #申请使用memcache缓存 } }
redis数据库缓存
redis数据库缓存需要使用pip install django-redis和pip install redis,安装django-redis和redis。
对应的包和版本如下:
settings关于redis的配置参考前文
启动redis
配置主settings
#数据库缓存 CACHES = { 'default': { 'BACKEND': 'django_redis.cache.RedisCache', #申请使用redisCache缓存 'LOCATION':[ 'redis://127.0.0.1:6379/1' #6379/1,redis的端口和第redis的几个库 ],#memcache地址 'OPTIONS':{ 'CLIENT_CLASS': 'django_redis.client.DefaultClient',#使用什么来连接redis数据库 }, } }
mysql数据库缓存
创建对应存放缓存的数据表,命令为:python manage.py createcachetable 表名。
修改settings配置
CACHES = { 'default':{ 'BACKEND':'django.core.cache.backends.db.DatabaseCache',#使用默认数据库缓存 'LOCATION':'cachetale', #存放缓存的表 } } LANGUAGE_CODE = 'zh-hans' TIME_ZONE = 'Asia/Shanghai' USE_I18N = True USE_L10N = True USE_TZ = False #默认时区为UTC
全栈粒度缓存
Django 全栈缓存通过缓存配置还有中间件来声明,首先配置settings的中间件,配置的位置必须一首一尾。
代码如下:
MIDDLEWARE = [ 'django.middleware.cache.UpdateCacheMiddleware', #缓存首配置 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'FreshShop.middleware.MiddlewareTest', 'django.middleware.cache.FetchFromCacheMiddleware', #缓存尾配置 ] CACHE_MIDDLEWARE_KEY_PREFIX = '' """同一个django项目下,当多个网站共享缓存的时候,可以将该配置指向当前网站的识别, 这个识别通常是域名,也可以是其他唯一标识该网站的字符,其目的是为了防止多个网站共享 缓存造成缓存混淆。 """ CACHE_MIDDLEWARE_SECONDS = 600 #生存期
视图粒度缓存
from django.views.decorators.cache import cache_page @cache_page(60*15) #缓存生存期为15分钟 def littlewrite(request): rep = HttpResponse('I am response') #定义HttpResponse return rep #返回hello方法里的内容
路由粒度缓存
from django.views.decorators.cache import cache_page urlpatterns += [ cache_page(10*60)(littlewrite), #10*60为缓存时间,littlewrite为路由对应的视图 ]
页面粒度缓存,如:在前端对较大的图片缓存
底层缓存接口
set 设置cache、get 获取 cache和add 添加 cache。
from django.views.decorators.cache import cache_page from django.core.cache import cache @cache_page(60*15) def littlewrite(request): store_data = cache.get('store_data') #如果没有返回NONE if store_data: #如果缓存中有数据,返回缓存中的数据 store_data = store_data else: #如果缓存中没有数据就从数据库中找出数据,然后设置和加入缓存以及返回数据 data = Store.objects.all() cache.set('store_data',data,30) store_data = data return render(request,'store/ajax_goods_list.html',locals())