Django 缓存

官方文档

配置缓存后端为 Redis

Django 缓存_第1张图片

设置 Django 的缓存为 Redis

1. 安装

pip install django-redis Hiredis

hiredis 是一个用 C 写的 Redis 客户端, 并且他的解析器可以用在 django-redis 中:

2. 在 settings.py 中设置,如下:

Redis 参考资料 http://django-redis-chs.readthedocs.io/zh_CN/latest/
CACHES = {
     
    "default": {
     
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://172.16.153.130:6379/1",
        "OPTIONS": {
     
            "CONNECTION_POOL_KWARGS": {
     "max_connections": 100},  # 设置默认的连接池,最大连接数 100
            "PARSER_CLASS": "redis.connection.HiredisParser",  # pip install Hiredis
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "PASSWORD": "",  # 连接密码
        }
    }
}

3. 使用:

from django.core.cache import cache

设置键值对

cache.set("foo", "value", timeout=10)  # 设置一个键为 foo, 值为 value, 超时时间为 10 秒

获取键值对

cache.get('foo')

获取 TTL 值(超时时间)

cache.ttl('foo')

缓存 session

在这里插入图片描述

SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"

缓存视图

缓存整个视图

from django.views.decorators.cache import cache_page

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

60 * 15 就是 60 秒 乘以 15,共 900秒

缓存视图中的某个请求方法的内容

在这里插入图片描述
在这里插入图片描述

Django 缓存_第2张图片
pyinxiangcom/25594833/ENResource/p763)]

缓存模板片段

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qlCZwrID-1611458414968)(evernotecid://BBD579E0-7127-4377-8E81-47BEA574FA91/appyinxiangcom/25594833/ENResource/p765)]

使用缓存 API

django.core.cache.cache

作为快捷方式,默认缓存可以通过 django.core.cache.cache 引用:

>>> from django.core.cache import cache

基本用法¶
基本接口是:

cache.set(key, value, timeout=DEFAULT_TIMEOUT, version=None)¶

cache.set(‘my_key’, ‘hello, world!’, 30)
cache.get(key, default=None, version=None)¶

cache.get(‘my_key’)
‘hello, world!’
key 是一个字符串,value 可以任何 picklable 形式的 Python 对象。

timeout 参数是可选的,默认为 CACHES 中相应后端的 timeout 参数。它是值存在缓存里的秒数。timeout 设置为 None 时将永久缓存。timeout 为0将不缓存值。

如果对象不在缓存中,cache.get() 将返回 None。

Wait 30 seconds for ‘my_key’ to expire…

cache.get(‘my_key’)
None
我们建议不要在缓存中存储为 None 的值,因为你不能分辨你存储的 None 值还是因为缓存命中返回的 None 值。

cache.get() 可以带一个默认参数。如果对象不在缓存中,将返回指定的值。

cache.get(‘my_key’, ‘has expired’)
‘has expired’
cache.add(key, value, timeout=DEFAULT_TIMEOUT, version=None)¶
在键不存在的时候,使用 add() 方法可以添加键。它与 set() 带有相同的参数,但如果指定的键已经存在,将不会尝试更新缓存。

cache.set(‘add_key’, ‘Initial value’)
cache.add(‘add_key’, ‘New value’)
cache.get(‘add_key’)
‘Initial value’
如果你想知道通过 add() 存储的值是否在缓存中,你可以检查返回值。如果值已保存,将返回 True ,否则返回 False 。

cache.get_or_set(key, default, timeout=DEFAULT_TIMEOUT, version=None)¶
如果你想得到键值或者如果键不在缓存中时设置一个值,可以使用 get_or_set() 方法。它带有和 get() 一样的参数,但默认是为那个键设置一个新缓存值,而不是简单返回:

cache.get(‘my_new_key’) # returns None
cache.get_or_set(‘my_new_key’, ‘my new value’, 100)
‘my new value’
你也可以传递任何可调用的值作为默认值:

import datetime
cache.get_or_set(‘some-timestamp-key’, datetime.datetime.now)
datetime.datetime(2014, 12, 11, 0, 15, 49, 457920)
cache.get_many(keys, version=None)¶
这里也有 get_many() 接口,返回一个字典,其中包含你请求的键,这些键真实存在缓存中(并且没过期):

cache.set(‘a’, 1)
cache.set(‘b’, 2)
cache.set(‘c’, 3)
cache.get_many([‘a’, ‘b’, ‘c’])
{‘a’: 1, ‘b’: 2, ‘c’: 3}
cache.set_many(dict, timeout)¶
使用 set_many() 传递键值对的字典,可以更有效的设置多个值。

cache.set_many({‘a’: 1, ‘b’: 2, ‘c’: 3})
cache.get_many([‘a’, ‘b’, ‘c’])
{‘a’: 1, ‘b’: 2, ‘c’: 3}
类似 cache.set(),set_many() 带有一个可选的 timeout 参数。

在已支持的后端(memcached),set_many() 会返回无法插入的键列表。

cache.delete(key, version=None)¶
你可以使用 delete() 显示地删除键。这是清除特定对象缓存的简便方法:


>>> cache.delete('a')
cache.delete_many(keys, version=None)¶
如果你想一次性清除很多键,给 delete_many() 传递一个键列表即可删除。

>>> cache.delete_many(['a', 'b', 'c'])
cache.clear()¶
最后,如果你想删除缓存里的所有键,使用 cache.clear()。注意,clear() 将删除缓存里的 任何 键,不只是你应用里设置的那些键。

>>> cache.clear()
cache.touch(key, timeout=DEFAULT_TIMEOUT, version=None)¶
New in Django 2.1:
cache.touch() 为键设置一个新的过期时间。比如,更新一个键为从现在起10秒钟后过期:

>>> cache.touch('a', 10)
True
和其他方法一样,timeout 参数是可选的,并且默认是 CACHES 设置的相应后端的 TIMEOUT 选项。

如果键被成功 touch(),将返回 True,否则返回 False。

cache.incr(key, delta=1, version=None)¶
cache.decr(key, delta=1, version=None)¶
你也可以使用分别使用 incr() 或 decr() 方法来递增或递减一个已经存在的键的值。默认情况下,存在的缓存值将递增或递减1。通过为递增/递减的调用提供参数来指定其他递增/递减值。如果你试图递增或递减一个不存在的缓存键,将会引发 ValueError 错误。

>>> cache.set('num', 1)
>>> cache.incr('num')
2
>>> cache.incr('num', 10)
12
>>> cache.decr('num')
11
>>> cache.decr('num', 5)
6
注解

你可能感兴趣的:(Django)