Code前端首页关于Code前端联系我们

Django项目缓存优化如何进行?

terry 2年前 (2023-09-24) 阅读数 55 #后端开发
如何提高Django项目缓存? ?服务器将请求发送到 Django 应用程序
→ Django 中间件处理请求
→ View View 处理
→ Model 类 Model 接收数据
❀ ♶ → 中间件 再次返回
→ uWSGI服务器向Web服务器返回Response
→ Web服务器响应客户端的HTTP请求。

最耗时的两个环节是在视图中处理业务逻辑和从Models中获取数据(查询SQL)。对于相同目的的查询,即具有相同业务处理逻辑和SQL查询数据的查询,每次重复计算时都会执行每个查询,并且从硬盘而不是内存中读取数据。

因此,使用缓存有以下优点:

  • 减少服务器负载
  • 避免重复计算
  • 提高系统性能

2. 如何缓存 当有传入请求时,先修复它如果有请求,将会被返回;如果没有问题,就会在数据库中分析并处理,然后将结果存储起来(用于下一次请求),然后返回。伪代码是这样解释的

Django项目缓存优化如何进行?

3. 缓存的类型

1. Memcached 效率最高,最快的缓存
2. Database caching 数据库缓存,这个指把数据缓存到数据表,比如你项目中使用的MySQL,就在MySQL中建表来专门缓存数据。不是指用Redis数据库
3. Filesystem caching 文件系统缓存,将缓存会把键值存储到独立的文件中去
4. Local-memory caching 使用系统内存缓存
5. Dummy caching (for development) 假缓存,只在开发过程中使用,以调试缓存接口,数据并没有真正缓存
6. Using a custom cache backend 自定义缓存后端,比如使用Redis

那么问题来了,我应该使用什么类型的缓存呢?

其实常用的只有两个:Memcached 或 Reids。一般来说,不需要考虑其他的。 Redis在中国应用广泛。它支持RDB和AOF两种持久化模式,并支持高级集群。技术和解决方案都很认真,比如Django高级实践课程https://coding.imooc.com/class/333.html,使用的是Redis缓存,存储业务数据,Django通道和Celery工作为四。不同的Redis库,甚至可以用作Redis集群。 Memcached是一种纯内存存储,不支持持久化或分配,但具有较高的内存管理能力。

4。缓存粒度分类

  1. 按站点缓存 缓存整个站点。只需要在项目中添加中间缓存键来设置配置,系统就会自动缓存整个站点
  2. 按视图缓存 缓存视图
  3. 模板片段缓存 Sombin 一个模板,例如 Django template继承base.html,通常是静态导航栏 那么问题来了,项目应该选择什么样的缓存粒度呢?

    缓存很简单,就看内容的变化。如果整个视图的数据不经常变化,则使用视图缓存,如果某些模板片段的数据不发生变化,则使用模板片段缓存等。因此,一个项目中存在多个缓存粒度。在Django高级实践课程https://coding.imooc.com/class/333.html中,使用了按视图缓存、模板片段缓存和低级缓存API。我给大家贴个PPT

    Django项目缓存优化如何进行?

    5。 Django缓存设置

    这里只讲Redis和Memcached,其他用得比较少的就不列出来了。请注意,系统上必须安装适当的缓存服务。 、在Django开发环境中,需要安装缓存服务相关的包(如django-redis或pymemcache)

    1. Memcache缓存设置

    最简单的,配置地址和端口,不必在本地机器上,也可以是不同网络域中的服务器或集群

    Django项目缓存优化如何进行?

    如果在本地机器上还可以使用 Unix Socket

    Django项目缓存优化如何进行?

    还可以使用多态服务器和不同的端口。

    Django项目缓存优化如何进行?

    1. Redis 缓存设置

    实战教程中 Redis 缓存配置截图、站点缓存数据

    Django项目缓存优化如何进行?

    Django Channels 通道层缓存

    Django项目缓存优化如何进行?

    Celery 缓存、broker 和作业执行结果 缓存的♶

    对于 Django 项目中存储的数据,我们在操作中删除或存储它不需要直接操作底层缓存数据,例如使用原生 Redis 或 Memcached 命令。你只需要Django提供的API缓存。当我们使用Django ORM时,不需要考虑底层数据库是MySQL、PostgreSQL还是SQLite,ORM声明是相同的。

    比如访问缓存Django项目缓存优化如何进行?

    使用缓存

    Django项目缓存优化如何进行?

    除了set()、get()之外,还有get_or_set()、get_many()、set_many()、delete()、delete_many()、清除(),触摸(),增量(),减量(),关闭()。你可以在官网查看文档并一一进行操作。请注意,某些 API 并非在所有 Django 版本中都可用。例如,cache.touch()仅在Django 2.1版本中可用。

    7。 Django缓存优化性能评估

    如果使用缓存,结果如何?可以衡量哪些指标?用什么仪器来测量呢?

    1. Django 调试工具栏

    django-debug-toolbar 是一个开源工具,可以在仪表板中显示 Django 请求/响应处理的详细信息,例如响应当前请求的 CPU 小时数、修改/标头的请求。信息、模板文件、静态文件、具体的SQL语句以及当前请求使用的执行时间等,仪表板上显示的任何信息都可以轻松定制。

    在Django高级实战课程-网站优化部分讲解django-debug-tooler时,用于评估缓存优化、ORM语句和SQL优化的结果,如图:

    右边一栏是django-debug工具的仪表板-

    Django项目缓存优化如何进行?

    这个页面总共有9个SQL请求,耗时8.62毫秒

    Django项目缓存优化如何进行?

    3次缓存命中,cache.get(),耗时0.91毫秒

    Django项目缓存优化如何进行?

    1. Jmeter压力测试

    django-debug-tool 供开发者从功能角度测试缓存效果。 Jmeter作为性能测试和压力测试的专用测试仪。实施项目缓存后,整体性能是否有所提升,系统在重负载情况下的稳定性如何?关于知识测试的细节我就不多说了。 Jemeter 提供免费 MOOC 课程。有兴趣的同学可以观看。

    好啦,今天的节目就到这里了。关于Django项目缓存,鼓励学生提问。我会把你们的问题和答案整理成文件,稍后发给群里。再见~

    用户提问:

    1. 缓存问题,更新数据时是先写数据库还是先写缓存?脏读问题,或者先清缓存再访问多线程。发现没有缓存,则重新加载缓存

    【答】优先考虑先更新数据库,删除缓存。关于缓存更新设计,当发生数据更新时,你是打算更新缓存数据还是使缓存数据失效(删除)?共有三种策略(不存在先更新缓存再更新数据库的策略)。由于DB和Cache属于两个不同的系统,所以运行不保证。必须包括“先做什么工作,后做什么工作”的问题。解决这个问题的准则是: 如果有分歧,谁应该先解决?任何人做对业务影响较小的事情都会先做。

    • 先清除缓存,然后从数据库更新数据文件并更新缓存,这只会生成。缺少缓存;
      在极少数情况下,请先清除缓存并刷新数据。后续的读操作会从数据库读取数据并更新缓存,这样只会造成缓存未命中;
    • 先更新数据,再更新缓存
      考虑两个线程一起写入T1和T2更新一些数据。 T1首先获取锁,更新数据库并释放锁。 T2 获取锁,更新数据库,然后释放锁。接下来,T2更新缓存值,T1更新缓存值。目前T1缓存中的数据为脏数据。
    • 先更新数据,并清除缓存
      当缓存数据读完后,读取T1的线程会错过缓存,然后再去数据库取数据。获取数据后,T2 写入线程启动。 T2先将数据写入数据库,然后清除缓存,然后T1将读取的旧数据填充到缓存中,这也会造成脏读。这种情况发生的概率很低,需要在缓存失效的同时进行读写操作。另外,写数据库会比读慢,而且数据库需要加锁,所以T1必须在T2之前进入数据库工作,在T2之后更新缓存。所有这些情况出现的概率都非常低。

    ··············

    Django项目缓存优化如何进行?

    1. 作者:杰克

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门