django项目的memcache缓存技术

存储缓存常用的方式 

缓存针对于动态网站居多,动态网站的数据来自于数据库,或者其他存储容器,当请求页面的时候需要先查询数据,动态的渲染数据,当请求频繁的时候,响应效率会变低,服务器压力变大。

所以在第一次访问的时候,就将数据先放在一个地方,这个地方可以是内存,数据库,本地,然后再次访问的时候访问刚才的地方即可,那么这种技术叫缓存。

如果查询的页面在缓存中就从缓存中取出数据,如果不在缓存中的话,就把数据加入到缓存中,然后再返回数据。

django项目的memcache缓存技术_第1张图片

常见的缓存方式

缓存常用的方式:Memcache缓存、本地缓存、数据库缓存。

缓存使用的方式:全栈粒度缓存、视图粒度缓存、路由粒度缓存、页面粒度缓存等。

Memcache缓存

Memcache缓存是一种分布式的高速缓存系统,通常用来提高网站的访问速度。

软件下载和安装地址:https://www.newasp.net/soft/63735.html

下载解压缓存包,在解压目录下,以管理员身份打开命令行,安装memcache。命令为:memcached.exe -d install

打开memcache

计算机 --> 鼠标右击 --> 管理

django项目的memcache缓存技术_第2张图片

安装django-memcache

激活虚拟环境,安装django-memcache ,命令: pip install python-memcached

django项目的memcache缓存技术_第3张图片

Cache的配置

Cache需要有自己的配置,主settings配置结构可以参考global_settings.py中的配置。

django项目的memcache缓存技术_第4张图片

django项目的memcache缓存技术_第5张图片

在自己的主settings当中配置

django项目的memcache缓存技术_第6张图片

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方法里的内容

查看缓存 

django项目的memcache缓存技术_第7张图片

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。

对应的包和版本如下:

django项目的memcache缓存技术_第8张图片

settings关于redis的配置参考前文

启动redis

django项目的memcache缓存技术_第9张图片

配置主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 表名。

django项目的memcache缓存技术_第10张图片

修改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项目的memcache缓存技术_第11张图片

 

缓存使用的方式

全栈粒度缓存

Django 全栈缓存通过缓存配置还有中间件来声明,首先配置settings的中间件,配置的位置必须一首一尾。

django项目的memcache缓存技术_第12张图片

django项目的memcache缓存技术_第13张图片

代码如下:

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())

 

你可能感兴趣的:(Django)