来源:进击的coder

之前做了个爬虫案例平台,https://scrape.center/,具体文章在 原创丨发布一个爬虫案例平台,帮助爬虫初学者进行练手。

平台内我设计了非常多的网站,有服务端渲染、客户端渲染等,其中服务端渲染的页面大家可能爬取的频率比较高,时不时就会遇到被爬挂的情况。

比如这个网站:https://ssr1.scrape.center/,当访问频率高的时候,甚至我后端开了 20 个 Pod 也承受不来,大家并发量有点猛啊。

这个后端是用 Django 写的,而且这个网站的数据不怎么更新,索性再加个 Cache 吧,在 Django 中最高效的 Cache 当属 Memcached 了,本篇文章就来简单记录下 Django 对接 Memcached 的过程。

官方资料

千说万说都不如官方文档来的直接,首推官方文档:https://docs.djangoproject.com/en/3.1/topics/cache/。

然后后面就是我简单的笔记了。

依赖库

首先需要安装个依赖库,这里用的是 python-memcached,可以使用 pip 来安装:

pip3 install python-memcached

由于我使用的是 Docker,所以就把它写到 requirements.txt 里面了。

配置

另外还需要在 settings.py 里面配置一下,内容如下:

CACHES = {'default': {'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache','LOCATION': 'cache:11211',}
}

这里 LOCATION 是需要一个 Memcached 服务,运行在 11211 上面。

另外还需要开启两个中间件:

MIDDLEWARE = ['django.middleware.cache.UpdateCacheMiddleware',...'django.middleware.cache.FetchFromCacheMiddleware',
]

这里要加两个中间件,一个在最前面,一个在最后面,顺序不能换,中间的是之前配置的其他中间件。

Docker-Compose

OK,接下来就是使用 Docker 启动了,这里 Docker-Compose 里面就需要增加一个 Memcache 服务,配置如下:

version: '3'
services:ssr1-backend:container_name: 'scrape-ssr1-backend'restart: alwaysbuild: ./backendimage: 'scrape-ssr1-backend'ports:- '8000:8000'environment:...cache:image: memcachedports:- '11211:11211'entrypoint:- memcached- -m 64

这里主要是 cache 的配置,需要加上端口映射和入口参数,这里内存大小设置为 64M。

Kubernetes

我的部署使用的是 Kubernetes,所以对应的 yaml 文件也需要更改了,配置更改如下:

apiVersion: v1
items:- apiVersion: v1kind: Servicemetadata:annotations:kompose.cmd: kompose -f docker-compose.yml -o kubernetes.yml convertkompose.version: 1.20.0 ()creationTimestamp: nulllabels:io.kompose.service: ssr1-backendname: ssr1-backendnamespace: scrapespec:ports:- name: "8000"port: 8000targetPort: 8000selector:io.kompose.service: ssr1-backendstatus:loadBalancer: { }- apiVersion: apps/v1kind: Deploymentmetadata:annotations:kompose.cmd: kompose -f docker-compose.yml -o kubernetes.yml convertkompose.version: 1.20.0 ()creationTimestamp: nulllabels:io.kompose.service: ssr1-backendname: ssr1-backendnamespace: scrapespec:replicas: 20revisionHistoryLimit: 1strategy: { }selector:matchLabels:io.kompose.service: ssr1-backendtemplate:metadata:annotations:kompose.cmd: kompose -f docker-compose.yml -o kubernetes.yml convertkompose.version: 1.20.0 ()creationTimestamp: nulllabels:io.kompose.service: ssr1-backendspec:containers:- env:- name: APP_ENVvalue: production- name: MEMCACHED_HOSTvalue: ssr1-cacheimage: germey/scrape-ssr1-backend:${TAG}name: scrape-ssr1-backendports:- containerPort: 8000resources: { }restartPolicy: Alwaysstatus: { }- apiVersion: v1kind: Servicemetadata:annotations:kompose.cmd: kompose -f docker-compose.yml -o kubernetes.yml convertkompose.version: 1.20.0 ()creationTimestamp: nulllabels:io.kompose.service: ssr1-cachename: ssr1-cachenamespace: scrapespec:ports:- name: "11211"port: 11211targetPort: 11211selector:io.kompose.service: ssr1-cachestatus:loadBalancer: { }- apiVersion: apps/v1kind: Deploymentmetadata:annotations:kompose.cmd: kompose -f docker-compose.yml -o kubernetes.yml convertkompose.version: 1.20.0 ()creationTimestamp: nulllabels:io.kompose.service: ssr1-cachename: ssr1-cachenamespace: scrapespec:replicas: 1revisionHistoryLimit: 1strategy: { }selector:matchLabels:io.kompose.service: ssr1-cachetemplate:metadata:annotations:kompose.cmd: kompose -f docker-compose.yml -o kubernetes.yml convertkompose.version: 1.20.0 ()creationTimestamp: nulllabels:io.kompose.service: ssr1-cachespec:containers:- image: memcachedname: scrape-ssr1-cacheports:- containerPort: 11211resources: { }restartPolicy: Alwaysstatus: { }
kind: List
metadata: { }
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:name: ingress-ssr1namespace: scrapeannotations:nginx.ingress.kubernetes.io/ssl-redirect: "true"nginx.ingress.kubernetes.io/rewrite-target: /
spec:tls:- hosts:- ssr1.scrape.centersecretName: tls-wildcard-scrape-centerrules:- host: ssr1.scrape.centerhttp:paths:- backend:serviceName: ssr1-backendservicePort: 8000path: /

注意这里我给 Django 后端增加了一个环境变量,叫做 MEMCACHED_HOST,所以在 Django 中,我们可以通过环境变量来读取 Memcached 的 Host,当然端口也可以类似设置,不过端口我就直接写死了,配置更改如下:

CACHES = {'default': {'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache','LOCATION': os.getenv('MEMCACHED_HOST') + ':11211',}
}

OK,这样改完之后重新部署就好了。

部署之后我直接将 Pod 降到了 2 个,第一次访问速度可能稍慢,但是一旦加载出来之后,该页面就会被缓存下来,后续访问速度就只有两三百毫秒了,测速如下:

简单测速结果

网址在这:https://ssr1.scrape.center/,大家可以来爬爬试试吧。

作者:崔庆才

排版:崔庆才

------- End -------

点右下角「在看」与转发

是对我们最大的支持

特别推荐下公众号「价值前瞻」,分享读书、成长和投资思考,欢迎来串门。

回复「书单」 可获取精选书单一份,包括《如何阅读 一本书》、《巴菲特之道》、《金字塔原理》、高瓴张磊的《价值》、《投资最重要的事》、《戴维斯王朝》等书籍的笔记内容或思维导图

价 值 前 瞻

做一个有远见的人

扫码关注,查看更多内容

如何大幅提高 Django 网站加载速度相关推荐

  1. 如何优化网站页面提高网页的加载速度

    网站要想加载快无非就是减少http请求次数,下面说一下具体做法: 1:字符集声明 如果<head>部分未定义字符集,将增加页面渲染次数,速度减慢. 2:Meta信息完善程度 建议网站met ...

  2. 网页速度很慢优化方案:如何提高网页加载速度,提升网站加载速度

    网站加载速度的快慢,直接影响用户的去留.这里为大家持续更新我的经验,帮你解决网页速度很慢,慢在哪里,该怎么优化的问题.希望对你有所帮助! 1.  网站空间要好:网站需要一个稳定的服务器或者虚拟机,可以 ...

  3. 网站加载速度 优化_您肯定要优化网站的加载速度。 这是如何做。

    网站加载速度 优化 Do you remember this iconic scene from a very famous Star Wars Parody? 您还记得著名的<星球大战> ...

  4. 一个大图切成几个小图加载速度更快_CSS精灵图技术(提高页面的加载速度)

    未来2088 2019-11-28 18:00:00 哈喽大家好,我是作者"未来",本期分享的内容是Web前端系列课程,本系列总共29个阶段,坚持学习3个月蜕变为Web前端高手哦! ...

  5. 网站加载速度影响因素以及如何增强

    网站打开速度是用户体验和 SEO 营销的要点之一.许多研究已经证明,当网页加载时间超过 3 秒,超过 50% 的用户会关闭网页.网站打开过慢会造成负面用户体验,增加跳出率,导致你的网站在搜索结果页的位 ...

  6. 网站加载速度慢的原因

    想借这篇博客总结一下~ 1.本机问题 ①网速问题加载慢 ②本机的硬件配置低(CPU或者是内存被占满的时候,打开网页很是会很慢的) 2.连接过程 ①DNS解析慢(在http请求的过程中,域名解析和建立连 ...

  7. 提高页面的加载速度的方法——精灵图和字体图标

    1. 精灵图 1.1 为什么需要精灵图 一个网页中往往会应用很多小的背景图像作为修饰,当网页中的图像过多时,服务器就会频繁地接收和发送请求图片,造成服务器请求压力过大,这将大大降低页面的加载速度. 为 ...

  8. 怎样提高图片的加载速度?

    各位大佬,我想请教一下,再不改变服务器带宽的情况下,资源代下载从技术上如何提高图片的加载速度呀. 硬件是上限,你最多做静态分离,CDN,专门的事情丢给专门的工具来做. 哦哦哦,请问下2M的带宽,加载3 ...

  9. 可以用到项目的优化网站加载速度方案

    1.合并图标,减少网络请求 合并图标是减少网络请求的常见的优化手段,网页中的小图标特征是体积小.数量多,而浏览器同时发起的并行请求数量又是有限制的,所以这些小图标会严重的影响网页的加载速度,阻碍关键内 ...

最新文章

  1. 总结调试过程中怎么去抓log
  2. C语言 —— sprintf()函数
  3. IPC进程间通信 D-Bus(Desktop Bus)快速入门(以libdbus-glib库为例)
  4. ADS1220 使用FPGA调试
  5. 字段合并_报表数据合并困难?找VBA!数据不标准字段缺失如何合并?找VBA
  6. 03 Python爬虫之Requests网络爬取实战
  7. 201521145048 《Java程序设计》第3周学习总结
  8. INT 21H 指令说明及使用方法
  9. 单片机IC卡读取开题报告_基于单片机实现IC卡读卡器
  10. 网络安全-wifi攻防
  11. 如何才能让自己成为一个自律的人?
  12. 刷机!刷机!!刷机!!!
  13. 鼠标手势插件--smartUp
  14. 如何加密文件及文件夹
  15. 微信点餐系统中出现的小问题记录
  16. 小菜成长记---【proxy 代理模式 ---西门庆干潘金莲——王婆做代理】
  17. 微信小程序拼团功能之表结构
  18. 页面ifream固定分辨率展示并适配所有分辨率方法
  19. java中引用数组元素时 数组下标可以是_引用数组元素时,数组下标可以是( )...
  20. bimodal or multimodal data test and analysis in R

热门文章

  1. Pytorch基础学习(第一章-PyTorch基础概念)
  2. 华为Java机试题__转载
  3. 女生学java好还是c语言_C语言适合女生学吗。难吗?
  4. (新零售)商户网格化运营 - 阿里云RDS PostgreSQL最佳实践
  5. jsmap(桔色棉袄配什么颜色打底衫)
  6. matlab自动变量名,matlab中如何自动给变量命名?
  7. 微信小程序-全局分享、自定义分享
  8. 公告或通知的未读 设计(MySQL Redis)
  9. 解决react项目启动报错:error Couldn't find a package.json
  10. [PyTorch]手动实现logistic回归(只借助Tensor和Numpy相关的库)