Django3.2缓存系统
缓存方案概述
🪧 快设备缓存(推荐): 此处的快设备指缓存数据库,Django支持基于Redis的缓存和基于Memcached的缓存.
🪧 慢设备缓存(别用): 此处的慢设备指的是数据库,虽然Django提供了基于default数据库的缓存,但能不用则不用.
🪧 其他的缓存(禁用): Django还支持基于文件系统的缓存和基于本地内存的缓存,开发环境可以玩玩,生产环境别用.
[了解] 除了以上内置方案外,Django还支持自定义缓存后端,自定义的方式通常用于配制Django原生不支持的其他缓存数据库.
配置缓存系统
0.配置Redis缓存
🪧 安装Redis组件: Django4.0才原生支持Redis,Django3.2中需要通过第三方组件库进行配置.
pip install django-redis # 安装Redis缓存后端 (基于并自动安装redis-py驱动)
🪧 编写Redis配置: 在Django项目配置文件的CACHES配置字典中进行缓存系统、客户端连接参数或连接池连接参数.
# Caches
# See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/
CACHES = {
'default': {
'VERSION': 1, # 默认缓存版本
'KEY_PREFIX': '', # 默认缓存前缀,推荐用项目名
'TIMEOUT': 60 * 5, # 默认过期时间,300秒
'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': ['redis://username@127.0.0.1:6379/1', ], # 服务器列表,第一个为主服务器,其余为副本服务器
'OPTIONS': {
'CLIENT_CLASS': 'django_redis.client.DefaultClient',
'PASSWORD': '',
'SOCKET_CONNECT_TIMEOUT': 5, # 秒级连接超时时间
'SOCKET_TIMEOUT': 5, # 秒级读写超时时间
'IGNORE_EXCEPTIONS': True, # 是否忽略连接异常
'CONNECTION_POOL_KWARGS': { # redis.ConnectionPool的参数
'max_connections': 100, # 连接池最大数量
}
}
}
}
DJANGO_REDIS_LOGGER = 'logger_name' # 使用哪个日志记录器记录忽略的异常
DJANGO_REDIS_IGNORE_EXCEPTIONS = True # 是否忽略所有缓存的连接异常
DJANGO_REDIS_LOG_IGNORED_EXCEPTIONS = True # 是否在忽略异常时通过日志记录该异常
3.缓存系统
配置Redis缓存后端:Django4.0才原生支持,但Django3.2中也可使用.
[连接格式] Redis连接字符串支持TCP普通套接字、TCP安全套接字和Unix套接字3种连接格式.
[身份认证] 启用Redis的ACL时,须在LOCATION选项的URL中指定用户名,并通过OPTIONS选项字典中的PASSWORD选项指定密码.
[高级功能] 客户端类型支持多种,用于在不同需求下使用,即Sentinel客户端(哨兵)、Shard客户端(分片)、Herd客户端.
配置Memcached缓存后端:Django原生支持的最快、最高效的内置缓存类型.
pip install django-pymemcache # 安装Memcached缓存后端 (基于并自动安装pymemcache驱动)
# Caches
# See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/
CACHES = {
'default': {
'VERSION': 1, # 默认缓存版本
'KEY_PREFIX': '', # 默认缓存前缀,推荐用项目名
'TIMEOUT': 60 * 5, # 默认过期时间,300秒
'BACKEND': 'django.core.cache.backends.memcached.PyMemcacheCache',
'LOCATION': ['139.180.198.26:11211', ], # 服务器列表
'OPTIONS': { # 传递给pymemcache.PooledClient的参数
'no_delay': True, # 设置TCP_NODELAY标识,用于提升性能
'use_pooling': True, # 是否启用连接池
'ignore_exc': True, # 是否忽略连接异常
'max_pool_size': 4, # 连接池最大数量
'connect_timeout': 5, # 秒级连接超时时间,默认永不超时
'timeout': 5, # 秒级读写超时时间,默认永不超时
}
}
}
[连接格式] LOCATION选项除了TCP套接字格式的连接字符串外,还支持Unix套接字格式的连接字符串)
[使用说明] Django缓存系统除了提供站点缓存、模版片段缓存、视图缓存、下游缓存、缓存中间件外,还提供了一套用于操作缓存的底层API (如下)
建立连接:通过Django提供的接口可以获取对应缓存后端的客户端对象
from django.core.cache import cache # 默认缓存后端的客户端对象,同线程内共工同一个cache对象
from django.core.cache import caches # 所有缓存后端的客户端对象字典,caches["default"]同cache
cache.close() # (了解) 对于实现了该方法的缓存后端,可以使用该方法关闭连接
操作缓存:对客户端对象对应的缓存后端中的缓存值进行增删改查操作.
"""[C] 新增操作 ☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎"""
# 新增指定值 (无则新增返回True;有则跳过返回False)
cache.add(key: str, value, timeout=DEFAULT_TIMEOUT, version=None) -> bool
# 新增指定值 (无则新增,有则覆盖)
cache.set(key: str, value, timeout=DEFAULT_TIMEOUT, version=None) -> None
# 新增多个值 (无则新增,有则覆盖)
cache.set_many(dict, timeout=DEFAULT_TIMEOUT, version=None) -> list
"""[U] 更新操作 ☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎"""
cache.set(key: str, value, timeout=DEFAULT_TIMEOUT, version=None) -> None # 更新指定key值及其过期时间
cache.set_many(dict, timeout=DEFAULT_TIMEOUT, version=None) -> list # 更新多个key值及其过期时间
cache.touch(key, timeout=DEFAULT_TIMEOUT, version=None) -> bool # 更新指定key值的过期时间
cache.incr(key, delta: int=1, version=None) -> int # 使key值自增delta,并返回自增后的key值
cache.decr(key, delta: int=1, version=None) -> int # 使key值自减delta,并返回自减后的key值
"""[R] 读取操作 ☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎"""
cache.get(key, default=None, version=None) # 获取指定key值 (key不存在返回default值)
cache.get_many(keys: Iterable[str], version=None) -> dict # 获取多个key值
"""[D] 删除操作 ☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎☁︎"""
cache.delete(key: str, version=None) -> bool # 删除指定key值
cache.delete_many(keys: Iterable[str], version=None) -> None # 删除多个key值
cache.clear() -> None # 晴空所有key值
[注意事项] 提交到缓存系统中的value值必须为pickable的.
[过期时间] timeout参数用于指定秒级过期时间,为0时立即过期,为None时永久缓存.
[版本控制] Django缓存时实际使用的key是经过处理的(缓存前缀:缓存版本:缓存键名
),因此在操作缓存时,通过version参数可以控制实际要操作的是缓存系统的那个版本的key值.