Django 缓存方案

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介:

在大型网站上,如果访问的流量很多,又有很多动态的内容,这样每次获取一个信息都要去访问数据库,效率就会比较低下。这种情况下,一般都会使用缓存机制,首先去缓存里面找,如果有信息,那么直接获取;没有的话才去数据库获取,然后在缓存里面生成一个数据可以给下一次访问使用。


Django里面支持5种常见的缓存设置。

  • 开发测试

  • 本地内存

  • 文件

  • 数据库

  • Memcached(或者Redis)


这些配置都是在settings.py里面配置的。


开发测试,如果希望生产环境配置缓存,测试不需要,那么只需设置为dummycache就行了,他不做任何操作

1
2
3
4
5
6
7
8
9
10
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)                },                'KEY_PREFIX': '',                                             # 缓存key的前缀(默认空)
          'VERSION' 1 ,                                              # 缓存key的版本(默认1)
          'KEY_FUNCTION'  函数名                                       # 生成key的函数(默认函数会生成为:【前缀:版本:key】)            }
         }


本地内存

1
2
3
4
5
6
CACHES  =  {
     'default' : {
         'BACKEND' 'django.core.cache.backends.locmem.LocMemCache' ,
         'LOCATION' : os.path.join(BASE_DIR, 'cache' )
     }
}



文件

1
2
3
4
5
6
CACHES  =  {
     'default' : {
         'BACKEND' 'django.core.cache.backends.filebased.FileBasedCache' ,
         'LOCATION' : os.path.join(BASE_DIR, 'cache' )
     }
}


数据库

1
2
3
4
5
6
CACHES  =  {
     'default' : {
         'BACKEND' 'django.core.cache.backends.db.DatabaseCache' ,
         'LOCATION' : os.path.join(BASE_DIR, 'cache' )
     }
}


Memcache 或者Redis,我们甚至可以同时设置多个不同的cache位置

CACHES = {
    "redis": {
        "BACKEND": "redis_cache.cache.RedisCache",
        "LOCATION": "127.0.0.1:6379",
        "OPTIONS": {
            "CLIENT_CLASS": "redis_cache.client.DefaultClient",
        }
    },
    'memcache': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '127.0.0.1:11211',
        'options': {
            'MAX_ENTRIES': 1024,
        }
    },
     'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
        'LOCATION': 'unique-snowflake',
        'options': {
            'MAX_ENTRIES': 1024,
        }
    }}



如何应用呢?

Django 提供了3个级别的应用。


全部缓存

这种方式需要添加两条中间件,注意一上一下的

settings.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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' ,
     'django.middleware.cache.FetchFromCacheMiddleware' ,
]
 
 
CACHES  =  {
     'default' : {
         'BACKEND' 'django.core.cache.backends.filebased.FileBasedCache' ,
         'LOCATION' : os.path.join(BASE_DIR, 'cache' )
     }
}



创建一个文件夹来存放缓存


wKioL1mwun7ht8fwAAAaZK0mJ4s299.png


views.py

1
2
3
4
def  cache(request):
     import  time
     ctime  =  time.time()
     return  render(request,  'cache.html' , { 'ctime' : ctime})


cache.html


1
2
3
4
5
6
7
8
9
10
11
<!DOCTYPE html>
< html  lang = "en" >
< head >
     < meta  charset = "UTF-8" >
     < title ></ title >
</ head >
< body >
     < h1 >{{ ctime }}</ h1 >
     < h1 >{{ ctime }}</ h1 >
</ body >
</ html >

这样子整个页面都给缓存了


如果希望更细粒度的缓存,我们可以使用装饰器来装饰对应的视图函数

去掉中间件的设置,然后在我们的视图函数上

1
2
3
4
5
6
from  django.views.decorators.cache  import  cache_page
@cache_page ( 10 )
def  cache(request):
     import  time
     ctime  =  time.time()
     return  render(request,  'cache.html' , { 'ctime' : ctime})


这样数据缓存10秒之后才会重新刷新

wKiom1mwvyexaZcmAAAfNKer2WU627.png



我们还可以再更细粒度的缓存。这次我们在对应的模板文件上针对某个数据进行缓存。


去掉装饰器,然后在cache.html修改

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


执行操作,上面两个数据是实时更新的,第三个数据缓存5秒之后才更新

wKiom1mwvyiCakVBAAAq9D1t-hk980.png






本文转自 beanxyz 51CTO博客,原文链接:http://blog.51cto.com/beanxyz/1963363,如需转载请自行联系原作者

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
4月前
|
缓存 NoSQL Java
聊聊分布式应用中的缓存方案(一)
聊聊分布式应用中的缓存方案(一)
37 0
|
6月前
|
存储 缓存 API
Django缓存的使用方法
Django缓存的使用方法
|
3月前
|
缓存 NoSQL 关系型数据库
Mysql的缓存方案
Mysql的缓存方案
45 0
|
8月前
|
缓存 中间件 数据库
django -- 缓存
django -- 缓存
|
8月前
|
缓存 SpringCloudAlibaba NoSQL
Spring Boot多级缓存实现方案
整合redis和caffeine实现多级缓存,解决上面单一缓存的痛点,从而做到相互补足
365 0
|
4月前
|
缓存 Java 数据库连接
干翻Mybatis源码系列之第八篇:Mybatis提供的缓存方案细节注意
干翻Mybatis源码系列之第八篇:Mybatis提供的缓存方案细节注意
|
4月前
|
设计模式 缓存 Java
干翻Mybatis源码系列之第七篇:Mybatis提供的集成缓存方案
干翻Mybatis源码系列之第七篇:Mybatis提供的集成缓存方案
|
4月前
|
存储 缓存 Java
【干翻Mybatis源码系列】Mybatis缓存方案第一篇 之 Mybatis缓存方案概述
【干翻Mybatis源码系列】Mybatis缓存方案第一篇 之 Mybatis缓存方案概述
|
5月前
|
缓存 Java 数据库连接
为什么不推荐使用 MyBatis 二级缓存,有哪些替代方案?
为什么不推荐使用 MyBatis 二级缓存,有哪些替代方案?
65 0
|
5月前
|
缓存 NoSQL 数据库
31 Django高级 - 缓存
31 Django高级 - 缓存
28 0