博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django缓存和内置信号
阅读量:5125 次
发布时间:2019-06-13

本文共 7408 字,大约阅读时间需要 24 分钟。

缓存

简单概括就是将对数据库操作查询所得到的数据放入另外一台机器上(缓存)中,当用户再次请求时,直接去缓存中拿,避免对数据库的频繁操作,加快数据的显示时间,需要知道的是,缓存里面的数据一般都设置有超时时间,缓存一般用在数据变化不大,实时率不高的情况下。

由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,5分钟内(默认配置)再有人来访问时,则不再去执行view中的操作,而是直接从内存或者Redis中之前缓存的内容拿到,并返回。

Django中提供了6种缓存方式:

  • 开发调试
  • 内存
  • 文件
  • 数据库
  • Memcache缓存(python-memcached模块)
  • Memcache缓存(pylibmc模块)

配置

a、开发调试

# 此为开始调试用,实际内部不做任何操作    # 配置:        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】)            }        }    # 自定义key    def default_key_func(key, key_prefix, version):        """        Default function to generate keys.        Constructs the key used by all other methods. By default it prepends        the `key_prefix'. KEY_FUNCTION can be used to specify an alternate        function with custom key making behavior.        """        return '%s:%s:%s' % (key_prefix, version, key)    def get_key_func(key_func):        """        Function to decide which key function to use.        Defaults to ``default_key_func``.        """        if key_func is not None:            if callable(key_func):                return key_func            else:                return import_string(key_func)        return default_key_func
View Code

b、内存

# 此缓存将内容保存至内存的变量中    # 配置:        CACHES = {            'default': {                'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',                'LOCATION': 'unique-snowflake',            }        }    # 注:其他配置同开发调试版本,就是将开发调试版本里面的这几句换成上面这个即可
View Code

c、文件(网站比较小,还没钱,可以用文件的形式)

# 此缓存将内容保存至文件    # 配置:        CACHES = {            'default': {                'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',                'LOCATION': '/var/tmp/django_cache',            }        }    # 注:其他配置同开发调试版本
View Code

d、数据库

# 此缓存将内容保存至数据库    # 配置:        CACHES = {            'default': {                'BACKEND': 'django.core.cache.backends.db.DatabaseCache',                'LOCATION': 'my_cache_table', # 数据库表            }        }    # 注:执行创建表命令 python manage.py createcachetable
View Code

e、Memcache缓存(python-memcached模块)

# 此缓存使用python-memcached模块连接memcache    CACHES = {        'default': {            'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',            'LOCATION': '127.0.0.1:11211',        }    }    CACHES = {        'default': {            'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',            'LOCATION': 'unix:/tmp/memcached.sock',        }    }       CACHES = {        'default': {            'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',            'LOCATION': [                '172.19.26.240:11211',                '172.19.26.242:11211',            ]        }    }
View Code

f、Memcache缓存(pylibmc模块)

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

g. Redis缓存(依赖:pip3 install django-redis)

CACHES = {    "default": {        "BACKEND": "django_redis.cache.RedisCache",        "LOCATION": "redis://127.0.0.1:6379",        "OPTIONS": {            "CLIENT_CLASS": "django_redis.client.DefaultClient",            "CONNECTION_POOL_KWARGS": {
"max_connections": 100} # "PASSWORD": "密码", } }}
View Code
from django_redis import get_redis_connectionconn = get_redis_connection("default")
视图中链接并操作

应用

a. 全站使用(利用Django中间件)

使用中间件,经过一系列的认证等操作,如果内容在缓存中存在,则使用FetchFromCacheMiddleware获取内容并返回给用户,当返回给用户之前,判断缓存中是否已经存在,如果不存在则UpdateCacheMiddleware会将缓存保存至缓存,从而实现全站缓存    MIDDLEWARE = [        'django.middleware.cache.UpdateCacheMiddleware',        # 其他中间件...        'django.middleware.cache.FetchFromCacheMiddleware',    ]    CACHE_MIDDLEWARE_ALIAS = ""    CACHE_MIDDLEWARE_SECONDS = ""    CACHE_MIDDLEWARE_KEY_PREFIX = ""
View Code

b. 单独视图缓存

方式一:        from django.views.decorators.cache import cache_page        @cache_page(60 * 15)        def my_view(request):            ...    方式二:        from django.views.decorators.cache import cache_page        urlpatterns = [            url(r'^foo/([0-9]{1,2})/$', cache_page(60 * 15)(my_view)),        ]
View Code

c、局部视图(html页面)使用

a. 引入TemplateTag        {
% load cache %} b. 使用缓存 {
% cache 5000 缓存key %} 缓存内容 {
% endcache %}
View Code

 

信号

抛砖引玉

1.如何对数据库的增加操作记录日志

2.信号比中间件的区别

Django中提供了“信号调度”,用于在框架执行操作时解耦。通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者。

Django内置信号

Model signals
    
pre_init                    
# django的modal执行其构造方法前,自动触发
    
post_init                   
# django的modal执行其构造方法后,自动触发
    
pre_save                    
# django的modal对象保存前,自动触发
    
post_save                   
# django的modal对象保存后,自动触发
    
pre_delete                  
# django的modal对象删除前,自动触发
    
post_delete                 
# django的modal对象删除后,自动触发
    
m2m_changed                 
# django的modal中使用m2m字段操作第三张表(add,remove,clear)前后,自动触发
    
class_prepared              
# 程序启动时,检测已注册的app中modal类,对于每一个类,自动触发
Management signals
    
pre_migrate                 
# 执行migrate命令前,自动触发
    
post_migrate                
# 执行migrate命令后,自动触发
Request
/
response signals
    
request_started             
# 请求到来前,自动触发
    
request_finished            
# 请求结束后,自动触发
    
got_request_exception       
# 请求异常后,自动触发
Test signals
    
setting_changed             
# 使用test测试修改配置文件时,自动触发
    
template_rendered           
# 使用test测试渲染模板时,自动触发
Database Wrappers
    
connection_created          
# 创建数据库连接时,自动触发

对于Django内置的信号,仅需在Django必定能执行的地方注册指定信号,当程序执行相应操作时,自动触发注册函数:

from django.core.signals import request_finished    from django.core.signals import request_started    from django.core.signals import got_request_exception    from django.db.models.signals import class_prepared    from django.db.models.signals import pre_init, post_init    from django.db.models.signals import pre_save, post_save    from django.db.models.signals import pre_delete, post_delete    from django.db.models.signals import m2m_changed    from django.db.models.signals import pre_migrate, post_migrate    from django.test.signals import setting_changed    from django.test.signals import template_rendered    from django.db.backends.signals import connection_created    def callback(sender, **kwargs):        print("xxoo_callback")        print(sender,kwargs)    xxoo.connect(callback)    # xxoo指上述导入的模块名
View Code
from django.core.signals import request_finishedfrom django.dispatch import receiver@receiver(request_finished)def my_callback(sender, **kwargs):    print("Request finished!")
View Code

自定义信号

 

转载于:https://www.cnblogs.com/Dominic-Ji/p/9279742.html

你可能感兴趣的文章
WPF--TextBlock的ToolTip附加属性
查看>>
linux环境配置
查看>>
《Java并发编程的艺术》之阻塞队列
查看>>
深入浅出 Java Concurrency (6): 锁机制 part 1[转]
查看>>
【算法】禁忌搜索算法(Tabu Search,TS)超详细通俗解析附C++代码实例
查看>>
MFC取消菜单栏
查看>>
第四次作业
查看>>
安防摄像头Onvif、RTSP、GB28181转web无插件直播卡顿分析
查看>>
POJ 2349 Prim
查看>>
C++总结笔记(二)面向对象
查看>>
WCF系列(1)—— CustomBehavior 入门
查看>>
Hibernate一对一关联------主键关联(亲测成功)
查看>>
Centos7.5 lnmp+mongodb扩展
查看>>
markdown绘图插件----mermaid简介
查看>>
java算法:冒泡排序
查看>>
string.Format 指定字符串宽度
查看>>
构造函数和clone以及在继承中
查看>>
IOS web app一些实用的属性设置
查看>>
理解正确的日志输出级别
查看>>
Shell脚本完成hadoop的集群安装
查看>>