Django 缓存框架浅析 + 内存分析
动态网站存在一个基本权衡是——它们是动态的。每次用户请求一个页面,web 服务器需要提供各种各样的计算——从数据库查询到模板渲染再到业务逻辑——最后生成页面呈现给用户。从处理开销的角度来看,这比读取文件的开销要高得多。
缓存是将一些需要经过大量计算的结果存储在一个指定区域中,避免再次访问时的重复计算(处理好缓存的失效时机,否则会破坏数据的实时性)。通俗的讲,缓存就是用空间换取时间的一种策略方案。
使用缓存(这里主要指后端缓存)有以下主要优势:
-
提升接口响应速度
-
降低主机的 CPU 资源消耗
Django 的缓存框架可以适配多种的缓存引擎,其应用层读写方式都是通过 KV 进行存取。对于 K 选择的正确性是一个重要的因素。如果 K 中不能照顾到接口的所有可变情况,那么很可能发生不同参数使用同一个缓存 V 的情况:
# /api/test?a=1&b=2&c=3
cache.set("/api/test_a_1_b_2", request) # k 中只存在 a b 两个变化量
# /api/test?a=1&b=2&c=4
cache.get("/api/test_a_1_b_2") # 此时取出的是 在访问/api/test?a=1&b=2&c=3时写入缓存中的相应数据,造成缓存错误命中。
引擎介绍
Memcached
Memcached 是一个完全基于内存的缓存服务器,是 Django 原生支持的最快、最高效的缓存类型。Memcached 以一个守护进程的形式运行,并且被分配了指定数量的 RAM。它所做的就是提供一个快速接口用于在缓存中添加,检索和删除数据。所有数据都直接存储在内存中,因此不会产生数据库或文件系统使用的开销。
setting.py 配置:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', # 使用 python-memcached 绑定
'LOCATION': '127.0.0.1:11211', # ip 是 Memcached 守护进程的 IP 地址,port 是运行 Memcached 的端口
}
}
## 多服务器缓存共享
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': [
'172.19.26.240:11211',
'172.19.26.242:11212',
'172.19.26.244:11213',
]
}
}
由于 Memcached 是基于内存的缓存,一旦服务器崩溃或者重启,存储在内存中的缓存将会丢失。