yanadoude

缓存

缓存是将一些常用的数据保存到内存或者memcache中。在一定的时间内有人来访问这些数据时,则不再去执行数据库及渲染等操作,而是直接从内存或memcache的缓存中去取得数据,然后返回给用户。

一、如何提高网站并发量?

  1. cdn加速:把静态资源放到别人服务器
  2. 精灵图
  3. 后台数据库用mysql+redis
  4. sql的优化:索引,分库分表,读写分离
  5. 用缓存
  6. 程序架构:集群化的部署,分布式+异步 celery:分布式异步任务

二、缓存方式

1. 开发调式缓存

开发调试缓存为开发调试使用,实际上不执行任何操作

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.dummy.DummyCache',  # 缓存后台使用的引擎
        'TIMEOUT': 300,     # 缓存超时时间(默认300秒,None表示永不过期,0表示立即过期)
        'OPTIONS':{
            'MAX_ENTRIES': 300,    # 最大缓存记录的数量(默认300)      
            # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
            'CULL_FREQUENCY': 3,           
        }
    }
}

2. 内存缓存

将缓存内容保存至内存区域中

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',  # 指定缓存使用的引擎
        'LOCATION': 'unique-snowflake',         # 写在内存中的变量的唯一值 
        'TIMEOUT':300,             # 缓存超时时间(默认为300秒,None表示永不过期)
        'OPTIONS':{
            'MAX_ENTRIES': 300,    # 最大缓存记录的数量(默认300)      
            # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
            'CULL_FREQUENCY': 3,           
        } 
    }
}

3. 文件缓存

Django会以自己的形式把缓存文件保存在配置文件中指定的目录中

CACHES = {
    'default': {
        'BACKEND':'django.core.cache.backends.filebased.FileBasedCache', #指定缓存使用的引擎
        'LOCATION': '/var/tmp/django_cache',        #指定缓存的路径
        'TIMEOUT':300,              #缓存超时时间(默认为300秒,None表示永不过期)
        'OPTIONS':{
            'MAX_ENTRIES': 300,    # 最大缓存记录的数量(默认300)      
            # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
            'CULL_FREQUENCY': 3,           
        }
    }   
}

4. 数据库缓存

把缓存数据存储在数据库中

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',  # 指定缓存使用的引擎
        'LOCATION': 'cache_table',          # 数据库表    
        'OPTIONS':{
            'MAX_ENTRIES': 300, 	# 最大缓存记录的数量(默认300)
            # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
            'CULL_FREQUENCY': 3,          
        }  
    }   
}

5. Memcache缓存

5.1 使用python-memcached模块

缓存到Memcache数据库

# 此缓存使用python-memcached模块连接memcache          
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '127.0.0.1:11211',   #通过网络socket连接,缓存到单台服务的 memcache数据库
    }
}
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': 'unix:/tmp/memcached.sock',  #通过本地文件socket,缓存本机memcache数据库
    }
}   
#通过网络socket连接,缓存到memcache 集群
CACHES = {              #其中 6和89为
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': [
            ('172.19.26.240:11211',6),                   
            ('172.19.26.242:11211',89),                 
        ]
    }
}
5.2 使用pylibmc模块

还可以使用其他Python模块连接到Memcache,老铁你是否联想到了 redis?默认还不支持!需要借助第三方插件;

# 此缓存使用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',
        ]
    }
}

三、缓存应用

1. 单独视图缓存

因为缓存的原因,不停的刷新浏览器时会发现,页面上显示的时间每15秒钟变化一次;

立即在数据库中添加一个用户对象,刷新浏览器,网页上不会立即显示刚才添加的用户;

一直刷新浏览器15秒后,新添加的用户才会在前端页面上显示出来。

添加路由记录

url(r"^index$",views.index)

定义视图函数

from app01 import models
from django.views.decorators.cache import cache_page  #导入设置缓存的装饰器
import time

@cache_page(15)	#超时时间为15秒
def index(request):
    user_list = models.UserInfo.objects.all()
    ctime = time.time()
    return render(request,"index.html",{"user_list":user_list,"ctime":ctime})

定义HTML页面

<body>
    <h1>{{ ctime }}</h1>
    <ul>
        {% for user in user_list %}
        <li>{{ user.name }}</li>
        {% endfor %}
    </ul>
</body>

2. 局部视图缓存

刷新页面时,整个网页有一部分页面实现缓存即为局部视图缓存

添加路由记录

url(r"^index$",views.index)

定义视图函数

from django.shortcuts import render
import time
def index(request):
    ctime = time.time()
    return render(request,"index.html",{"ctime":ctime})

定义HTML页面

{% load cache %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meat charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>{{ ctime }}</h1>
    {% cache 15 'aaa' %}
    <h1>{{ ctime }}</h1>
    {% endcache %}
</body>
</html>

刷新浏览器可以看到,第一个时间实时变化,后面一个时间15秒钟变化一次

3. 全站使用缓存

  1. 用户的请求到达中间件,并经过中间件的认证

  2. 如果请求的内容在缓存中,则使用FetchFromCacheMiddleware获取内容并返回给用户

  3. 请求的内容不存在缓存,去操作数据库取得数据,经过渲染生成字符串返回给用户

  4. 当返回给用户之前,判断缓存中是否已经存在该数据,如果不存在,则UpdateCacheMiddleware会基于取得的数据生成Django的缓存

添加路由记录

url(r"^index$",views.index)

配置文件

from django.middleware.cache import UpdateCacheMiddleware
from django.middleware.cache import FetchFromCacheMiddleware
MIDDLEWARE_CLASSES = [
    '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.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django.middleware.cache.FetchFromCacheMiddleware',
] 
CACHE_MIDDLEWARE_SECONDS=15

定义视图函数

from django.shortcuts import render
import time
def index(request):
    ctime = time.time()
    return render(request,"index.html",{"ctime":ctime})

定义HTML网页

<body>
    <h1>{{ ctime }}</h1>
    <ul>
        {% for user in user_list %}
        <li>{{ user.name }}</li>
    </ul>
</body>

刷新浏览器时15秒,页面上的时间变化一次,这样就实现了全站缓存

相关文章: