缓存系统 | Django自带 | Django开发

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了缓存系统 | Django自带 | Django开发相关的知识,希望对你有一定的参考价值。

-- 缓存
    # 减少重复消耗计算资源;
    # Django自带一个健壮的缓存系统来保存动态页面;
    1.设置缓存
        -- 设置数据缓存地址:1.数据库;2.文件系统;
        -- settings.py中的CACHES配置:
            # 参数TIMEOUT:缓存过期时间;
            # 默认300秒;
            # 下面是对存到本地的配置:
            # None表示永久,0表示立即失效;
            # CACHES={
            #     ‘default‘: {
            #         ‘BACKEND‘: ‘django.core.cache.backends.locmem.LocMemCache‘,
            #         ‘TIMEOUT‘: 60,
            #     }
            # }
        -- 将缓存保存到redis中
            # 默认使用其中的数据库1;
            # 安装包:pip install django-redis-cache
            # CACHES = {
            #     "default": {
            #         "BACKEND": "redis_cache.cache.RedisCache",
            #         "LOCATION": "localhost:6379",
            #         ‘TIMEOUT‘: 60,
            #     },
            # }
        -- 连接redis查看存的数据
            # 连接:redis-cli
            # 切换数据库:select 1
            # 查看键:keys *
            # 查看值:get 键
    2.单个view缓存
        2.1 缓存一个视图函数
            -- 导入一个模块
                from django.views.decorators.cache import cache_page
            -- 在视图函数上加上一个装饰器
                @cache_page(60 * 15)
                # 装饰器中传入的timeout参数指的是时间;
                def index(request):
                    return HttpResponse(hello1)
                # 附:视图缓存与URL无关,如果多个URL指向同一视图,每个URL将会分别缓存

    3.模板片段缓存
        -- 使用cache模板标签来缓存模板的一个片段
        -- 需要两个参数:
            # 缓存时间,以秒为单位
            # 给缓存片段起的名称
            # {% load cache %}
            # {% cache 500 hello %}
            # hello1
            # <!--hello2-->
            # {% endcache %}
    4.底层的缓存API
        from django.core.cache import cache

        # 设置:cache.set(键,值,有效时间)
        # 获取:cache.get(键)
        # 删除:cache.delete(键)
        # 清空:cache.clear()

 ------------------------------------------------------------------>>>>>>>>>>  其他缓存引擎配置

1.DummyCache

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

# 利用数据库来缓存,利用命令创建相应的表:python manage.py createcachetable cache_table_name

CACHES = {
    default: {
        BACKEND: django.core.cache.backends.db.DatabaseCache,
        LOCATION: cache_table_name,
        TIMEOUT: 600,
        OPTIONS: {
            MAX_ENTRIES: 2000
        }
    }
}

3.FileBasedCache

# 利用文件系统来缓存:
CACHES = {
    default: {
        BACKEND: django.core.cache.backends.filebased.FileBasedCache,
        LOCATION: /var/tmp/django_cache,
        TIMEOUT: 600,
        OPTIONS: {
            MAX_ENTRIES: 1000
        }
    }
}

4.MemcachedCache

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

5.PyLibMCCache

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

==========================================》》》》》》使用

1.全站使用

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

    MIDDLEWARE = [
        django.middleware.cache.UpdateCacheMiddleware,
        # 其他中间件...
        django.middleware.cache.FetchFromCacheMiddleware,
    ]

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

2.单独视图缓存

方式一:
        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)),
        ]

3.模板局部视图使用

1. 引入TemplateTag

        {% load cache %}

   2. 使用缓存

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

4.实例演示

# 一般来说我们用 Django 来搭建一个网站,要用到数据库等。

from django.shortcuts import render
def index(request):
    # 读取数据库等 并渲染到网页
    # 数据库获取的结果保存到 queryset 中
    return render(request, index.html, {queryset:queryset})
# 像这样每次访问都要读取数据库,一般的小网站没什么问题,当访问量非常大的时候,就会有很多次的数据库查询,肯定会造成访问速度变慢,服务器资源占用较多等问题。

#------------------------------------------
#------------------------------------------

from django.shortcuts import render
from django.views.decorators.cache import cache_page
 
@cache_page(60 * 15) # 秒数,这里指缓存 15 分钟,不直接写900是为了提高可读性
def index(request):
    # 读取数据库等 并渲染到网页
    return render(request, index.html, {queryset:queryset})
# 当使用了cache后,访问情况变成了如下:


# 访问一个网址时, 尝试从 cache 中找有没有缓存内容
# 如果网页在缓存中显示缓存内容,否则生成访问的页面,保存在缓存中以便下次使用,显示缓存的页面。
# given a URL, try finding that page in the cache
# if the page is in the cache:
#     return the cached page
# else:
#     generate the page
#     save the generated page in the cache (for next time)
#     return the generated page
# Memcached 是目前 Django 可用的最快的缓存

 

以上是关于缓存系统 | Django自带 | Django开发的主要内容,如果未能解决你的问题,请参考以下文章

Django中的缓存机制

django自带cache结合redis创建永久缓存

初识Django

十django自带用户系统

Django 框架篇: django自带的认证系统

Django自带的后台管理系统