网站内容更新机制(《DjangoCache缓存系统》一节中是如何进行应用?|教程)

优采云 发布时间: 2022-03-08 22:06

  网站内容更新机制(《DjangoCache缓存系统》一节中是如何进行应用?|教程)

  在本教程的“Django Cache 缓存系统”部分,我们对 Django 缓存系统进行了基本的介绍,那么它在 Django 中是如何应用的呢?本节将详细介绍 Django 的缓存系统。从它的缓存机制、使用场景以及如何配置,本节你会知道什么是强缓存,什么是协商缓存。最后,我们将通过实例来解释缓存的使用。让我们正式开始本节内容。1.缓存机制的分类我们已经明白了Django为什么使用缓存,即避免服务器重复计算,通过同一个高频请求去数据库获取对应的数据,很容易导致导致服务器过载,以及服务器资源的浪费。姜戈 s 缓存 nice 部分解决了这个问题。1) MemCache缓存实现进程缓存,将views视图函数的返回值保存在内存或memcached中。如果用户在时限内发起对该视图的请求,将不再执行该视图中的视图。而是直接从内存或者Redis中获取之前缓存的数据返回给浏览器,这也是动态网站使用缓存的常见流程。

  这里需要注意的是,Memcached 不是 Django 自带的模块,需要自己安装、配置和启动服务;Memcached安装好后,使用Python来操作Memcached的依赖库,最常用的是python-memcached和pylibmc。但是现在还有一个选择,Redis,它是一个基于内存的缓存数据库,并且支持数据序列化,更加安全。我们推荐它。

  Redis的工作流程总结如下:首先检查客户端的请求数据是否在Redis中,如果有则直接返回请求数据,不对数据库进行任何操作;如果请求的数据不在Redis中,则检查数据库并将数据从数据库中获取到的数据返回给客户端,并在Redis中缓存一份数据;每次更新数据库时,都会更新Redis中的数据,以保证与数据库的一致性。

  2) Django 中的缓存机制 Django 提供了多种缓存机制。如果需要在settings.py文件中进行配置,Django提供了六种常用的缓存机制,如下:

  这里我们介绍几种缓存机制,即数据库缓存、文件缓存和本地内存缓存。让我们在settings.py文件中介绍它们是如何配置的。数据库缓存的配置如下:

  

#数据缓存机制

CACHES = {

'default': {

'BACKEND':'django.core.cache.backends.db.DatabaseCache', #数据库引擎

'TIMEOUT':300, #缓存超时时间(默认300秒,None表示永不过期,0表示立即过期)

'LOCATION': 'my_cache_table',

'MAX_ENTRIES': 3, # 当前最大缓存数

'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即 1/CULL_FREQUENCY(默认3)

}

}

  这里最流行的步骤是创建缓存数据表,使用以下命令:

  python manage.py createcachetable my_cache_table

  使用基于本教程的数据库进行缓存其实很鸡肋,因为我们之所以使用缓存是为了减少数据库查询,但是如果企业环境中的数据库非常快速高效,那么可以使用这种机制,我们这里简单介绍一下它的基本配置。注意settings.py文件中各种缓存机制的配置几乎是一样的。文件系统缓存的配置如下:

  

#基于window

CACHES = {

'default': {

'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',

'LOCATION': 'c:/foo/bar', #若是 Linux 路径写为 /home/cnet/cachetest

}

}

  文件缓存机制也是 Django 提供给我们进行缓存的一种方法。不过,这种方法比数据库慢,但聊胜于无。当你无处可去时,为了达到缓存目的也可以使用。

  接下来,我们将介绍基于本地内存的最后一个缓存机制。我们都知道内存的交互读写速度是非常快的,所以内存资源也是相当宝贵的。也适合使用这种缓存机制。

  

# 此缓存将内容保存至内存的变量中

CACHES = {

'default':{

'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',

'LOCATION': 'unique-snowflake',#给缓存放置的内存区设置一个名字

}

}

  2. Django中缓存的使用方式在Django中,我们可以通过以下方式直接应用缓存。前两个是通过装饰器实现的,最后一个是通过模板标签实现的:

  它们的用法如下:

  

from django.views.decorators.cache import cache_page

@cache_page(60*30)#以秒为单位

def my_view(request):

...

  在 django.views.decorators.cache 中定义了一个装饰器 cache_page 来自动缓存视图响应结果。这个装饰器接受一个参数:以秒为单位的超时。在上面的例子中,my_view() 视图的结果会被缓存 30 分钟,也可以写成 60*30。在路由中使用缓存的格式如下:

  

from django.views.decorators.cache import cache_page

urlpatterns = [

path('foo/', cache_page(60)(my_view)),

]

  在模板中也可以使用缓存,也称为模板片段缓存,如下:

  

{% load cache %}

{% cache 500 bar request.user.username %}

.. bar for logged in user ..

{% endcache %}

  我们将在模板顶部添加 {% load cache %},它还需要以 {% endcache %} 结尾。模板标签 {% cache %} 会将标签块中收录的内容缓存一段时间。它至少需要两个参数:缓存时间(以秒为单位)和要缓存的片段的名称(bar)。

  3. Django缓存的示例应用1) 在视图函数中使用装饰器通过以上的讲解,我们对Django缓存机制和实现方法有了深入的了解。让我们通过一个简单的例子来测试它,看看它是如何应用的。我们通过获取当前时间戳来证明缓存机制的存在。

  

#在缓存有效时间内不会阻塞,直到缓存过期重新阻塞3秒

@cache_page(60) #缓存有效时间60s

def test_cache(request):

t1=time.time() #得到当前时间戳

time.sleep(3) #阻塞三秒

html='t1 is %s'%(t1)

return HttpResponse(html)

  配置路由映射关系,然后访问 127.0.0.1:8000/index/test_cache ,发现第一次请求会阻塞三秒,然后请求页面在缓存期间。无需阻塞,直到缓存过期重新阻塞。

  我们可以通过谷歌浏览器F12查看它的响应头,其中Cache-Control:max-age=60表示最大过期时间60s,是HTTP1.1的乘积,另外一个Expires同表示过期时间,但属于 HTTP1.0 时代,前者可视为对后者的补充。2) 在路径中使用 cache_page() 我们也可以在 url 中使用缓存装饰器,如下所示:

  使用此范例时,请记住从视图函数中删除装饰器。3) 在模板中实现分片缓存,编写如下视图函数和test_cache.html页面,如下图:

  

#视图函数

def test_time(request):

if request.method=='GET':

return render(request,'index/test_cache.html')

elif request.method=='POST':

t1 = time.time() # 得到当前时间戳

time.sleep(3) # 阻塞三秒

return render(request,'index/test_cache.html',locals())

  test_cache.html 模板页面如下所示:

  

{% csrf_token %}

{% load cache %}

{% cache 30 test %}

<p>我是缓存的 {{ t1 }}

{% endcache %}

我是没有缓存的{{ t1 }}

</p>

  配置好路由后,访问127.0.0.1:8000/index/test_time,点击提交按钮,你会发现缓存的t1时间戳只有30s后才有变化因为它在这 30 秒内读取缓存的模板片段内容。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线