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值.

posted @ 2022-10-13 10:43  SwordITC  阅读(51)  评论(0编辑  收藏  举报