Django学习笔记(四十三):使用redis进行页面数据缓存和更新缓存数据

构建实时Web应用:使用Django Channels实现WebSocket通信的完整指南 在项目根目录下创建一个routing.py]),})这里我们定义了一个WebSocket路由,指向chat应用中的类。 阅读详情

Django学习笔记(四十三):使用redis进行页面数据缓存和更新缓存数据

在开发过程中会遇到一些页面的数据是很长时间才进行更新的,不使用缓存的情况下,用户每次访问这些都需要先去数据库中获取这些数据,当访问量较大时,这样获取数据的方式就会降低页面的访问速度,影响效率,这时就可以使用redis将这些数据保存起来,通过判断是否生成过获取以及是否更新过数据来生成新的缓存数据

具体操作如下:

在settings.py里添加缓存设置

Django的缓存配置
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/9",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    }
}

在对应的app中的views.py文件中写视图逻辑和缓存操作

from django.core.cache import cache
from goods.models import GoodsType, GoodsSKU, IndexGoodsBanner,IndexPromotionBanner,IndexTypeGoodsBanner
 
# Create your views here.
 
 
class IndexView(View):
    def get(self,request):
        '''显示首页'''
        # 尝试从缓存中获取数据
        context = cache.get('index_page_data')
 
        if context is None:
            print('设置缓存')
            # 缓存中没有数据
            # 获取商品的种类信息
            types = GoodsType.objects.all()
            print(types)
 
            # 获取首页轮播商品信息
            goods_banners = IndexGoodsBanner.objects.all().order_by('index')
            print(goods_banners)
 
            # 获取首页促销活动信息
            promotion_banners = IndexPromotionBanner.objects.all().order_by('index')
            print(promotion_banners)
 
            # 获取首页分类商品展示信息
            for type in types: # GoodsType
                # 获取type种类首页分类商品的图片展示信息
                image_banners = IndexTypeGoodsBanner.objects.filter(type=type, display_type=1).order_by('index')
                print(image_banners)
                # 获取type种类首页分类商品的文字展示信息
                title_banners = IndexTypeGoodsBanner.objects.filter(type=type, display_type=0).order_by('index')
                print(title_banners)
 
                # 动态给type增加属性,分别保存首页分类商品的图片展示信息和文字展示信息
                type.image_banners = image_banners
                type.title_banners = title_banners
            context = {'types': types,
                       'goods_banners': goods_banners,
                       'promotion_banners': promotion_banners}
 
            # 设置redis缓存
            #  key value timeout
            cache.set('index_page_data', context, 3600)
        return render(request, 'index.html', context)
      ```
在对应的app中的admin.py文件中添加BaseModelAdmin,作用是当数据发生改变时,将之前的缓存删除,然后再通过视图逻辑生成新的缓存
```python
from django.contrib import admin
from django.core.cache import cache
from goods.models import GoodsType,IndexPromotionBanner,IndexGoodsBanner,IndexTypeGoodsBanner
# Register your models here.
 
 
class BaseModelAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        '''新增或更新表中的数据时调用'''
        super().save_model(request, obj, form, change)
 
        # 发出任务,让celery worker重新生成首页静态页
        from celery_tasks.tasks import generate_static_index_html
        generate_static_index_html.delay()
 
        # 清除首页的缓存数据
        cache.delete('index_page_data')
 
    def delete_model(self, request, obj):
        '''删除表中的数据时调用'''
        super().delete_model(request, obj)
        # 发出任务,让celery worker重新生成首页静态页
        from celery_tasks.tasks import generate_static_index_html
        generate_static_index_html.delay()
 
        # 清除首页的缓存数据
        cache.delete('index_page_data')
 
 
class GoodsTypeAdmin(BaseModelAdmin):
    pass
 
 
class IndexGoodsBannerAdmin(BaseModelAdmin):
    pass
 
 
class IndexTypeGoodsBannerAdmin(BaseModelAdmin):
    pass
 
 
class IndexPromotionBannerAdmin(BaseModelAdmin):
    pass
 
 
admin.site.register(GoodsType, GoodsTypeAdmin)
admin.site.register(IndexGoodsBanner, IndexGoodsBannerAdmin)
admin.site.register(IndexTypeGoodsBanner, IndexTypeGoodsBannerAdmin)
admin.site.register(IndexPromotionBanner, IndexPromotionBannerAdmin)
超详细Python教程——使用缓存 比较常见的解决缓存击穿的办法是使用互斥锁,简单的说就是在缓存失效的时候,不是立即去数据库加载数据,而是先设置互斥锁(例如:Redis中的setnx),只有设置互斥锁的操作成功的请求,才能执行查询从数据库中加载数据并写入缓存,其他设置互斥锁失败的请求,可以先执行一个短暂的休眠,然后尝试重新从缓存中获取数据,如果缓存还没有数据,则重复刚才的设置互斥锁的操作,大致的参考代码如下所示。当然,先更新数据库再删除缓存的做法在理论上也存在风险,但是发生问题的概率是极低的,所以不少的项目都使用了这种方式。 阅读详情

相关推荐

晶圆测试(wafer sort)全流程解析:从探针卡到良率统计的实战指南

本文详细解析了晶圆测试(wafer sort)的全流程,从探针卡选型到良率统计的实战指南。涵盖了12英寸先进制程产线的关键技术,包括探针卡系统、测试程序开发、产线自动化集成及数据分析,特别聚焦多站点并行测试的时序优化和接触阻抗异常排查,帮助工程师提升测试效率与准确性。

weixin_29279153的博客 731

Django中如何使用WebSocket实时更新数据?

在Django中使用WebSocket实时更新数据,可以通过使用第三方库Django Channels实现。Django Channels是基于WebSocket的实时通信框架,它使得Django应用可以处理实时的、异步的任务。这样就可以通过WebSocket实时更新数据了。在Django中,每当有数据更新时,可以在视图中将数据发送给WebSocket连接,然后前端页面接收到消息后进行相应的数据更新。

1343

ROS专栏—基于STM32F103的INA219电源数据采集

文章主要记录了stm32f103对ina219的数据采集

热爱生活、奋斗前行 2354

深入探索 Django Channels

随着 Web 应用的发展,实时功能如即时消息、实时通知等变得越来越重要。Django Channels 是 Django 的一个扩展,它使得在 Django 中构建实时功能变得可能。本文将深入探讨 Django Channels 的核心概念、架构以及如何实现一个实时应用。

Rocky006的博客 950

Dell Precision 7920 Tower开机点不亮?别慌,看电源灯闪烁密码快速定位故障(附BIOS恢复指南)

本文详细解析了Dell Precision 7920 Tower工作站开机点不亮时的电源灯闪烁密码,帮助用户快速定位故障。从内存问题到BIOS恢复,再到CPU配置错误,提供了全面的诊断和修复指南,并附有实用的维护建议和工具推荐。

weixin_30892037的博客 486

SpringBoot Redis入门(一)——redis、Lettuce、Redisson使用

Lettuce是SpringBoot自带的Redis客户端,性能比Redis要好, 是线程安全的,支持同步编程,异步编程,响应式编程,自动重新连接,主从模式,集群模块,哨兵模式Redisson 是一个在 Redis 的功能基础上实现的 Java 驻内存数据网格客户端。实现了分布式和可扩展的 Java 数据结构,提供很多分布式相关操作服务,例如分布式锁,分布式集合,可通过 Redis 支持延迟队列。

朗朗的博客 3834

Python的Django实现Channel的Websocket实时聊天和后台主动推送

前言 如果只是想在服务器中和前端建立好websocket通道,然后服务器主动推送数据给前端的需求的话,其实只要dwebsocket就好了,为什么我要大动干戈去做channel呢??? 主要是我用了Python3和Django2的版本,这两个大版本更新后都不能再使用dwebsocket,一使用就出错。。。所以我只能下载channel来做全双工的通信了。 以下代码的软件环境 Python3+ Django2+ Channel3+ 先来看一下最终的效果吧 开始聊天,输入消息并点击

qq_38680405的博客 3861

运维系列【仅供参考】:微信版本过低 使用CheatEngine绕过

微信版本过低 使用CheatEngine绕过

weixin_54626591的博客 2135

dwebsocket实现后端数据实时刷新

django系统中dwebsocket实现进度条等相关效果

laoli815的博客 1120

五十天精通硬件设计第6天-放大器知识及选型

运算放大器(Operational Amplifier,简称运放)是一种高增益的直流耦合差分放大器,广泛应用于信号处理、滤波、比较、积分、微分等电路中。

whm128的博客 596

基于CNN的三相故障识别算法及实现(Matlab)

通过预处理数据、构建CNN模型、训练与评估模型等步骤,我们可以准确快速地识别三相故障。现代电力系统中,三相故障是一种常见的故障情况,可以导致电网中断、设备损坏甚至火灾等严重后果。本文将介绍基于卷积神经网络(CNN)的三相故障识别算法,并提供Matlab源代码实现。首先,将原始信号分为训练集和测试集。然后,对输入信号进行归一化处理,确保数据在合适的范围内。CNN适用于处理二维数据,所以我们可以将输入信号看作是时间序列数据和特征(如电压、电流等)的二维矩阵。在开始之前,我们需要一个包含正常和故障样本的数据集。

学习使你进步。 384

django 刷新缓存_django 使用redis进行页面数据缓存和更新缓存数据

转自:https://blog.youkuaiyun.com/xiaohuoche175/article/details/89304601在开发过程中会遇到一些页面的数据是很长时间才进行更新的,不使用缓存的情况下,用户每次访问这些都需要先去数据库中获取这些数据,当访问量较大时,这样获取数据的方式就会降低页面的访问速度,影响效率,这时就可以使用redis将这些数据保存起来,通过判断是否生成过获取以及是否更新过数...

weixin_39900286的博客 610

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

django 使用redis进行页面数据缓存和更新缓存数据

转自:https://blog.youkuaiyun.com/xiaohuoche175/article/details/89304601 在开发过程中会遇到一些页面的数据是很长时间才进行更新的,不使用缓存的情况下,用户每次访问这些都需要先去数据库中获取这些数据,当访问量较大时,这样获取数据的方式就会降低页面的访问速度,影响效率,这时就可以使用redis将这些数据保存起来,通过判断是否生成过获取以...

weixin_30426065的博客 142

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

使用缓存django、redis

(留存备忘,转自author:骆昊) 目录 Django项目接入Redis 为视图提供缓存服务 缓存相关问题 通常情况下,Web应用的性能瓶颈都会出现在关系型数据库上,当并发访问量较大时,如果所有的请求都需要通过关系型数据库完成数据持久化操作,那么数据库一定会不堪重负。优化Web应用性能最为重要的一点就是使用缓存,把那些数据体量不大但访问频率非常高的数据提前加载到缓存服务器中,这又是典型的空间换时间的方法。通常缓存服务器都是直接将数据置于内存中而且使用了非常高效的数据存取策略(哈希存储、键值对方式

Alocus的博客 839

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

django 学习笔记 使用 redis 缓存加快页面的响应速度-附一个简单的实例

前言:「redis」基于内存的数据库,响应速度到远远快于基于硬盘的「mysql」,使用方式是:直接从「redis」中读取数据,如果「redis」中没有我们需要的数据或者数据更新过,则从「mysql」中读取数据,加载到「redis」中,在将数据返回到前端页面。数据的第一次查询和加载会慢一点,但后面会快很多。 「redis」的配置 「redis」官方并不支持「windows」操作系统,需要通过「G...

yzmumu的博客 1574

redis | Django小项目之Mysql数据库和Redis缓存的应用

{k.decode():v.decode() for k,v in data.items()}:创建一个新字典 new_data,其键和值都是解码后的字符串。k.decode():将键 k 从字节字符串解码为普通字符串。data.items():获取 data 字典的键值对项,返回一个迭代器,每个项是一个元组 (key, value)。v.decode():将值 v 从字节字符串解码为普通字符串。new_data:是解码后的新字典,可以用于需要普通字符串键和值的场合。修改个人信息 返回 并从新访问。

HG0724的博客 1714

django 刷新缓存_Django页面数据的缓存与使用的具体方法

为什么要使用缓存?一个动态网站的基本权衡点就是,它是动态的。 每次用户请求页面,服务器会重新计算。从开销处理的角度来看,这比你读取一个现成的标准文件的代价要昂贵的多使用缓存,将多用户访问时基本相同的数据先缓存起来;这样当用户访问页面的时候,不需要重新计算数据,而是直接从缓存里读取,避免性能上的开销。使用Redis数据库使用redis数据库存储缓存,首先redis是key-value类型的数据库,N...

weixin_31916045的博客 852

Python 框架学习 Django篇 (十) Redis 缓存

既然 Hash 本身就是一个字典,我们通常还会把整个用户表都直接放入一个hash里面可以给这个hash对应的对象 起一个key名为 usertable#添加表数据hmset usertable u2001 id:2001|level:10|coin:1977|name:张三hmset usertable u2002 id:2002|level:13|coin:1927|name:李四#查询表数据。

默子昂 2514

Python web-Django 配置使用Redis作为后端缓存

Python web-Django 配置使用Redis作为后端缓存 本文主要介绍了在Django框架中,设置Redis作为后端缓存数据的方式 1. 为什么要用缓存? 对于动态网站来说,对于用户每次的请求,web服务器都会进行各种计算。 就拿网站首页来说,我要做的处理包括,对于/index,路由到匹配的视图函数,查询首页涉及到的数据表,并将查询结果封装成上下文给到模板,模板里再进行处理,渲染。 这就...

北邮Renyi的博客 1399

【Django实现高并发③】——Django缓存框架之设置缓存:数据库缓存,文件系统缓存

咱们接着看redis后面的内容。

weixin_73582152的博客 1621

Django | 页面数据的缓存与使用

为什么要使用缓存? 一个动态网站的基本权衡点就是,它是动态的。每次用户请求页面,服务器会重新计算。从开销处理的角度来看,这比你读取一个现成的标准文件的代价要昂贵的多 使用缓存,将多用户访问时基本相同的数据先缓存起来;这样当用户访问页面的时候,不需要重新计算数据,而是直接从缓存里读取,避免性能上的开销。 使用Redis数据库 使用redis数据库存储缓存,首先redis是key-...

dianmoucao4860的博客 200

Web开发:使用缓存

结合自身经验和内部资料总结的Python教程,每天3-5章,最短1个月就能全方位的完成Python的学习并进行实战开发,学完了定能成为大佬!加油吧!卷起来!《Python全栈教程(0基础)》

ml202187的博客 1526

Django 缓存系统优化:Redis 缓存与页面片段缓存的结合使用

此方案通过 Redis 的高效内存管理和片段缓存的精细控制,可降低 50% 以上数据库负载,适合电商详情页、新闻列表等高并发场景。在 Django 中,结合 Redis 缓存和页面片段缓存可显著提升性能。

2501_93893639的博客 449
上一篇: scrapy遇到Couldn't bind: 24: Too many open files.错误的解决
下一篇: python–multiprocessing多进程总结
sxzshushu
博客等级 码龄9年 22粉丝 18原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值