zoukankan      html  css  js  c++  java
  • Django16-cache缓存

    一、介绍

    当用户访问某个url时,系统会尝试从缓存中查找内容,如果缓存中存在页面内容,则直接返回缓存中的页面,如果缓存中不存在,就需要通过后台代码逻辑如数据库查询等,将生成的网页内容保存到缓存中以备下一次使用,同时将网页内容返回给用户。

    Django提供多种缓存类型:Memcached缓存,数据库缓存,文件系统缓存,局部内存缓存和自定义缓存等。

    'django.core.cache.backends.locmem.LocMemCache'
    'django.core.cache.backends.memcached.MemcachedCache'
    'django.core.cache.backends.db.DatabaseCache'
    'django.core.cache.backends.filebased.FileBasedCache'
    'django.core.cache.backends.dummy.DummyCache'
    'django.core.cache.backends.memcached.PyLibMCCache'

    官方资料

    https://docs.djangoproject.com/en/3.1/topics/cache/

    二、settings配置

    1、Memcached

    Memcached是Django支持的最快、最高效的缓存类型,它是一种完全基于内存的缓存服务器,以减少数据库的访问并显著提高网站的性能。

    Memcached作为一个守护进程运行,并分配了一定数量的RAM。它提供一个快速的接口用于在缓存中添加、检索和删除数据。所有数据都直接存储在内存中,因此比数据库或文件系统存储等基于硬盘的缓存方式更快。

    使用该缓存类型要先安装Memcached程序,并安装Python与Memcached之间的接口库,如python-memcached和pylibmc等。
    安装以后启动Memcached,在django中用python-memcached连接。

    Memcached有一个非常好的特点就是可以让几个服务的缓存共享。这就意味着你可以在多台机器上运行Memcached服务,这些程序将会把这几个机器当做  同一个缓存,从而不需要复制每个缓存的值在每个机器上。为了使用这个特性,把所有的服务地址放在LOCATION里面,用分号隔开或者当做一个list。

    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
            'LOCATION': ['10.0.0.1:11211','10.0.0.2:11211'],
        }
    }

    2、数据库缓存

    使用数据库作为缓存,会将缓存的数据保存在指定的表中,LOCATION为表名:

    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
            'LOCATION': 'my_cache_table',
        }
    }
    然后在数据库中创建该表:
    python manage.py createcachetable

    3、其他几种缓存方式可以查看官方文档

    三、Django也支持redis缓存

    https://github.com/jazzband/django-redis

    1、安装redis

    pip install django-redis

    2、配置settings文件

    CACHES = {
        "default": {
            "BACKEND": "django_redis.cache.RedisCache",
            "LOCATION": "redis://127.0.0.1:6379/1",
            "OPTIONS": {
                "CLIENT_CLASS": "django_redis.client.DefaultClient",
            }
        }
    }

    如果redis需要用户名密码认证的话,有两种写法

    第一种
    CACHES = {
        "default": {
            "BACKEND": "django_redis.cache.RedisCache",
            "LOCATION": "redis://username:password@127.0.0.1:6379/1",
            "OPTIONS": {
                "CLIENT_CLASS": "django_redis.client.DefaultClient",
            }
        }
    }
    
    第二种
    CACHES = {
        "default": {
            "BACKEND": "django_redis.cache.RedisCache",
            "LOCATION": "redis://username@127.0.0.1:6379/1",
            "OPTIONS": {
                "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "PASSWORD": "password" 
            }
        }
    }

    四、views配置

    方式一:使用cache_page装饰器实现缓存,必须传入一个timeout的位置参数

    from django.views.decorators.cache import cache_page
    
    @cache_page(60)
    def user_list(request):
        users = models.User.objects.all()
        time.sleep(5) #模拟响应过程
        return render(request, 'user_list.html', {'users': users})

    方式二:手动配置缓存信息

    from django.core.cache import cache
    
    def user_list(request):
        result = cache.get('devops_cache')
        if result:
            return HttpResponse(result)
    
        users = models.User.objects.all()
        time.sleep(5)
        res = render(request, 'user_list.html', {'users': users})
        cache.set('devops_cache', res, timeout=60)
        return res

    cache的一个关键点在于key的选择:

      如果设置一个cache名称作为key,那么所有人将使用同一套缓存

      如果将用户源ip作为key,那么每个源ip将使用一套缓存

      如果将用户session作为key,那么每个用户将使用一套缓存

    settings中的CACHES可以配置多个cache,只需要指定不同的cache名称即可。

    CACHES = {
        'default': {
            'BACKEND': 'django.core.backends.db.DatabaseCache',
            'LOCATION': 'my_cache_tabel',
            'TIMEOUT': 60 * 5,
            },
        'default': {
            'BACKEND': 'redis_lock.django_cache.RedisCache',
            'LOCATION': 'redis://:%(password)s@%(host)s:%(port)s/%(db)s' % {
                'password': CONFIG.REDIS_PASSWORD,
                'host': CONFIG.REDIS_HOST,
                'port': CONFIG.REDIS_PORT,
                'db': CONFIG.REDIS_DB_CACHE,
            }
        }
    }

    在数据存入和读取缓存时指定缓存名称

    如果使用内置装饰器,在views中装饰器中指定cache_name即可。

    from django.views.decorators.cache import cache_page
    
    @cache_page(60,'redis_cache')
    def user_list(request):
        users = models.User.objects.all()
        time.sleep(5) #模拟响应过程
        return render(request, 'user_list.html', {'users': users})

    如果使用手动配置缓存的方式,配置如下

    from django.core.cache import caches
    
    def user_list(request):
        cache = caches['redis_cache']
        result = cache.get('devops_cache')
        if result:
            return HttpResponse(result)
    
        users = models.User.objects.all()
        time.sleep(5)
        res = render(request, 'user_list.html', {'users': users})
        cache.set('devops_cache', res, timeout=60)
        return res
  • 相关阅读:
    使用gulp搭建一个传统的多页面前端项目的开发环境
    抓包工具使用
    selectors 模块
    I/O模型
    协程
    进程池
    进程的同步
    进程间通讯的三种方式
    多进程调用
    生产者消费者模型
  • 原文地址:https://www.cnblogs.com/dxnui119/p/14042280.html
Copyright © 2011-2022 走看看