缓存

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

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

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

二、缓存方式

1. 开发调式缓存

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

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

2. 内存缓存

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

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

3. 文件缓存

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

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

4. 数据库缓存

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

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

5. Memcache缓存

5.1 使用python-memcached模块

缓存到Memcache数据库

  1. # 此缓存使用python-memcached模块连接memcache
  2. CACHES = {
  3. 'default': {
  4. 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
  5. 'LOCATION': '127.0.0.1:11211', #通过网络socket连接,缓存到单台服务的 memcache数据库
  6. }
  7. }
  8. CACHES = {
  9. 'default': {
  10. 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
  11. 'LOCATION': 'unix:/tmp/memcached.sock', #通过本地文件socket,缓存本机memcache数据库
  12. }
  13. }
  14. #通过网络socket连接,缓存到memcache 集群
  15. CACHES = { #其中 6和89为
  16. 'default': {
  17. 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
  18. 'LOCATION': [
  19. ('172.19.26.240:11211',6),
  20. ('172.19.26.242:11211',89),
  21. ]
  22. }
  23. }
5.2 使用pylibmc模块

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

  1. # 此缓存使用pylibmc模块连接memcache
  2. CACHES = {
  3. 'default': {
  4. 'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
  5. 'LOCATION': '127.0.0.1:11211',
  6. }
  7. }
  8. CACHES = {
  9. 'default': {
  10. 'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
  11. 'LOCATION': '/tmp/memcached.sock',
  12. }
  13. }
  14. CACHES = {
  15. 'default': {
  16. 'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
  17. 'LOCATION': [
  18. '172.19.26.240:11211',
  19. '172.19.26.242:11211',
  20. ]
  21. }
  22. }

三、缓存应用

1. 单独视图缓存

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

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

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

添加路由记录

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

定义视图函数

  1. from app01 import models
  2. from django.views.decorators.cache import cache_page #导入设置缓存的装饰器
  3. import time
  4. @cache_page(15) #超时时间为15秒
  5. def index(request):
  6. user_list = models.UserInfo.objects.all()
  7. ctime = time.time()
  8. return render(request,"index.html",{"user_list":user_list,"ctime":ctime})

定义HTML页面

  1. <body>
  2. <h1>{{ ctime }}</h1>
  3. <ul>
  4. {% for user in user_list %}
  5. <li>{{ user.name }}</li>
  6. {% endfor %}
  7. </ul>
  8. </body>

2. 局部视图缓存

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

添加路由记录

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

定义视图函数

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

定义HTML页面

  1. {% load cache %}
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5. <meat charset="UTF-8">
  6. <title>Title</title>
  7. </head>
  8. <body>
  9. <h1>{{ ctime }}</h1>
  10. {% cache 15 'aaa' %}
  11. <h1>{{ ctime }}</h1>
  12. {% endcache %}
  13. </body>
  14. </html>

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

3. 全站使用缓存

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

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

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

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

添加路由记录

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

配置文件

  1. from django.middleware.cache import UpdateCacheMiddleware
  2. from django.middleware.cache import FetchFromCacheMiddleware
  3. MIDDLEWARE_CLASSES = [
  4. 'django.middleware.cache.UpdateCacheMiddleware',
  5. 'django.middleware.security.SecurityMiddleware',
  6. 'django.contrib.sessions.middleware.SessionMiddleware',
  7. 'django.middleware.common.CommonMiddleware',
  8. 'django.middleware.csrf.CsrfViewMiddleware',
  9. 'django.contrib.auth.middleware.AuthenticationMiddleware',
  10. 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
  11. 'django.contrib.messages.middleware.MessageMiddleware',
  12. 'django.middleware.clickjacking.XFrameOptionsMiddleware',
  13. 'django.middleware.cache.FetchFromCacheMiddleware',
  14. ]
  15. CACHE_MIDDLEWARE_SECONDS=15

定义视图函数

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

定义HTML网页

  1. <body>
  2. <h1>{{ ctime }}</h1>
  3. <ul>
  4. {% for user in user_list %}
  5. <li>{{ user.name }}</li>
  6. </ul>
  7. </body>

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

07.Django-缓存的更多相关文章

  1. 07: Django 使用ldap登录、注销等

    目录:Django其他篇 01:Django基础篇 02:Django进阶篇 03:Django数据库操作--->Model 04: Form 验证用户数据 & 生成html 05:Mo ...

  2. Django缓存使用方法

    Django缓存分为Session和Cookie:Session为放在服务器端的缓存:Cookie为放在客户端(浏览器)的缓存. Session一般用来保存登录会话:Cookie一般用来保存一些个性化 ...

  3. Django 缓存系统

    Django 是动态网站,一般来说需要实时地生成访问的网页,展示给访问者,这样,内容可以随时变化,但是从数据库读多次把所需要的数据取出来,要比从内存或者硬盘等一次读出来 付出的成本大很多. 缓存系统工 ...

  4. drf版本控制 和django缓存,跨域问题,

    drf版本控制 基于url的get传参方式 REST_FRAMEWORK={ # "DEFAULT_AUTHENTICATION_CLASSES":["app01.aut ...

  5. 版本控制,django缓存,跨域问题解决

    复习 分页: 1. 简单分页 2. 偏移分页 3. 加密分页 解析器:客户处理前端提交来的数据 urlencode: body体中的数据格式: key=value& formdata编码:为区 ...

  6. 中间件和Django缓存

    中间件定义: 中间件是一个.一个的管道,如果相对任何所有的通过Django的请求进行管理都需要自定义中间件 中间件可以对进来的请求和出去的请求进行控制 中间件是一类. 看下面的代码在settings里 ...

  7. 一.rest-framework之版本控制 二、Django缓存 三、跨域问题 四、drf分页器 五、响应器 六、url控制器

    一.rest-framework之版本控制 1.作用 用于版本的控制 2.内置的版本控制 from rest_framework.versioning import QueryParameterVer ...

  8. Django缓存设置

    由于Django构建得是动态网站,每次客户端请求都要严重依赖数据库,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中, ...

  9. [django]django缓存

    发现搞了全局缓存后,刷新得不到最新数据了. 还好有过期时间 redis常用: https://www.cnblogs.com/fansik/p/5483060.html django-redis缓存: ...

  10. Django - 缓存应用

    Django缓存应用: https://www.cnblogs.com/zuoshoushizi/p/7850281.html https://www.cnblogs.com/alice-bj/p/9 ...

随机推荐

  1. 浅析Block闭包

    浅析Block闭包 简单来说,block就是将函数及其上下文封装起来的对象,从功能上可以把它看作是C++中的匿名函数,也可称之为块. Block类型写法: 返回值+(^块名)+(参数)= ^(参数){ ...

  2. Error creating bean with name 'org.springframework.aop.aspectj.AspectJPointc

    问题 出现报错: Error creating bean with name 'org.springframework.aop.aspectj.AspectJPointc 原因 缺失两个库文件: as ...

  3. Mac更新系统后提示xcrun error

    更新mac os后无法运行git,gcc等命令,出现missing xcrun错误. 这是因为更新系统后会卸载xcode,重新安装后会缺失xcode的命令行工具(command line tools) ...

  4. 【MySQL】剖析MySQL读写分离技术

    主从技术的一个基本流程图: 如何实现主从复制的呢: MySQL  Master(主节点) 1>当一个请求来时,首先由[mysqld]写入到我们的主[data]中 2>然后[mysqld]将 ...

  5. Java——去除字符串中的中文

    import java.util.regex.Matcher; import java.util.regex.Pattern; public class RemoveStrChinese { priv ...

  6. 【项目练习】thinkphp用户注册

    使用mvc,ajax 路由 //后台登陆 Route::group('admin', function () { Route::rule('login', 'admin/Index/login'); ...

  7. centos 7 vscode cmake 编译c++工程

    一.环境说明 1)gcc/g++  cmake安装建议 gcc/g++内核自带的即可,如果需要新的自行安装, cmake也一样,如有需要新的版本自行安装. 2)vscode安装插件 必要的插件c/c+ ...

  8. 查看包名和Activity的小工具

    添加到右键菜单,很方便. 做个记录:请移步原文

  9. Java工作流引擎的测试容器-功能-使用方法-注意事项

    工作流引擎的测试容器-功能-使用方法-注意事项 关键字 Ccbpm, ccflow,jflow,工作流引擎,工作流引擎测试容器,表单引擎 功能说明 工作流的测试容器是为了解决手工模拟人工登录模式下测试 ...

  10. ngnix随笔一

    nginx安装及启动 1.用yum源安装,首先配置yum源 在“/etc/yum.repo.d/”下创建yum源文件 例如:cd /etc/yum.repo.d/nginx.repo [nginx-s ...