Django 缓存机制 Redis缓存

2023-11-13

Django 提供6种缓存方式

(1)开发调式缓存

(2)内存缓存

(3)文件缓存

(4)数据库缓存

(5)Memcache缓存(使用Python-memcached模块)

(6)Memcache缓存(使用pylibmc模块)

常用的缓存方式是 文件缓存Memcache缓存

1. Django开发调式缓存

from django.views.decorators.cache import cache_page  # 缓存装饰器
# method_decorator可以用来装饰方法,使用方法多种,
# 详细见:https://docs.djangoproject.com/en/3.0/topics/class-based-views/intro/
from django.utils.decorators import method_decorator   
class GetBookView(View):
    """
    获取单个图书
    """
    @method_decorator(cache_page(3))  # 表示缓存使用3秒,3秒后再查询数据库
    def get(self,request,id):
        book=Books.objects.filter(id=id).first()
        print(book.pv)
        book.pv+=1
        book.save()
        return render(request,'book.html',{'t':book})

这种缓存,项目一旦上线缓存功能就会消失,原因是Django默认的缓存配置是开发调式模式,如果需要在上线后继续使用缓存功能,就需要在setting.py中添加配置代码,用来指定缓存的存储方式。

2. 缓存位置的选择

(1)开发调式缓存

CACHES = {
 'default': {
  'BACKEND': 'django.core.cache.backends.dummy.DummyCache',  # 缓存后台使用的引擎
  'TIMEOUT': 300,            # 缓存超时时间(默认300秒,None表示永不过期,0表示立即过期)
  'OPTIONS':{
   'MAX_ENTRIES': 300,          # 最大缓存记录的数量(默认300)
   'CULL_FREQUENCY': 3,          # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
  },
 }
}

(2)内存缓存

CACHES = {
 'default': {
  'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',  # 指定缓存使用的引擎
  'LOCATION': 'unique-snowflake',         # 写在内存中的变量的唯一值 
  'TIMEOUT':300,             # 缓存超时时间(默认为300秒,None表示永不过期)
  'OPTIONS':{
   'MAX_ENTRIES': 300,           # 最大缓存记录的数量(默认300)
   'CULL_FREQUENCY': 3,          # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
  }  
 }
}

(3)文件缓存

CACHES = {
 'default': {
  'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', #指定缓存使用的引擎
  'LOCATION': '/var/tmp/django_cache',        #指定缓存的路径
  'TIMEOUT':300,              #缓存超时时间(默认为300秒,None表示永不过期)
  'OPTIONS':{
   'MAX_ENTRIES': 300,            # 最大缓存记录的数量(默认300)
   'CULL_FREQUENCY': 3,           # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
  }
 }   
}

(4)数据库缓存

创建缓存的数据库表使用语句: python manage.py createcachetable

CACHES = {
 'default': {
  'BACKEND': 'django.core.cache.backends.db.DatabaseCache',  # 指定缓存使用的引擎
  'LOCATION': 'cache_table',          # 数据库表    
  'OPTIONS':{
   'MAX_ENTRIES': 300,           # 最大缓存记录的数量(默认300)
   'CULL_FREQUENCY': 3,          # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
  }  
 }   
}

(5)Memcache缓存(使用 Python-memcached 模块 连接Memcache)

Memcached 是Django原生支持的缓存系统。

要使用Memcached ,需要下载Memcached的支持库 Python-memcached 或pylibmc

CACHES = {
 'default': {
  'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', # 指定缓存使用的引擎
  'LOCATION': '222.169.10.100:11211',         # 指定Memcache缓存服务器的IP地址和端口
  'OPTIONS':{
   'MAX_ENTRIES': 300,            # 最大缓存记录的数量(默认300)
   'CULL_FREQUENCY': 3,           # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
  }
 }
}
'LOCATION': 'unix:/tmp/memcached.sock',   # 指定局域网内的主机名加socket套接字为Memcache缓存服务器
'LOCATION': [         # 指定一台或多台其他主机ip地址加端口为Memcache缓存服务器
 '222.169.10.100:11211',
 '222.169.10.101:11211',
 '222.169.10.102:11211',
]

LOCATION 也可以配置成上图所示

(6)Memcache缓存(使用 pylibmc 模块)

CACHES = {
  'default': {
   'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',  # 指定缓存使用的引擎
   'LOCATION':'192.168.10.100:11211',         # 指定本机的11211端口为Memcache缓存服务器
   'OPTIONS':{
    'MAX_ENTRIES': 300,            # 最大缓存记录的数量(默认300)
    'CULL_FREQUENCY': 3,           # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
   },  
  }
 }
'LOCATION': '/tmp/memcached.sock',  # 指定某个路径为缓存目录
'LOCATION': [       # 分布式缓存,在多台服务器上运行Memcached进程,程序会把多台服务器当作一个单独的缓存,而不会在每台服务器上复制缓存值
 '192.168.10.100:11211',
 '192.168.10.101:11211',
 '192.168.10.102:11211',
]

LOCATION 也可以配置成上图所示

注意: Memcached是基于内存的缓存,数据存储在内存当中,如果服务器宕机,数据就会丢失,所以Memcached一般与其他缓存配合使用

3 Django REST framework 实现缓存机制

(1) pip install drf-extensions

(2) 在settings.py中配置

# DRF扩展
REST_FRAMEWORK_EXTENSIONS = {
    # 缓存时间
    'DEFAULT_CACHE_RESPONSE_TIMEOUT': 6
    # 缓存位置, 与配置文件中的CACHES的键对应
    'DEFAULT_USE_CACHE': 'default',
}

(3)添加缓存机制

   1. 用mixin的方法

from django.shortcuts import render
from .models import Goods
from .serializers import GoodsModelSerializer
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework_extensions.cache.mixins import CacheResponseMixin
# Create your views here.
class GetGoodListView(CacheResponseMixin,APIView):
    """
    获取商品列表
    """
    def get(self,request):
        good_list=Goods.objects.all()
        re=GoodsModelSerializer(good_list,many=True)
        return Response(re.data)

    2. 用装饰器的方法

from django.shortcuts import render
from .models import Goods
from .serializers import GoodsModelSerializer
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework_extensions.cache.mixins import CacheResponseMixin
from rest_framework_extensions.cache.decorators import cache_response
# Create your views here.	
class GetGoodListView(APIView):
    """
    获取商品列表
    """
    @cache_response(timeout=60*60, cache='default')
    def get(self,request):
        good_list=Goods.objects.all()
        re=GoodsModelSerializer(good_list,many=True)
        return Response(re.data)

没有增加缓存机制时, 访问耗时是84ms,  加了之后是34ms。 速度提升了一两倍

缓存的应用多用于 判断用户的文件夹和文件大小的接口。 因为判断文件这些非常占用IO资源。

4. 使用非关系型数据库 Redis

(1)确保redis服务器在运行。

(2)安装django-redis依赖: pip install django-redis

  (3)  在settings.py中增加配置代码

# 配置Redis缓存
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        # 如果redis server 设置了密码,则写成 "LOCATION": "密码@redis://127.0.0.1:6379",
        "LOCATION": "redis://127.0.0.1:6379",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django 缓存机制 Redis缓存 的相关文章

  • “一旦获取切片就无法更新查询”。最佳实践?

    由于我的项目的性质 我发现自己不断地从查询集中取出切片 如下所示 Thread objects filter board requested board id order by updatedate 10 但这给我带来了实际对我选择的元素进
  • Django通用外键和select_相关

    我试图使用与通用外键的关系来选择模型 但它没有按预期工作 我认为用代码可以更好地说明和理解 class ModelA models Model created models DateTimeField auto now add True c
  • 如何在 Django 中使用基于类的视图创建注册视图?

    当我开始使用 Django 时 我几乎使用 FBV 基于函数的视图 来处理所有事情 包括注册新用户 但当我更深入地研究项目时 我意识到基于类的视图通常更适合大型项目 因为它们更干净且可维护 但这并不是说 FBV 不是 无论如何 我将整个项目
  • 从 S3 提供 Django 的静态文件和媒体文件

    我遇到了一个奇怪的问题 我不知道是什么原因造成的 这是我当前的配置 使用Heroku MEDIA URL media STATIC URL static STATICFILES DIRS os path join PROJECT DIR s
  • Django REST Framework ManyToMany 过滤多个值

    我有两个模型 一个定义用户 另一个定义这些用户的标签 我正在使用 Django REST Framework 创建 API 我希望能够查询至少包含标签 id 1 和 2 的用户 例如 如果用户的标签是 1 2 1 2 3 2 3 1 3 我
  • Django模型更新或创建具有唯一约束的对象

    有一个模型 class Proxy models Model host models CharField max length 100 port models CharField max length 10 login models Cha
  • Django、模板、for 循环和循环

    tl 博士在底部 让我尝试解释一下我想要完成的任务 我有一个二维数组 我想以某种方式显示其内容 我想要 行 并且每行只能显示不超过三个 对象 因为缺乏更好的词 所以我想迭代该数组并在此过程中创建 HTML 我的想法是这样的 数组中的每个 三
  • Django:使用条件 {% extends %} 使 {% block "div" %} 成为条件

    我想分享一个 AJAX 和常规 HTTP 调用之间的模板 唯一的区别是一个模板需要扩展 base html html 而另一个则不需要 我可以用 extends request is ajax yesno app base ajax htm
  • Django“和”Pinax 还是只是 Pinax?

    我正在开发一个个人项目 该项目已 完成 但现在我想添加一个社交应用程序 我认为 Pinax 已经为这项任务做好了准备 我想知道一些事情 我可以在我的项目中像 django 应用程序一样使用 pinax 吗 或者我需要使用 pinax 重新设
  • 在 Python/Django 中将用户的 facebook/twitter 好友与网站用户进行比较

    我想知道是否有人可以帮助指导解决这个相当常见的问题的方法 我正在构建一个简单的网站 用户可以连接他们的 Twitter 帐户进行注册 我想创建一个界面 向他们显示哪些推特好友已经在使用该网站 因此 我可以获得用户的 Twitter 朋友列表
  • Django dumpdata 和 loaddata 不适用于多对多中介模型

    我在以下模型上将 dumpdata 与 Django 1 2 3 一起使用 class Bar models Model class Foo models Model bars models ManyToManyField Bar thro
  • 带有用户信息的 Django Logger

    我只是好奇 是否可以放User内的信息formatters信息输入LOGGING配置在setting py 现在我只是将该信息放入要记录的消息中 但也许有一种方法可以将其设置为formatters争论 这是我的LOGGING现在的配置 LO
  • django-orm:如何更新一对一关系字段值

    模型 py class Area models Model area name models CharField max length 255 null False blank False description models TextFi
  • 在 django 中自定义项目和应用程序模板

    我想自定义运行时创建的文件和文件夹 python manage py startapp appname 我发现一遍又一遍地做一些事情 我认为如果在创建新应用程序时存在我的自定义功能 那就太好了 您知道创建应用程序时可以在哪里自定义默认文件吗
  • 如何手动发送django异常日志?

    我的应用程序中有一个应该返回的特定视图HttpResponse 如果一切都成功完成并且类似HttpResponseBadRequest 否则 此视图适用于外部数据 因此可能会引发一些意外的异常 我当然需要知道发生了什么 所以我有这样的东西
  • Django 2、python 3.4 无法解码 urlsafe_base64_decode(uidb64)

    我正在尝试通过电子邮件激活用户 电子邮件有效 编码有效 我使用了 django1 11 中的方法 该方法运行成功 在 Django 1 11 中 以下内容成功解码为 28 其中 uidb64 b Mjg force text urlsafe
  • 无需访问 Internet 即可部署 Django 的简单方法?

    我拥有的是使用 Django 开发的 Intranet 站点的开发版本以及放置在 virtualenv 中的一些外部库 它运行良好 我可以在任何具有互联网连接的计算机上使用相同的参数 使用 pip 轻松设置 virtualenv 但是 不幸
  • Django 模板 if 语句中的分组条件

    我想否定 django 模板中 if 语句中分隔的一组条件或的结果 这是我的代码 if not owner home number or owner work number or owner mobile number No contact
  • 如何在序列化器创建方法中获取 URL Id?

    我有以下网址 url r member P
  • 限制 django 应用程序模型中的单个记录?

    我想使用模型来保存 django 应用程序的系统设置 因此 我想限制该模型 使其只能有一条记录 极限怎么办 尝试这个 class MyModel models Model onefield models CharField The fiel

随机推荐

  • stringbuffer方法简单使用

    buf delete 0 buf length 清空StringBuffer buf delete 30 40 清除下标30 40之间的元素 buf insert 20 str 从下标为20的位置开始写添加进去 列如 buf hello12
  • Fine Report 连接 MySQL的问题

    工作需要今天来搞Fine Report 10 0 连接MySql 数据库 MySQL 驱动器 com mysql jdbc Driver URL jdbc mysql localhost 3306 数据库名称 useSSL false se
  • Java 内部类(1): 基本语法

    可以将一个类的定义放在另一个类的内部 这就是内部类 内部类的表面意义一目了然 不过内部类的实现语法还是稍显繁琐 内部类的分类 内部类主要分为 普通内部类 匿名内部类 局部内部类 嵌套内部类 静态内部类 普通内部类 普通内部类内不能有静态成员
  • windows下Meson构建系统

    系列文章目录 文章目录 系列文章目录 前言 find package Zug REQUIRED find package Zug REQUIRED 前言 在编译krita源码时需要构建 关于Meson的中文参考资料比较少 比较全面的是Mes
  • 若依系统分离版去除redis数据库

    文章目录 1 去除redis 配置 2 去除ruoyi framework下RedisConfig的配置 3 在ruoyi common的core redis下新建MyCache类 4 修改RedisCache类 5 修改ruoyi com
  • 谈谈装饰器(Decorator)的实现原理

    熟悉Java编程的程序猿对装饰器模式一定不陌生 它是能够动态的给一个类添加新的行为的一种设计模式 相对于通过继承的方式使用装饰器会更加灵活 在Python里面装饰器 Decorator 也是一个非常重要的概念 跟装饰器模式类似 它能够动态为
  • Android平台RTSP

    1 背景 我们在做Android平台RTSP或者RTMP播放器开发的时候 需要注意的点非常多 以下 以大牛直播SDK 官方 的接口为例 大概介绍下相关接口设计 2 接口设计 2 1 Open 接口 Open接口的目的 主要是创建实例 正常返
  • mmdetection使用tensorboard可视化训练集与验证集指标参数

    如何使用mmdetection训练自己的数据可以参考这篇文章https blog csdn net weicao1990 article details 93484603 在这篇文章中只是用训练集进行训练 没有用到验证集验证模型的指标 因此
  • 音视频基础之ffmpeg命令实战二

    ffmpeg音视频处理流程 先看两条命令 ffmpeg i test 1920x1080 mp4 acodec copy vcodec libx264 s 1280x720 test 1280x720 flv ffmpeg i test 1
  • Python在ENG信号中的应用(1)

    实验任务点与要求 设计合适的函数读取文件中的数据 该函数以孕妇ID号为唯一参数 返回包含每一个通道每种滤波方式的二维列表sig 从而使用户能够通过sig 3 1 获得第一通道经0 3 4Hz滤波后的时序信号 设计合适的函数 计算每一通道各个
  • openai

    作者介绍 大二本科网络工程专业在读 持续学习Java 努力输出优质文章 作者主页 逐梦苍穹 所属专栏 人工智能 目录 1 简介 2 如何实现 3 api文档 1 简介 OpenAI 提供了一个名为 OpenAI API 的库 用于与他们的人
  • function_score组合script_score定制评分结果

    背景 ES版本 6 4 脚本 分两步 过滤掉不关心的数据 加速后续计算分值性能 编写分值脚本 得到最终分值 GET user doc search query function score 过滤掉不关心的数据 加速计算分值性能 query
  • 【表白神器】Python超火隐藏表白图 你能看出来吗?【附源码】

    导语 浪漫至死不渝 温柔绝对屈服 马上国庆了 没啥送的 那就送大家一些表白的代码吧 大兄弟小姐妹们 大家好 我是准时上线更新代码 讲故事的程序媛小姐姐 整理了一款超火的 隐藏表白代码 希望你们喜欢 正文 隐藏表白图 我喜欢你 就像你看不见但
  • 利用sharding-jdbc进行加密解密

    使用前必看 加密后字段不可以进行like查询 加密字段以及涉及的表 代码中需改成小写 数据库表定义也需改成小写 jar包引入 mybatis spring boot starter升级为2 2 2
  • jre替换local_policy.jar和US_export_policy.jar

    JDK1 8 0 151以前版本方法 JDK1 8 0 151的无限制强度加密策略文件变动
  • 【机器视觉系统】基于3DOF机械臂的五子棋机器人(1)

    基于3DOF机械臂的五子棋机器人 文章目录 基于3DOF机械臂的五子棋机器人 1 前言 2 机器视觉系统概述 2 1 机器 2 2 视觉 2 3 系统 3 系统组成概述 3 1 使用工具盘点 3 2 流程图 4 制作步骤建议 5 需要的知识
  • 伤腰的Python爬虫案例,零基础必备实战教程

    目录 前言 开发环境介绍 爬虫案例数据采集一般步骤 1 首先第一步 找到对应的链接地址
  • 三维GIS技术应用

    三维GIS技术应用 背景 以二三维一体化GIS技术为基础框架 进一步拓展二三维一体化数据模型 融合倾斜摄影 BIM 激光点云等多源异构数据 推动三维GIS实现室外室内一体化 宏观微观一体化与空天 地表 地下一体化 赋能全空间的三维GIS应用
  • 北斗短报文遥测终端机在水雨情监测系统中的应用

    一 方案概述 我国水利监管手段比较单一 水雨情监测移动公网覆盖不足等诸多问题 利用北斗短报文通信技术 数字化信息采集技术 实现水文自动测报 大幅度提升湿地生态和水域的监测 查询 预警和应急处理能力 在恶劣天气情况或特殊灾害环境中 通过北斗卫
  • Django 缓存机制 Redis缓存

    Django 提供6种缓存方式 1 开发调式缓存 2 内存缓存 3 文件缓存 4 数据库缓存 5 Memcache缓存 使用Python memcached模块 6 Memcache缓存 使用pylibmc模块 常用的缓存方式是 文件缓存