缓存

news/2024/9/20 16:29:46/文章来源:https://www.cnblogs.com/sherwin1995/p/18422735

Django4中的缓存

详细文档参考:https://www.cnblogs.com/Neeo/articles/17589834.html

Django支持的缓存有好几种:

  • 三方的Redis(推荐),Memcached(不推荐)
  • 缓存到本地文件
  • 缓存到本地数据库
  • 缓存到内存里
  • 虚拟缓存

image-20230730174240977

缓存的粒度

局部视图缓存

缓存指定的视图函数,有两种写法.

  1. 在视图中以装饰器的形式

views.py

import datetime
from django.shortcuts import render, HttpResponse# 必须导入缓存装饰器
from django.views.decorators.cache import cache_page@cache_page(5)  # 缓存单位:秒
def index(request):# print(1111)now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')return render(request, 'index.html', {"now": now})

urls.py:

from django.contrib import admin
from django.urls import path
from api import viewsurlpatterns = [path('admin/', admin.site.urls),path('index/', views.index),
]
  1. 在路由中实现

views.py

import datetime
from django.shortcuts import render, HttpResponsedef index(request):# print(1111)now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')return render(request, 'index.html', {"now": now})

urls.py

from django.contrib import admin
from django.urls import path
from api import viewsfrom django.views.decorators.cache import cache_page
urlpatterns = [path('admin/', admin.site.urls),# path('index/', views.index),path('index/', cache_page(5)(views.index)),  # 缓存,路由中指定缓存的视图函数
]

模板缓存,粒度更新,相当于对于页面的局部进行缓存

views.py中正常写代码:

import datetime
from django.shortcuts import render, HttpResponse
# 必须导入缓存装饰器
# from django.views.decorators.cache import cache_page
#
#
# @cache_page(5)  # 缓存单位:秒
def index(request):# print(1111)now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')return render(request, 'index.html', {"now": now})

urls.py正常写代码:

from django.contrib import admin
from django.urls import path
from api import views# from django.views.decorators.cache import cache_page
urlpatterns = [path('admin/', admin.site.urls),path('index/', views.index),# path('index/', cache_page(5)(views.index)),  # 缓存,路由中指定缓存的视图函数
]

index.html这里就需要注意了。

  1. 必须load cache
  2. 必须用缓存的模板把要缓存的内容包起来,才能被缓存上,其它没包裹的标签,不缓存。
{% load cache %} <!-- 必须声明 -->
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h3>没有缓存的</h3>
<p>{{ now }}</p><h3>有缓存的</h3>
<!-- cache 后面的5,表示缓存的时间,5后面的字符串来自于settings.py中的缓存配置中的LOCATION的值'unique-snowflake'-->
<!-- 用缓存的模板把要缓存的内容包起来-->
{% cache 5 'unique-snowflake' %}<p>{{ now }}</p><p>{{ now }}</p>
{% endcache %}
</body>
</html>

全栈缓存

就是整个项目进行缓存,粒度是最大的。

首先要配置settings.py

MIDDLEWARE = [# 下面这个缓存中间件必须放在所有中间件的最上面"django.middleware.cache.UpdateCacheMiddleware",'django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware','django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware',# 下面这个缓存中间件必须放在所有中间件的最下面"django.middleware.cache.FetchFromCacheMiddleware",
]# 我这里将cache缓存由本地内存缓存更换为了Redis
CACHES = {"default": {"BACKEND": "django_redis.cache.RedisCache","LOCATION": "redis://:@127.0.0.1:6379/2","OPTIONS": {"CLIENT_CLASS": "django_redis.client.DefaultClient","PASSWORD": "1234",  # 密码,如果没有设置密码,这个参数可以注视掉# 'MAX_ENTRIES': 300,  # 最大缓存个数(默认300)# 'CULL_FREQUENCY': 3,  # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)}}
}# 默认超时时间是300秒,我们可以通过CACHE_MIDDLEWARE_SECONDS来修改
CACHE_MIDDLEWARE_SECONDS = 20
# 下面是关于key的,咱们这里保持默认就完了
CACHE_MIDDLEWARE_KEY_PREFIX = ""
# 用于存储的缓存别名,没想好的,指定个default就行
CACHE_MIDDLEWARE_ALIAS = "default"

views.py正常写代码:

import datetime
from django.shortcuts import render, HttpResponse
# 必须导入缓存装饰器
# from django.views.decorators.cache import cache_page
#
#
# @cache_page(5)  # 缓存单位:秒
def index(request):# print(1111)now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')return render(request, 'index.html', {"now": now})

urls.py正常写代码:

from django.contrib import admin
from django.urls import path
from api import views# from django.views.decorators.cache import cache_page
urlpatterns = [path('admin/', admin.site.urls),path('index/', views.index),# path('index/', cache_page(5)(views.index)),  # 缓存,路由中指定缓存的视图函数
]

index.html也正常写代码:

{% load cache %} <!-- 必须声明 -->
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h3>没有缓存的</h3>
<p>{{ now }}</p><h3>有缓存的</h3>
{% cache 5 'unique-snowflake' %}<p>{{ now }}</p><p>{{ now }}</p>
{% endcache %}</body>
</html>

注意,如果同时使用了全栈缓存和局部模板片段缓存,那么全栈缓存的优先级高。

Redis

数据库排行榜:https://db-engines.com/en/ranking

redis是一个独立的非关系型数据。

官方建议,将Redis安装到Linux系统,所以,你在redis官网,压根看不到redis关于Windows的安装包。

redis3 for Windows

参考:https://www.cnblogs.com/Neeo/articles/12673194.html#windows

和讲解视频

redis3 for centos

参考:https://www.cnblogs.com/Neeo/articles/12673194.html#redis307-for-centos79

和讲解视频

注意,必须关闭你的centos系统的防火墙:

# 查看防火墙状态
systemctl status firewalld.service
# 关闭防火墙
systemctl stop firewalld.service
# 禁止开机启动防火墙
systemctl disable firewalld.service
# 启动防火墙
systemctl start firewalld.service
# 防火墙随系统开启启动
systemctl enable firewalld.service# 关闭selinux
[root@r ~]# sed -i.ori 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config

关于Redis使用和python如何操作

参考我的博客:https://www.cnblogs.com/Neeo/p/10864123.html#database

image-20230730190025435

关于Django如何操作Redis?参考:https://www.cnblogs.com/Neeo/articles/14269422.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/800585.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VSCode 定义代码模板

在使用编写代码的过程中,经常会写一些固定代码段。 以 Java 为例,定义实体类时一般都会编写序列化版本号: @Serial private static final long serialVersionUID = 1L;这段代码是固定写法,基本不会变,如果每次都手写的话,就比较繁琐了。 VSCode 提供了生成代码段的功能,…

轻松部署!龙蜥操作系统安装Zabbix7.0详细教程

龙蜥操作系统(Anolis OS)作为龙蜥社区发行的开源Linux发行版,以其稳定、高性能、安全、可靠和100%兼容CentOS 8软件生态的特点,成为众多企业和开发者的首选操作系统。它不仅支持多计算架构,如X86、ARM、RISC-V等,还针对云端场景进行了优化,为云上典型场景带来显著的性能…

WPF 隐藏listview控件的滚动条

两种方式:需要自行验证,对控件,那个有效,那个没效对于不可控的事情,保持乐观; 对于可控的事情,保持谨慎

前端实现文件导出

在后台管理系统中,我们经常会遇到文件导出这个需求,下面,我将几种常见的导出方式做一个简单的介绍,让大家在以后遇到此类需求时,能够切合实际情况,采取相对合理的方式。 导出目标 文件地址已经存在服务器上的静态文件,比如用户上传的图片、材料等等。http://192.168.1.1…

JavaScript拆分字符串时产生空字符的原因

问题描述 使用JavaScript的split方法拆分字符串时出现一些空字符串"",尤其是当使用正则表达式作为分隔符的时候。 相关问题javascript正则表达式对字符串分组时产生空字符串组?在上面这个问题中,题主使用正则表达式对字符串进行分割时产生了多个空字符串"&qu…

ASR6601 是一款通用的 Sub-GHz 无线通讯 SoC 芯片

SoC 芯片ASR6601 是一款通用的 Sub-GHz 无线通讯 SoC 芯片 该芯片集成了 Sub-GHz 射频收发器和 32 位的 RISC MCU。Sub-GHz 射频收发器不仅支持 LoRa 调制,还支持 (G)FSK 和 G(MSK) 等调制方式。CPU 为 ARM STAR,工作频率最大支持 48 MHz。此外,该芯片支持 3 x I2C,1 x I2S…

[ABC221H] Count Multiset

题意思路 参考了题解做法。 设 \(f_{i, j}\) 表示填入 \(i\) 个数字,和为 \(j\) 的方案数。 每次可以填入 \(0\),或者将整个数列 \(+1\)。 \(g_{i, j}\) 表示填入 \(i\) 个数字,且这 \(i\) 个数字中没有 \(0\),何为 \(j\) 的方案数。 易得 \(g_{i, j} = f_{i, j - i}\),表…

ModelForm

1.7 ModelForm使用Form创建Form类 + 定义字段 class LoginForm(forms.Form):user = forms.CharField(label="用户名", widget=forms.TextInput)pwd = forms.CharField(label="密码", widget=forms.TextInput)视图def login(request):if request.method == …

深入理解Java对象结构

一、Java对象结构 实例化一个Java对象之后,该对象在内存中的结构是怎么样的?Java对象(Object实例)结构包括三部分:对象头、对象体和对齐字节,具体下图所示1、Java对象的三部分 (1)对象头 对象头包括三个字段,第一个字段叫作Mark Word(标记字),用于存储自身运行时的…

Kyutai 开源对话模型 Moshi;李飞飞空间智能公司已筹集超过 2.3 亿美元丨 RTE 开发者日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编辑的个人观点…

P3224 [HNOI2012] 永无乡

题意思路 用并查集维护连通性,每个集合维护一个平衡树,每次合并两个集合的时候,将一个平衡树的节点一个一个加入到另一个中。 这么做不会超时,每次将小的平衡树拆掉放到大的中,可以证明不会超过 \(O(\log n)\) 次。 总时间复杂度 \(O(n \log ^ 2 n)\)。 代码 #include <…

C#使用HttpWebRequest读取网站内容遭遇503错误

本人多年编程小白,天生编程白痴体质。大家莫见笑。 自己用C#写了一段代码,使用HttpWebRequest,通过SOHU的API接口获取指定股票的交易信息。 该段代码一直运行正常。最近开始报错。 详细信息如下: System.Net.WebException HResult=0x80131509 Message=远程服务器返回错误: (…