对于非经常更新的服务器数据,若每次都从硬盘读取一次,会浪费服务器资源、拖慢响应速度,而且数据更新频率较高,服务器负担比较大。若保存到数据库,还需要额外建立一张对应的表存储数据。一个更好的方法是在Django中使用Redis进行缓存,下面通过本文给大家介绍Django使用redis配置缓存的方法。
前言动态网站的基本权衡是,它们是动态的。每次用户请求页面时,Web服务器都会进行各种计算 - 从数据库查询到模板呈现再到业务逻辑 - 以创建站点访问者看到的页面。从处理开销的角度来看,这比标准的文件读取文件系统服务器要耗时多了。对于大多数Web应用程序来说,这种开销并不是什么大问题。因为大多数Web应用程序只是中小型网站,没有拥有一流的流量。但对于中到高流量的站点,尽可能减少开销是至关重要的,这就是缓存的用武之地。缓存某些内容是为了保存昂贵计算的结果,这样就不必在下次执行计算。 Django框架带有一个强大的缓存系统,可以保存动态页面,因此不必为每个请求计算它们。Django提供不同级别的缓存粒度:可以缓存特定视图的输出,也可以只缓存页面中难以生成的部分或者可以缓存整个站点。 Redis是一个内存数据库(现在已经支持内存数据持久化到硬盘当中,重新启动时,会自动从硬盘进行加载),由于其性能极高,因此经常作为中间件、缓存使用。
django应用redis缓存django中安装第三方库,使用如下命令
1.settings配置首先,我们在settings.py中配置如下代码
2.全站缓存2.1 全站缓存的2个中间件
FetchFromCacheMiddleware :从缓存中读取数据缓存状态为200的GET和HEAD请求的响应(除非响应头中设置不进行缓存)
对具有不同查询参数的相同URL的请求的响应被认为是各自不同的页面,并且被分别单独缓存。
该中间件会使用与对应的GET请求相同的响应头来回答HEAD请求,即可以为HEAD请求返回缓存的GET响应。
UpdateCacheMiddleware :将数据更新到缓存中该中间件会自动在每个响应中设置几个headers:
设置Expires为当前日期/时间 加上 定义的CACHE_MIDDLEWARE_SECONDS值,GMT时间
设置响应的Cache-Control的max-age,值是定义的CACHE_MIDDLEWARE_SECONDS值。
如果视图设置了自己的缓存时间(即设置了Cache-Control 的max age),那么页面将被缓存直到到期时间,而不是CACHE_MIDDLEWARE_SECONDS。 如果USE_I18N设置为True,则生成的缓存key将包含当前语言的名称,这样可以轻松缓存多语言网站,而无需自己创建缓存密钥。 如果 USE_L10N设置为True 并且 USE_TZ被设置为True,缓存key也会包括当前语言在settings的中间件中设置:
注意:UpdateCacheMiddleware必须是第一个中间件,FetchFromCacheMiddleware必须是最后一个中间件
2.2 全站缓存的必填设置
将以下必须设置添加到Django的settings文件中
配置解释如下:
CACHE_MIDDLEWARE_ALIAS:用于存储的缓存别名 CACHE_MIDDLEWARE_SECONDS:每个页面应缓存的秒数 CACHE_MIDDLEWARE_KEY_PREFIX:用于生成缓存key的前缀,如果使用相同的Django安装在多个站点之间共享缓存,请将其设置为站点名称或此Django实例特有的其他字符串,以防止发生密钥冲突。如果你不在乎,请使用空字符串。2.3 全站缓存示例
接着我们在视图中写入如下函数:
我们打开浏览器访问127.0.0.1/redis/,多次访问该url,发现时间戳不会改变,这是因为我们在配置中设置了缓存时间为1个小时。 我们可以打开浏览器的网络请求中查看response header,查看max_age和Expires,如下图
我们会发现响应头中已经有了缓存的时间,说明我们缓存配置成功了
3.视图函数缓存一般情况下,我们不会使用全局缓存,因为全局缓存,只要服务器返回状态码是200,他都会将其缓存下来,这样会影响性能,所以我们一般都会使用视图缓存,针对某个视图,需要进行缓存,则使用缓存。
3.1通过装饰器cache_page
cache_page除了默认的timeout参数外,还有两个可选的关键字参数
cache,示例代码:@cache_page(60 * 15, cache="special_cache"), 该cache指向settings中配置的缓存的名称,默认是"default"
key_prefix:缓存key的前缀,与CACHE_MIDDLEWARE_KEY_PREFIX功能相同
如果多个url指向同一个视图函数,会为每个url建立一个单独的缓存,例如:
/view_cache/1/和/view_cache/2/请求会分别进行缓存
3.2通过urls中配置cache_page
在URLconf中指定视图缓存,而不是在视图函数上硬编码装饰器,可以进一步解耦缓存和视图函数之间的关系,使用起来更灵活
以上2种方式作用是一样的,这里我们更加推荐3.2这种写法
4.低级缓存有时我们不想缓存整个页面数据,而只是想缓存某些费时查询并且基本不会改变的数据,可以通过一个简单的低级缓存API实现,该API可以缓存任何可以安全pickle的Python对象:字符串,字典,模型对象列表等
django.core.cache.caches
说明:
可以通过CACHES类似字典一样的方式访问settings中配置的缓存,在同一个线程中重复请求相同的别名将返回相同的对象 如果指定的myalias不存在,将引发 InvalidCacheBackendError 为了线程安全性,为会每个线程返回缓存的不同实例 作为快捷方式, 默认缓存(default)可以使用 django.core.cache.cache :django.core.cache.cache
实战案例
首先创建个common文件夹,然后在文件夹下面创建cache_helper.py文件,写入如下代码
然后配置url路径,如下
最后在视图中,写入2个函数
现在我们打开浏览器,访问127.0.0.1/redis/low_level_cache/,我们会发现,浏览器不会马上响应,而是等待了3秒,因为我们代码中模拟等待了3秒,而且我们是第一次访问,没有缓存,当第二次访问时,就立马响应了,原因是此时已经有了缓存
5.session缓存在settings.py文件中,配置如下代码即可
以上就是Django使用redis配置缓存的详细内容,更多关于redis配置缓存的资料请关注七叶笔记其它相关文章!