Django框架配置多种不同的缓存 各种缓存之间的应用

鳄鱼君

发表文章数:642

Vieu四代商业主题

高扩展、安全、稳定、响应式布局多功能模板。

¥69 现在购买
首页 » Python » Django框架配置多种不同的缓存 各种缓存之间的应用

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

Django中缓存方式有:开发测试(实际内部不做任何操作)、内存、文件、数据库、Memcache缓存(python-memcached模块)、Memcache缓存(pylibmc模块)。连接memcache的时候可以使用python-memcached模块和pylibmc模块

开发调试

KEY_PREFIX和KEY_FUNCTION配置的是缓存key的前缀,如果想要修改缓存的显示的名称可以自定义default_key_func函数:

# 此为开始调试用,实际内部不做任何操作
# 配置:
    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):
    """
   生成密钥的默认函数。
   构造所有其他方法使用的密钥。默认情况下,它会预先结束
   “key_前缀”。KEY_函数可用于指定备用
   具有自定义密钥生成行为的函数。
    """
    return '%s:%s:%s' % (key_prefix, version, key)

def get_key_func(key_func):
    """
    函数来决定要使用哪个键函数。

    默认为“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

内存

需要要设置LOCATION且是唯一的,本质上它会生成一个全局变量unique-snowflake,里面是一个字典,用来存放缓存,全局变量不能够重复:

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

# 注:其他配置同开发调试版本

文件

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

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

数据库

数据库缓存,需要设置数据库表名LOCATION,然后需要执行命令:python manage.py createcachetable

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

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

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

Memcache缓存

1.(python-memcached模块)

# 此缓存使用python-memcached模块连接memcache

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '127.0.0.1:11211',  #memcache的ip和端口
    }
}

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',10),  #memcache集群 根据权重
            ('172.19.26.242:11211',11),
        ]
    }
}

2.(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',
        ]
    }
}

这里以文件缓存为例做一个演示,首先配置文件缓存,将文件缓存代码放到settings.py文件中去:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
        'LOCATION':  os.path.join(BASE_DIR,'cache')
    }
}

配置一个cache规则:http://127.0.0.1:8000/cache/来做缓存演示,在视图views.py中添加一个cache函数:

def cache(request):
    import time
    ctime=time.time()  #当前时间
    return render(request,'cache.html',{'ctime':ctime})

新建一个cache.html用做展示当前访问的时间,运行django程序,每次访问就会刷新时间,现在我们的缓存是没有使用上的。django为我们提供了三个级别的缓存,可以对views.pys视图中的cache函数做缓存:

from django.views.decorators.cache import cache_page  #导入
@cache_page(10)  #10s中失效
def cache(request):
    import time
    ctime=time.time()  #当前时间
    return render(request,'cache.html',{'ctime':ctime})

那么再次访问cache路径,就会发现时间一直没有变化,那么10s之后就会刷新缓存。这是对整个页面进行缓存。现在我只想对单个不变的内容进行缓存:

{% load cache %}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>{{ ctime }}</h1>
<h1>{{ ctime }}</h1>
{#使用局部缓存#} 
{% cache 10 c1 %}   {# 缓存10s #}
<h1>{{ ctime }}</h1>  {# 缓存内容 #}
{% endcache %}
</body>
</html>

这样再次访问cache页面就会发现最后一个被缓存了10s,其它的一致都在刷新。django还支持全站缓存,每一个URL,每一个请求都缓存。适合做博客网站,没有点赞,没有评论,没有动态内容的网站。那么按照视图缓存的方法,我们可以对每一个函数装上@cache_page()装饰器,但是非常的麻烦。

所有的请求都会先经过中间件,那么就需要对中间件做些处理。

from django.middleware.csrf import CsrfViewMiddleware
from django.middleware.cache import FetchFromCacheMiddleware
from django.middleware.cache import UpdateCacheMiddleware
MIDDLEWARE = [
    'django.middleware.cache.UpdateCacheMiddleware', #process_response
    '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', 
    'middle.m1.Mple1',
    'middle.m1.Mple2',
    'middle.m1.Mple3',
    'django.middleware.cache.FetchFromCacheMiddleware', #process_request
]

你可以参考代码,进入源代码查看一下具体的方法。请求过来会先通过UpdateCacheMiddleware中间件,它没有process_request会直接跳过,到FetchFromCacheMiddleware会执行缓存,核对是否存在缓存,如果没有往下走,到视图函数,再到process_response方法,FetchFromCacheMiddleware不存在process_response方法,所以会一直到UpdateCacheMiddleware,然后response。第二次按照同样的路径,如果存在缓存就不会经过视图函数,直接response。更多详细内容参考:Django框架配置全站缓存、单独视图缓存、局部视图缓存

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")

未经允许不得转载:作者:鳄鱼君, 转载或复制请以 超链接形式 并注明出处 鳄鱼君
原文地址:《Django框架配置多种不同的缓存 各种缓存之间的应用》 发布于2020-04-26

分享到:
赞(0) 赏杯咖啡

评论 抢沙发

2 + 6 =


文章对你有帮助可赏作者一杯咖啡

支付宝扫一扫打赏

微信扫一扫打赏

Vieu4.6主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。
切换注册

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录
切换登录

注册