刘沙河 刘沙河
首页
  • Go语言基础

    • 数据类型
    • 反射
    • Go指针
  • Go语言进阶

    • go泛型
    • go条件编译
    • cgo教程
    • Go协程调度原理及GPM模型
    • Go内存管理
    • Go垃圾回收机制
    • Go语言内存对齐
  • Go语言实现原理

    • channel 实现原理
    • slice 实现原理
    • map 实现原理
    • sync.Mutex 实现原理
    • 乐观锁CAS 实现原理
    • singlefight 实现原理
  • gin框架

    • gin中间件原理
    • gin路由原理
  • gorm

    • GORM介绍和使用
    • GORM_CURD操作指南
  • go测试

    • benchmark基准测试
    • pprof 性能分析
  • python进阶

    • Numpy&Pandas
    • celery分布式任务队列
  • Django

    • Django 常见命令
    • middleware中间件
    • Django缓存系统
    • Django信号系统
    • Django REST Framework
  • Flask

    • Flask基础知识总结
    • Flask-SQLAlchemy
  • 爬虫

    • aiohttp
    • scrapy框架
  • Mysql

    • Mysql存储引擎和索引
    • MySQL主从复制
    • Mysql读写分离
    • 数据库分库分表
    • Mysql锁
    • Mysql事务和MVCC原理
    • 分库分表带来的读扩散问题
  • Redis

    • redis基础和数据类型
    • redis主从架构
    • redis哨兵架构
    • redis集群模式
    • 如何保证缓存和数据库双写一致
    • redis底层数据结构
    • redis分布式锁
  • Elasticsearch

    • es基本概念
    • es基础语法
    • es倒排索引
  • etcd

    • Go操作etcd
    • Raft原理
    • etcd分布式锁
  • kafka

    • 消息队列MQ总结
    • kafka 概述及原理
    • kafka 消费问题记录
    • 零拷贝技术
    • kafka分区规范
  • RabbitMQ

    • rabbitMQ基础
    • Go操作rabbitmq
  • RocketMQ

    • 可靠消息队列 rocketMQ
  • Http&Https

    • http&https
    • TCP和UDP
    • Ping 原理
  • RPC

    • RPC初识
    • grpc初识和实现
  • gRPC

    • grpc 初识
    • grpc 上下文 metadata
    • grpc 健康检查
    • grpc keepalive
    • grpc 命名解析
    • grpc 中间件&拦截器
    • grpc 负载均衡
    • grpc 身份认证
    • grpc 超时重试
    • grpc 链路追踪
    • grpc-gw将gRPC转RESTfu api
    • grpc-gw自定义选项
  • protobuf

    • protobuf 进阶
    • protobuf 编码原理
  • Docker

    • Docker基础
    • Docker常用命令
    • Dockerfile
    • Docker-Compose
    • Docker多阶段构建
    • Docker Config 教程
    • Docker Swarm 教程
    • Docker Stack 教程
    • Docker Buildx 教程
  • k8s

    • k8s 基础概念
    • k8s 集群架构
    • k8s 工作负载
    • Pod 网络
    • Service 网络
    • 外部接入网络
    • 一张图搞懂k8s各种pod
    • k8s 存储抽象
    • mac快速启动k8s
    • 自制申威架构k8s-reloader
  • go-kit

    • go-kit初识
    • go-kit启动http服务
    • go-kit集成gin启动服务
    • go-kit集成grpc和protobuf
    • go-kit中间件
    • go-kit服务注册发现与负载均衡
    • go-kit限流和熔断
    • go-kit链路追踪
    • go-kit集成Prometheus
  • 设计模式

    • 初识设计模式
    • 创建型模式
    • 结构型模式
    • 行为模式
  • 数据结构

    • 时间轮
    • 堆、双向链表、环形队列
    • 队列:优先队列
    • 队列:延迟队列
  • 算法

    • 递归算法
    • 枚举算法
    • 动态规划
    • 回溯算法
    • 分治算法
    • 贪心算法
    • LRU和LFU
    • 一致性哈希

花开半夏,半夏花开
首页
  • Go语言基础

    • 数据类型
    • 反射
    • Go指针
  • Go语言进阶

    • go泛型
    • go条件编译
    • cgo教程
    • Go协程调度原理及GPM模型
    • Go内存管理
    • Go垃圾回收机制
    • Go语言内存对齐
  • Go语言实现原理

    • channel 实现原理
    • slice 实现原理
    • map 实现原理
    • sync.Mutex 实现原理
    • 乐观锁CAS 实现原理
    • singlefight 实现原理
  • gin框架

    • gin中间件原理
    • gin路由原理
  • gorm

    • GORM介绍和使用
    • GORM_CURD操作指南
  • go测试

    • benchmark基准测试
    • pprof 性能分析
  • python进阶

    • Numpy&Pandas
    • celery分布式任务队列
  • Django

    • Django 常见命令
    • middleware中间件
    • Django缓存系统
    • Django信号系统
    • Django REST Framework
  • Flask

    • Flask基础知识总结
    • Flask-SQLAlchemy
  • 爬虫

    • aiohttp
    • scrapy框架
  • Mysql

    • Mysql存储引擎和索引
    • MySQL主从复制
    • Mysql读写分离
    • 数据库分库分表
    • Mysql锁
    • Mysql事务和MVCC原理
    • 分库分表带来的读扩散问题
  • Redis

    • redis基础和数据类型
    • redis主从架构
    • redis哨兵架构
    • redis集群模式
    • 如何保证缓存和数据库双写一致
    • redis底层数据结构
    • redis分布式锁
  • Elasticsearch

    • es基本概念
    • es基础语法
    • es倒排索引
  • etcd

    • Go操作etcd
    • Raft原理
    • etcd分布式锁
  • kafka

    • 消息队列MQ总结
    • kafka 概述及原理
    • kafka 消费问题记录
    • 零拷贝技术
    • kafka分区规范
  • RabbitMQ

    • rabbitMQ基础
    • Go操作rabbitmq
  • RocketMQ

    • 可靠消息队列 rocketMQ
  • Http&Https

    • http&https
    • TCP和UDP
    • Ping 原理
  • RPC

    • RPC初识
    • grpc初识和实现
  • gRPC

    • grpc 初识
    • grpc 上下文 metadata
    • grpc 健康检查
    • grpc keepalive
    • grpc 命名解析
    • grpc 中间件&拦截器
    • grpc 负载均衡
    • grpc 身份认证
    • grpc 超时重试
    • grpc 链路追踪
    • grpc-gw将gRPC转RESTfu api
    • grpc-gw自定义选项
  • protobuf

    • protobuf 进阶
    • protobuf 编码原理
  • Docker

    • Docker基础
    • Docker常用命令
    • Dockerfile
    • Docker-Compose
    • Docker多阶段构建
    • Docker Config 教程
    • Docker Swarm 教程
    • Docker Stack 教程
    • Docker Buildx 教程
  • k8s

    • k8s 基础概念
    • k8s 集群架构
    • k8s 工作负载
    • Pod 网络
    • Service 网络
    • 外部接入网络
    • 一张图搞懂k8s各种pod
    • k8s 存储抽象
    • mac快速启动k8s
    • 自制申威架构k8s-reloader
  • go-kit

    • go-kit初识
    • go-kit启动http服务
    • go-kit集成gin启动服务
    • go-kit集成grpc和protobuf
    • go-kit中间件
    • go-kit服务注册发现与负载均衡
    • go-kit限流和熔断
    • go-kit链路追踪
    • go-kit集成Prometheus
  • 设计模式

    • 初识设计模式
    • 创建型模式
    • 结构型模式
    • 行为模式
  • 数据结构

    • 时间轮
    • 堆、双向链表、环形队列
    • 队列:优先队列
    • 队列:延迟队列
  • 算法

    • 递归算法
    • 枚举算法
    • 动态规划
    • 回溯算法
    • 分治算法
    • 贪心算法
    • LRU和LFU
    • 一致性哈希
  • Python基础

  • Python进阶

  • Python并发编程

  • Django

    • django 常见命令
    • Django模板母版
    • Django视图
    • Django路由系统
    • Django--orm系统-指令&属性
    • Django--orm系统 -分组聚合
    • Django-cookie&session
    • middleware中间件
    • Django 的身份认证系统
    • Django models 之字段详解
    • Django缓存系统
      • Django 缓存设置方法
        • 参数说明
        • 1. Memcached
        • 2. 数据库缓存
        • 3. redis缓存
        • 4.文件系统缓存
        • 5.基于本地内存的缓存
      • 项目应用
        • 1.全部项目缓存
        • 2.单独视图缓存
      • Django缓存的实施方案
        • 方案1: cache_page 缓存
        • 方案2 cache.set 局部缓存
        • 方案3 cache.set + 装饰器
    • Django数据库系统
    • Django信号系统
    • Django序列化和反序列化
    • Django中admin用法
    • DRF 版本、认证、权限、限制、解析器和渲染器
    • DRF(Django REST Framework)框架
  • Flask

  • 爬虫

  • Python
  • Django
bigox
2021-07-04
目录

Django缓存系统

# Django 缓存系统

# Django 缓存设置方法

# django cache settings
CACHES = {
    'default': {
        # 'BACKEND': 'django.core.cache.backends.dummy.DummyCache', # 开发环境不缓存
        "BACKEND": "django_redis.cache.RedisCache",  # 使用django-redis的缓存
        "LOCATION": "redis://{}:6379/0".format(REDIS_HOST),  # redis数据库的位置
        'TIMEOUT': 3000,  # 缓存超时时间(默认300,None表示永不过期,0表示立即过期)
        'OPTIONS': {
            'MAX_ENTRIES': 300,  # 最大缓存个数(默认300)
            'CULL_FREQUENCY': 3,  # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
        },
        'KEY_PREFIX': 'sc_api_server_cache',  # 缓存key的前缀(默认空)
        'VERSION': 1,  # 缓存key的版本(默认1)
        # 'KEY_FUNCTION':                # 生成key的函数(默认函数会生成为:【前缀:版本:key】)
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 参数说明

  • BACKEND

    # 选项后端缓存选项,根据不同的内容进行选择性填写,对应指定路径
    
    'django.core.cache.backends.db.DatabaseCache' # 数据库缓存
    'django.core.cache.backends.dummy.DummyCache' # 开发调试缓存
    'django.core.cache.backends.filebased.FileBasedCache' # 文件缓存
    'django.core.cache.backends.locmem.LocMemCache' # 内存缓存
    'django.core.cache.backends.memcached.MemcachedCache' # Memcache缓存(python-memcached模块)
    'django.core.cache.backends.memcached.PyLibMCCache' # Memcache缓存(pylibmc模块)
    "django_redis.cache.RedisCache" # Redis缓存
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
  • KEY_FUNCTION

    # 一个字符串,其中包含一个函数的点路径,该函数定义了如何将前缀,版本和密钥组合成最终缓存密钥
    def make_key(key, key_prefix, version):
        return ':'.join([key_prefix, str(version), key])
    
    
    1
    2
    3
    4
  • KEY_PREFIX

    # 默认值:( ' ' 空字符串)
    # 一个字符串,它将自动包含(默认为前置)到Django服务器使用的所有缓存键中
    
    
    1
    2
    3
  • LOCATION

    # 默认值:( ' ' 空字符串)
    # 使用的缓存位置
    # 这可能是文件系统缓存的目录,内存缓存服务器的主机和端口,或者是本地内存缓存的标识名
    
    1
    2
    3
  • OPTIONS

    # 默认值: None
    # 额外的参数传递给缓存后端。可用参数因您的缓存后端而异
    
    
    1
    2
    3
  • TIMEOUT

    # 默认值: 300
    # 缓存条目被视为过时之前的秒数
    # 如果此设置的值为None,则缓存条目将不会过期
    
    1
    2
    3
  • VERSION

    # 默认值: 1
    # Django服务器生成的缓存键的默认版本号
    
    
    1
    2
    3
  • CACHE_MIDDLEWARE_ALIAS

    # 默认值: 'default'
    # 用于缓存中间件的缓存连接。
    
    
    1
    2
    3
  • CACHE_MIDDLEWARE_KEY_PREFIX

    # 默认值:( ' ' 空字符串)
    # 一个字符串,该字符串将作为由缓存中间件生成的缓存键的前缀
    # 该前缀与KEY_PREFIX设置结合在一起 ;它不会替代它
    
    
    1
    2
    3
    4
  • CACHE_MIDDLEWARE_SECONDS

    # 默认值:( ' ' 空字符串)
    # 缓存中间件页面的默认秒数
    
    
    1
    2
    3

# 1. Memcached

  • Memcached是Django原生支持的缓存系统,速度快,效率高。
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '127.0.0.1:11211',
    }
}

1
2
3
4
5
6
7

# 2. 数据库缓存

  • 我们使用缓存的很大原因就是要减少数据库的操作,如果将缓存又存到数据库,岂不是脱…


CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
        'LOCATION': 'my_cache_table',
    }
}
1
2
3
4
5
6
7
8

# 3. redis缓存

  • 推荐使用
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/1",
        "OPTIONS": {
           "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    }
}

1
2
3
4
5
6
7
8
9
10

# 4.文件系统缓存

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
        'LOCATION': '/var/tmp/django_cache',
    }
}

1
2
3
4
5
6
7

# 5.基于本地内存的缓存

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
        'LOCATION': 'unique-snowflake',
    }
}
1
2
3
4
5
6

# 项目应用

# 1.全部项目缓存

# 使用中间件,经过一系列的认证等操作
# 如果内容在缓存中存在,则使用FetchFromCacheMiddleware获取内容并返回给用户
# 当返回给用户之前,判断缓存中是否已经存在
# 如果不存在则UpdateCacheMiddleware会将缓存保存至缓存,从而实现全站缓存

MIDDLEWARE = [
    'django.middleware.cache.UpdateCacheMiddleware',
    # 其他中间件...
    'django.middleware.cache.FetchFromCacheMiddleware',
]
CACHE_MIDDLEWARE_ALIAS = ""
CACHE_MIDDLEWARE_SECONDS = ""
CACHE_MIDDLEWARE_KEY_PREFIX = ""

1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 2.单独视图缓存

# 方式一
from django.views.decorators.cache import cache_page

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


# 方式二
from django.views.decorators.cache import cache_page

urlpatterns = [
    url(r'^foo/([0-9]{1,2})/$', cache_page(60 * 15)(my_view)),
]


# 方式三
from django.views.decorators.cache import cache_page
@cache_page(10)   #缓存10秒
def cache(request):
    import time
    time=time.time()
    return render(request,'cache.html',{'time':time,})

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 前端模板,引入TemplateTag
{% load cache %}

# 前端模板,使用缓存
{% cache 5000 缓存key %}
    缓存内容
{% endcache %}

1
2
3
4
5
6
7
8

# Django缓存的实施方案

# 方案1: cache_page 缓存

  • 用法

    • 在视图添加装饰器 @cache_page(过期时间s)
  • 优点:

    • 简单粗暴
  • 缺点:

    • 无法细粒度缓存,无法针对性存储
    • 无法按照角色进行缓存(管理员或者访客)
    • 更新或者删除成本过高, 出现新旧数据不一致, 因为无法获取到django系统设置缓存的key,无法获取cache key 更新难度复杂
  • 适用场景:

    • 简单缓存, 无角色认证,

# 方案2 cache.set 局部缓存

  • 用法 cache.set/get

  • 优点:

    • 灵活
    • 存储成本最优
    • 删除成本低
  • 缺点:

    • 代码实现成本高
  • 底层方法

    from django.core.cache import cache
    
    设置:cache.set(键,值,有效时间)
    获取:cache.get(键)
    删除:cache.delete(键)
    清空:cache.clear() 
    
    1
    2
    3
    4
    5
    6

# 方案3 cache.set + 装饰器

  • 推荐使用

  • 实现逻辑:

    • 自我实现带参数的装饰器进行缓存
    • 复用 cache.set 方法
    • 根据角色或者其他场景自定义缓存key
    • 自定义过期时间

    每次数据库更新根据缓存key进行清理缓存

  • 实现方式:

    def cache_set(expire_time):
      def _cache_set(func):
        def inner(request, *args,**kwargs):
          # 区分场景
          # 根据场景生产正确的cache key
          # 判断是不是有缓存
          	# 有缓存直接返回缓存
            # 无缓存执行视图->获取结果-> 设置缓存-> 返回结果
        return func(request, *args,**kwargs)
      return inner
    return _cache_set
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
  • 底层方法

    from django.core.cache import cache
    
    设置:cache.set(键,值,有效时间)
    获取:cache.get(键)
    删除:cache.delete(键)
    清空:cache.clear() 
    
    1
    2
    3
    4
    5
    6
#Python#
上次更新: 2023/04/16, 18:35:33
Django models 之字段详解
Django数据库系统

← Django models 之字段详解 Django数据库系统→

最近更新
01
go与http代理
05-24
02
自制申威架构k8s-reloader
12-06
03
Docker Buildx 教程
12-01
更多文章>
Theme by Vdoing | Copyright © 2020-2024 小刘扎扎 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式