首页 > 其他分享 >【补充】Django缓存与内置信号

【补充】Django缓存与内置信号

时间:2023-07-17 11:24:32浏览次数:44  
标签:内置 cache django signals 缓存 key import Django

【一】缓存的介绍

【1】什么是缓存

  • 简单概括就是将对数据库操作查询所得到的数据放入另外一台机器上(缓存)中

    • 当用户再次请求时,直接去缓存中拿,避免对数据库的频繁操作,加快数据的显示时间
    • 需要知道的是,缓存里面的数据一般都设置有超时时间,缓存一般用在数据变化不大,实时率不高的情况下。
  • 由于Django是动态网站,所有每次请求均会去数据进行相应的操作

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

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

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

【二】配置

【1】开发调试

# 此为开始调试用,实际内部不做任何操作
    # 配置:
        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

【2】内存

# 此缓存将内容保存至内存的变量中
    # 配置:
        CACHES = {
            'default': {
                'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
                'LOCATION': 'unique-snowflake',
            }
        }

    # 注:其他配置同开发调试版本,就是将开发调试版本里面的这几句换成上面这个即可

【3】文件(网站比较小,还没钱,可以用文件的形式)

# 此缓存将内容保存至文件
    # 配置:

        CACHES = {
            'default': {
                'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
                'LOCATION': '/var/tmp/django_cache',
            }
        }
    # 注:其他配置同开发调试版本

【4】数据库

# 此缓存将内容保存至数据库

    # 配置:
        CACHES = {
            'default': {
                'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
                'LOCATION': 'my_cache_table', # 数据库表
            }
        }

    # 注:执行创建表命令 python manage.py createcachetable

【5】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',
            ]
        }
    }

【6】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',
            ]
        }
    }

【7】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": "密码",
        }
    }
}
  • 视图层
from django_redis import get_redis_connection
conn = get_redis_connection("default")

【三】应用

【1】全站使用(利用Django中间件)

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

    CACHE_MIDDLEWARE_ALIAS = ""
    CACHE_MIDDLEWARE_SECONDS = ""
    CACHE_MIDDLEWARE_KEY_PREFIX = ""

【2】单独视图缓存

(1)方式一:

from django.views.decorators.cache import cache_page

@cache_page(60 * 15)
def my_view(request):
    ...

(2)方式二:

from django.views.decorators.cache import cache_page

urlpatterns = [
    url(r'^foo/([0-9]{1,2})/$', cache_page(60 * 15)(my_view)),
]

局部视图(html页面)使用

(1)引入TemplateTag

{% load cache %}

(2)使用缓存

{% cache 5000 缓存key %}
    缓存内容
{% endcache %}

【四】信号

  • 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指上述导入的模块名
from django.core.signals import request_finished
from django.dispatch import receiver

@receiver(request_finished)
def my_callback(sender, **kwargs):
    print("Request finished!")

【六】自定义信号

标签:内置,cache,django,signals,缓存,key,import,Django
From: https://www.cnblogs.com/dream-ze/p/17559518.html

相关文章

  • Elasticseach 的查询缓存
    关于 Elasticsearch 的查询缓存,你想知道的都在这里原文地址Elasticsearch中有多种查询缓存,当一个查询请求执行后,他可能会被缓存下来,但是哪些查询会被缓存,哪些不会缓存,缓存了什么内容,什么时候失效,手册中并没有很系统的阐述,并且文档中也存在一些疑点,导致整个查询缓存体系容易让......
  • IOS开发-实现图片缓存优化性能
    在Objective-C中,可以这么实现图片的本地缓存:1.创建一个用于存储图片的缓存文件夹;2.根据图片URL构建缓存文件名;3.检查缓存路径是否存在,如果存在直接读取缓存图片;4.不存在则从网络下载图片;5.保存图片到缓存,以名称cacheFilename;6.以后再加载同一个URL的图片,就直接从......
  • Redis多级缓存
    什么是多级缓存传统缓存的问题传统的缓存在请求到达Tomcat后,先查询Redis,如果未命中则查询数据库,存在以下问题:请求要经过Tomcat处理,Tomcat的性能成为整个系统的瓶颈Redis缓存失效时,会对数据库产生冲击多级缓存就是充分利用请求处理的每个环节,分别添加缓存,减轻Tomcat压力,提......
  • 分布式缓存
    单点redis的问题数据丢失问题:Redis是内存存储,服务重启可能会丢失数据。解决:数据持久化并发能力问题:单节点并发能力不足。解决:主从集群,读写分离。故障恢复:需要自动的故障恢复手段。解决:Redis哨兵,实现健康检测和自动恢复。存储能力问题:单节点Redis难以满足海量数据存储。解决:搭......
  • 对安装Linux的服务器进行缓存清除
    对安装Linux的服务器进行缓存清除原创 二河小鱼 人文历史与科学技术 2023-07-1118:10 发表于江西收录于合集#服务器99个#Linux运维101个#清除缓存1个安装Linux的服务器缓存过高导致服务器运行速度慢第一步,查看当前服务器中Linux系统的状态。命令:free-h编......
  • 缓存
    缓存缓存,是一种减少I/O读写和CPU计算,以提升性能的手段。缓存的使用主要用在需要频繁读某些不变动,或者变动较少的数据的场景。一般使用场景是:应用中使用缓存,需要读数据时,先去缓存中查询。缓存中没有的话,再查数据库,查到数据后返回结果,并将结果写到缓存中。缓存分类本地缓存......
  • 数据库(SQL注入问题、视图、触发器、事务、存储过程、内置函数、流程控制、索引)
    SQL注入问题SQL注入的原因:由于特殊符号的组合会产生特殊的效果 实际生活中,尤其是在注册用户名的时候会非常明显的提示你很多特殊符号不能用,会产生特殊的效果。结论:涉及到敏感数据部分,不要自己拼接,交给现成的方法拼接即可。importpymysql#链接MySQL服务端conn=pymysql.......
  • PS 2023 Beta AI 爱国版完美解锁,内置AI绘画功能
    photoshopbetaai的推出,掀起了一波AI热潮,最新Adobe推出的photoshopbetaai,我们仅需动用一下手指就能完成以前完不成的事情,使用起来非常简单方便。PS2023BetaAI爱国版完美解锁,内置AI绘画功能,小编为大家带来了PS2023BetaAI爱国版资源,需要的朋友不要错过。PS2023Beta......
  • 实现concurrentHashMap与redis两级缓存
    一、实现concurrentHashMap与redis两级缓存以下是一种使用ConcurrentHashMap和Redis实现两级缓存的示例代码:importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.cache.annotation.CacheEvict;importorg.springframework.cache.ann......
  • Django框架学习
    Django框架开发项目的创建1、在终端创建项目打开终端进入某个目录(项目位置)"C:\ProgramFiles\Python37\Scripts\django-admin.exe"startproject项目名称2、在pycharm创建项目3、默认项目的文件介绍app终端创建apppythonmanage.pystartappapp01默认......