开发实践6_缓存^中间件

news2024/9/30 9:30:14

以下学习 朔宁夫 开发工程师 课程。

缓存可提高程序响应速度。数据库缓存(可过期)/ Redis缓存(Key:Value)/ Memcacheed缓存/ 程序层缓存。

一 缓存

1. 数据库缓存

创建缓存数据表 //

python manage.py createcachetable cache_table

setting //

# 缓存配置
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache', 
        # 数据库缓存 声明此时django项目使用数据库缓存方式进行缓存
        'LOCATION': 'cache_table'  
        # 指定数据库缓存表的名称
    }
}

创建新的演示 app //

 python manage.py startapp cache_app

setting注册、项目链接总路由、app创建子路由。

path('cache/',include('cache_app.urls', namespace="cache")),

views //

import time

from django.core.cache import caches
from django.http import HttpResponse
from django.shortcuts import render


def db_show(request):
    #  实例化缓存对象
    db_cache = caches["default"]
    #  判断缓存师傅存在
    cache_data = db_cache.get("data_cache")  # 缓存的数据
    if cache_data:
        print("命中缓存")
        return HttpResponse(cache_data)
    print("没有命中,开始查找······")
    time.sleep(10)
    data = ['new algorithm', 'new application', 'combining models', 'data mining']
    response = render(request, "advance.html", {"data": data})
    #  设置缓存
    db_cache.set("data_cache", response.content, timeout=30)
    return response

sub route//

app_name = "cache"

urlpatterns = [
    path('db/', db_show),
]

advance.html //

<ul>
    {% for i in data %}
        <li>{{ i }}</li>
    {% endfor %}
</ul>

2. Redis缓存

# 安装依赖 # pip install django-redis # pip install django-redis-cache

wget http://download.redis.io/releases/redis-5.0.3.tar.gz

or

Releases · tporadowski/redis · GitHub

Windows下安装Redis7.0.8_redis7.0.8解压版安装-CSDN博客

最终找资源安装了github上的7+需编译版。安装完成后

1) “服务” 启动 get readyxxx,redis 2项

2)管理员cmd cd /d D:\mysql\redis , redis-server.exe redis.conf , 

3)管理员cmd cd /d D:\mysql\redis , redis-cli.exe -h 127.0.0.1 -p 6379 , set a 1 ,  get a

4)django terminal  D:\mysql\redis> .\redis-cli.exe  , ping , select 15 , keys *。可见我的15号库是空的。

setting //

CACHES = {
    #  数据库缓存
    'default': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
        # 数据库缓存 声明此时django项目使用数据库缓存方式进行缓存
        'LOCATION': 'cache_table'
        # 指定数据库缓存表的名称
    },
    #  Redis 缓存 (Redis有[0,15]个库select k, 默认0对应6379)
    #  安装依赖
    #  pip install django-redis
    #  pip install django-redis-cache
    'redis_cache': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': 'redis://127.0.0.1:6379/2',  # 设置为本机 2号库
        'OPTIONS': {
            'CLIENT_CLASS': 'django_redis.client.DefaultClient'
        }
    }
}

views //

def redis_show(request):
    #  实例化缓存对象
    redis_cache = caches["redis_cache"]
    #  判断缓存师傅存在
    cache_data = redis_cache.get("data_cache")  # 缓存的数据
    if cache_data:
        print("命中缓存")
        return HttpResponse(cache_data)
    print("没有命中,开始查找······")
    time.sleep(10)
    data = ['new algorithm', 'new application', 'combining models', 'data mining']
    response = render(request, "advance.html", {"data": data})
    #  设置缓存
    redis_cache.set("data_cache", response.content, timeout=30)
    return response

访问页面,未过期时终端可见2号库中数据

3. memcached缓存

#  memcached
#  一个单独的服务系统,有自己的端口号
#  pip install python-memcached
'mem_cached': {
    'BACKEND': 'django.core.cache.backends.memcached.MemcachedCach',  # 指定缓存使用的引擎
    'LOCATION': '127.0.0.1:11211'
}

4. 程序层缓存

django中使用最多的一种方式

① 用装饰器

views //

@cache_page(30)  #  先看有没有缓存,再绝对是否调用函数
def show(request):
    print('无系统缓存,执行对本函数的调用')
    data = ['new algorithm', 'new application', 'combining models', 'data mining']
    return render(request, "advance.html", {"data": data})

②放到urls中使用

url //

path('pro_url/', cache_page(30)(url_show))

views //

def url_show(request):
    print('无系统缓存,执行对本函数的调用')
    data = ['new algorithm', 'new application', 'combining models', 'data mining']
    return render(request, "advance.html", {"data": data})

二 中间件

中间件本质上是一个类。AOP思想。aspect oriented programming, 面向切面编程。AOP&OOP。实现:注册+添加方法。

需要复写的方法(自定义的middleware类中添加相关执行时机的方法):1)process_request(self,request)请求预处理方法;2)process(self, request, view, args, kwargs) View预处理方法;3)process_response(self, request, response)Response后处理方法;4)process_exception(self, request, exception) Exception后处理方法。

演示:

项目层new python package my_middleware

package下new my_middleware.py //

from urllib import response

from django.utils.deprecation import MiddlewareMixin


class MyFirstMiddleWare(MiddlewareMixin):
    def process_request(self, request):
        print("1--process_request")

    def process_view(self, request, view, args, kwargs):
        print("2--process_view")

    def process_response(self, request, response):
        print("3--precess_response")
        return response

class MySecondMiddleWare(MiddlewareMixin):
    def process_request(self, request):
        print("21--process_request")

    def process_view(self, request, view, args, kwargs):
        print("22--process_view")

    def process_response(self, request, response):
        print("23--precess_response")
        return response

注册 setting  注意列表元素有序,遍历先后问题//

MIDDLEWARE = [xxx,

'my_middleware.my_middleware.MyFirstMiddleWare',

'my_middleware.my_middleware.MySecondMiddleWare',]

访问某个页面 //

# 从前往后遍历中间件,但response从后往前

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

怎么样的布局是符合可制造性的PCB布局?

满足可制造性、可装配性、可维修性要求&#xff0c;方便调试的时候于检测和返修&#xff0c;能够方便的拆卸器件&#xff1a; 1&#xff09;极性器件的方向不要超过2种&#xff0c;最好都进行统一方向等要求&#xff0c;如图1-1所示&#xff1b; 图1-1 极性器件方向统一摆放 2…

【C语言】ipoib模块 - ipoib_send_rss函数

一、ipoib_send_rss函数定义 int ipoib_send_rss(struct net_device *dev, struct sk_buff *skb,struct ib_ah *address, u32 dqpn) {struct ipoib_dev_priv *priv ipoib_priv(dev);struct ipoib_tx_buf *tx_req;struct ipoib_send_ring *send_ring;u16 queue_index;int hlen…

SQL Povit函数使用及实例

PIVOT函数常用于数据的行转列&#xff0c;同时也可以用此函数实现类似于Excel中的数据透视表的效果。 PIVOT函数 PIVOT 函数的基本语法如下&#xff1a; -- PIVOT 语法 SELECT <非透视的列>,[第一个透视的列] AS <列名称>,[第二个透视的列] AS <列名称>,.…

Oracle 数据库备份与恢复的重要性与最佳实践

文章目录 一、备份的重要性二、备份工具-RMAN四、比较备份策略五、实例恢复六、完全恢复与不完全恢复七、备份与恢复脚本 引言&#xff1a; 在现代信息时代&#xff0c;数据已成为组织和企业最重要的资产之一。保护和恢复数据的能力对于确保业务连续性和减少潜在风险至关重要。…

探索 2024 年新副业:无人饮品机的新风向

随着科技的迅猛发展&#xff0c;无人饮品机作为一种全新的商业模式&#xff0c;正逐渐成为 2024 年副业的新风向。如果你还没有了解过这种全新的副业&#xff0c;那么现在是时候深入了解一下了。 D咖无人饮品机的优势在于其 24 小时不间断的营业模式&#xff0c;它可以在你睡觉…

【成功案例】首日ROI超70%!ROI目标超150%!看 NetMarvel如何助力棋牌游戏出海?

今天无论是线上线下&#xff0c;中国游戏广告在海外市场上屡见不鲜&#xff0c;甚至还会出现包场式营销&#xff0c;“中国人敢花钱”的印象已经深入人心&#xff0c;特别是休闲游戏的爆发给众多众多厂商带来新的增长机遇&#xff0c;大家花钱的态势更猛了。 棋牌类属于休闲体…

以后要做GIS开发的话是学GIS专业还是学计算机专业好一些?

GIS开发其实严格来说分为前后端以及底层开发。不同的方向&#xff0c;代表了不同的开发语言。 所以大家首先要了解自己具体要做的岗位类型是什么&#xff0c;其次才是选择专业侧重点。 但是严格来说&#xff0c;选择某个专业&#xff0c;到就业方向这个过程&#xff0c;并不是…

大疆笔试题目(2023-08-13)

1. 输出无重复3位数 时间限制&#xff1a; 3000MS 内存限制&#xff1a; 65536KB 题目描述&#xff1a; 从{1,2,3,4,5,6,7,8,9}中随机挑选不重复的5个数字作为输入数组’selectedDigits’&#xff0c;能组成多少个互不相同且无重复数字的3位数&#xff1f;请编写程序&#xff…

大创项目推荐 深度学习的水果识别 opencv python

文章目录 0 前言2 开发简介3 识别原理3.1 传统图像识别原理3.2 深度学习水果识别 4 数据集5 部分关键代码5.1 处理训练集的数据结构5.2 模型网络结构5.3 训练模型 6 识别效果7 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习…

基于小波多普勒变换的回波信号检测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1小波变换基础 4.2 多普勒效应与多普勒变换 4.3 小波多普勒变换 4.4 回波信号检测 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 %回波…

QT自定义控件0-360°刻度尺

支持0到360&#xff0c;360到0的过度。 直接上代码&#xff0c;可以直接用&#xff0c;使用的paintevent事件实现的&#xff0c;没啥好讲的。 .cpp void Widget::drawCourse(QPainter& p,QPen pen,QFont font) {double currentNumber m_ang;p.setBrush(Qt::black);p.dra…

Docker-02-镜像项目部署

Docker-02-镜像&项目部署 文章目录 Docker-02-镜像&项目部署一、镜像①&#xff1a;镜像结构②&#xff1a;Dockerfile③&#xff1a;构建镜像01&#xff1a;构建02&#xff1a;查看镜像列表03&#xff1a;运行镜像 二、网络①&#xff1a;容器的网络IP地址②&#xff…

【动态规划】【二分查找】【C++算法】730. 统计不同回文子序列

作者推荐 【动态规划】【数学】【C算法】18赛车 涉及知识点 动态规划 二分查找 LeetCode730. 统计不同回文子序列 给你一个字符串 s &#xff0c;返回 s 中不同的非空回文子序列个数 。由于答案可能很大&#xff0c;请返回对 109 7 取余 的结果。 字符串的子序列可以经由…

PGSQL主键序列

PostgreSQL和 MySQL数据库还是有一定的区别。 下面了解一下 PGSQL的主键序列。 一、主键 1、系统自带主键序列 在 PostgreSQL 中&#xff0c;GENERATED BY DEFAULT 和 GENERATED ALWAYS 是用于定义自动生成的列&#xff08;Generated Column&#xff09;的选项。一般可作用…

可达性分析

可达性分析 这个算法的基本思路就是通过 一系列称为“GC Roots”的根对象作为起始节点集&#xff0c;从这些节点开始&#xff0c;根据引用关系向下搜索&#xff0c;搜索过 程所走过的路径称为“引用链”&#xff08;Reference Chain&#xff09;&#xff0c;如果某个对象到GC …

数学建模--比赛

内容来自数学建模BOOM&#xff1a;【快速入门】北海&#xff1a;数模建模基础MATLAB入门论文写作数学模型与算法(推荐数模美赛国赛小白零基础必看教程)_哔哩哔哩_bilibili 目录 1.学习内容 2.参赛须知 1&#xff09;参赛作品的组成 2)参赛作品的提交 3.软件安装 4.注意…

Electron中苹果支付 Apple Pay inAppPurchase 内购支付

正在开发中&#xff0c;开发好了&#xff0c;写一个完整详细的过程&#xff0c;保证无脑集成即可 一、先创建一个App 一般情况下&#xff0c;在你看这篇文章的时候&#xff0c;说明你已经开发的app差不多了。 但是要上架app到Mac App Store&#xff0c;则要在appstoreconnect…

pyspark 笔记:窗口函数window

窗口函数相关的概念和基本规范可以见&#xff1a;pyspark笔记&#xff1a;over-CSDN博客 1 创建Pyspark dataFrame from pyspark.sql.window import Window import pyspark.sql.functions as F employee_salary [("Ali", "Sales", 8000),("Bob&qu…

UI自动化Selenium 无头模式运行

1、导入浏览器参数设置 from selenium.webdriver.chrome.options import Options 2、创建参数&#xff0c;并使用无厘头模式创建driver对象 opt Options() # 新建参数对象 opt.add_argument("--headless") # 无头 self.driver webdriver.Chrome(optionsopt) …

【数据结构】哈希表详解,举例说明 java中的 HashMap、HashTable及其区别

一、哈希表&#xff08;Hash Table&#xff09;简介&#xff1a; 哈希表是一种数据结构&#xff0c;用于实现字典或映射等抽象数据类型。它通过把关键字映射到表中的一个位置来实现快速的数据检索。哈希表的基本思想是利用哈希函数将关键字映射到数组的索引位置上&#xff0c;…