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
原文地址:https://www.cnblogs.com/dxnui119/p/14042280.html