缓存框架的核心目标
- 较少的代码
- 缓存应该尽可能快
- 因此围绕缓存后端的所有框架代码应该保持在绝对最小值,特别是对于获取操作
- 一致性
- 缓存API应该是提供跨越不同缓存后端的一致接口
- 可扩展性
- 基于开发人员的需求,缓存API应该可以在应用程序级别扩展
缓存(Cache)
- django内置了缓存框架,并提供了几种常用的缓存
- 基于Memcached缓存
- 使用数据库进行缓存
- 使用文件系统进行缓存
- 使用本地内存进行缓存
- 提供缓存扩展接口
使用数据库进行缓存
- 缓存配置
在settings.py
文件中加入如下配置
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.db.DatabaseCache', # 使用的缓存类型
'LOCATION': 'cache_table',
'TIMEOUT': '60', # 缓存超时时间(一般不配置,在设置的时候写入)
'OPTIONS': {
'MAX_ENTRIES': '300',
},
'KEY_PREFIX': 'WQ', # 前缀
'VERSION': '1',
}
}
- 创建缓存表
python manage.py createcachetable [table_name]
使用缓存
- 在视图中使用(使用最多的场景)
- @cache_page()
- time 秒 60*5 缓存五分钟
- cache 缓存配置, 默认default,
- key_prefix 前置字符串
缓存底层
获取cache
from django.core.cache import cache
cache = cache['cache_name'] 或 cache = cache.get('cache_name')
设置cache
from django.core.cache import cache
cache.set(key, value, timeout)
-
缓存操作
-
cache.set
-
key
-
value
-
timeout
-
-
get
-
add
-
get_or _set
-
get_many
-
set_many
-
delete
-
delete_many
-
clear
-
incr 增加
- incr(key, value) key对应的值上添加 value
-
decr 减少
-
decr(key, value) key对应的值上减少value
-
如果value不写,默认变更为1
-
-
使用原生缓存来实现
def index3(request):
# 从缓存中获取key=cache_data的内容
data = cache.get('cache_data')
# 如果有缓存,则直接返回
if data:
return HttpResponse(data)
# 如果没有缓存
else:
blogs = Blog.objects.all()
time.sleep(5)
# 获取模板
template = loader.get_template("index3.html")
result = template.render({"blogs": blogs})
print(result, type(result))
# 设置缓存 缓存时间20秒
cache.set("cache_data", result, 20)
return HttpResponse(result)
使用Redis缓存
需要安装django-redis
pip install django-redis
只需要在settings中更改CACHES的配置文件
CACHES = {
'default': {
'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': 'redis://127.0.0.1:6379/4', # 缓存表
'OPTIONS': {
'CLIENT_CLASS': 'django_redis.client.DefaultClient',
},
'KEY_PREFIX': 'QF', # 前缀
}
}
用法和内置缓存使用一样