Django 缓存框架

Django 缓存框架

分类: django 490人阅读 评论(0) 收藏 举报
 
 

      动态网站的基本功能就在于, 没错, 它是动态的. 用户每次请求一个页面时, Web 服务器都要进行全面的计算 -- 从数据库查询到渲染业务逻辑 -- 直到生成最终展示的页面. 从服务器负载的角度来看,这远比仅仅从文件系统读取一个文件展示要占用的系统资源多得多.

对绝大多数网站应用程序来说, 这点负载不是大问题.绝大部分网站应用不是 washingtonpost.com 或 slashdot.org 这样繁忙; 它们通常是小规模-中等规模的,没有特别高的点击率. 但对大规模高点击率的站点来说, 就应该尽可能的降低WEB服务器的负载.

这正是需要缓存机制的原因.

建立缓存机制的目的就是在适当的时候省略掉计算步骤(再次访问时).下面用伪码来阐述该机制如何运作:

根据 URL 请求, 看看缓存中有没有该页面
如果缓存中有该页面:
    返回该页面
否则:
    生成该页面
    将该页面保存在缓存中(以备下次访问)
    返回这具生成的页面

Django 自带一个高效实用的缓存系统, 允许你保存动态页面, 这样就不必在每次请求时都通过计算生成新页面.为了使用上的方便, Django提供了不同层次的缓存模式: 你可以仅缓存指定 views 的输出, 也可以只缓存高计算量的的片段, 只要你愿意,你也可以缓存你的整个站点.

Django 与 "upstream" 缓存可以很好的协作, 就象 Squid(http://www.squid-cache.org/) 及 browser-based 缓存一样. 这些缓存方式, 你不能直接控制但可以通过 HTTP headers 来告知站点的哪些部分需要缓存及如何缓存.

设置缓存

缓存系统需要进行不太复杂的设置才可以工作. 也就是说你必须告诉它你的缓存数据要放在哪儿 -- 或者是数据库, 或者是文件系统, 或者干脆就放在内存里.这个选择对缓存的性能有着非常重大的影响.没错,某些缓存类型远比其它的快!

通过设置你的 settings 文件的 CACHE_BACKEND 设置来决定 cache 类型. 下面详细介绍该选项的所有可选值:

Memcached

这是 Django 缓存系统中最有效率的方式, Memcached 是完全的基于内存的缓存框架, 最初开发它来处理 LiveJournal.com 的高流量后来被 Danga Interactive 公司开源. 它通常用于象 Slashdot 及 Wikipedia 这样的站点以减少数据库检索, 它极大的提高了站点的性能.

Memcached 可以通过 http://danga.com/memcached/ 免费得到. 它以一个后台监视程序的方式运作, 使用分配给它的指定容量的内存. 它所做的就是提供一个接口 -- 一个 super-lightning-fast 接口 -- 添加,得到及删除缓存数据的接口.所有数据直接保存在内存中,不占用任何文件系统及数据库资源.

在安装了 Memcached 之后,你需要安装 Memcached 的 Python 绑定. 它是一个独立的 Python 模块, memcache.py, 可以通过ftp://ftp.tummy.com/pub/python-memcached/ 得到. 如果该 URL 无法访问, 就直接到 Memcached 的 Web 站点 (http://www.danga.com/memcached/), 然后通过 "Client APIs" 部分得到它的 Python 绑定.

要在 Django 中使用 Memcached , 设置 CACHE_BACKEND 为 memcached://ip:port/, 这里的 ip 是 Memcached 守护程序的 IP 地址, 而 port 则是 Memcached 进程使用的端口.

在下面这个例子里, Memcached 运行在 localhost (127.0.0.1) 的 11211 端口:

CACHE_BACKEND = 'memcached://127.0.0.1:11211/'

Memcached 的一个出色特性是它在多个服务器间共享缓存的能力. 要使用这个高级特性, 在 CACHE_BACKEND 中包含多个服务器的IP地址,地址间用分号分隔. 下面这个例子共享运行在 172.19.26.240 及 172.19.26.242 的 Memcached 实例, 这两个实例均使用 11211 端口:

CACHE_BACKEND = 'memcached://172.19.26.240:11211;172.19.26.242:11211/'

基于内存的缓存机制有一个缺点: 由于缓存数据保存在内存中, 当服务器崩溃时缓数据将会丢失.谁都知道内存不适合用来保存永久数据, 所以不应该依赖基于内存的缓存来作为你唯一的数据保存方式.实际上, 没有一种 Django 缓存后端适合保存永久数据 -- 他们之所以存在就是为了缓存这一个目的, 而不是永远储存数据 -- 我们在这里指出这一点是因为基于内存的缓存它比另外的方式更加临时化.

数据库缓存

要使用数据库来做为你的缓存后端, 首先要在你的数据库中建立一个缓存表. 运行下面的命令:

python manage.py createcachetable [cache_table_name]

...这里的 [cache_table_name] 是数据库中要创建的缓存表的名字.(你可以取任意的名字,只要不和已有的表重名就行).这个命令创建在数据库中创建一个适当结构的缓存表, Django 随后使用它来缓存你的数据.

在完成缓存表的创建之后, 设置 CACHE_BACKEND 为 "db://tablename/", 这里的 tablename 是缓存表的名字.下面这个例子里,缓存表的名是 my_cache_table:

CACHE_BACKEND = 'db://my_cache_table'

只要你有一个快速的,索引良好的数据库服务器, 数据库缓存就会极佳的运转.

文件系统缓存

要在文件系统中保存缓存数据, 在 CACHE_BACKEND 中使用 "file://" 缓存类型. 下面这个例子将缓存数据保存在 /var/tmp/django_cache 中, 设置如下:

CACHE_BACKEND = 'file:///var/tmp/django_cache'

注意 file: 之后是三个斜线而不是两个. 前两个是 file:// 协议, 第三个是路径 /var/tmp/django_cache 的第一个字符.

这个目录路径必须是绝对路径 -- 也就是说,它应该从你的文件系统的根开始算起.至于路径的最后是否加一个斜线, Django 并不在意.

要确保这个设定的路径存在并且 Web 服务器可以读写.继续上面的例子,如果你的服务器以 apache 用户身份运行, 确保目录 /var/tmp/django_cache 存在并且可以被用户 apache 读写.

本地内存缓存

如果你想要内存缓存的高性能却没有条件运行 Memcached, 可以考虚使用本地内存缓存后端. 这个缓存后端是多进程的并且线程安全. 要使用它,设置 CACHE_BACKEND 为 "locmem:///". 举例来说:

CACHE_BACKEND = 'locmem:///'

简单缓存(用于开发)

"simple:///" 是一个简单的,单进程的内存缓存类型. 它仅仅在进程中保存缓存数据, 这意味着它仅适用于开发或测试环境. 例子:

CACHE_BACKEND = 'simple:///'

虚拟缓存 (用于开发)

最后, Django还支持一种 "dummy" 缓存(事实上并未缓存) -- 仅仅实现了缓存接口但未实际做任何事.

This is useful if you have a production site that uses heavy-duty caching in various places but a development/test environment on which you don't want to cache. In that case, set CACHE_BACKEND to "dummy:///" in the settings file for your development environment. As a result, your development environment won't use caching and your production environment still will.

CACHE_BACKEND 参数

所有缓存类型均接受参数. 提供参数的方式类似查询字符串风格. 下面列出了所有合法的参数:

timeout
默认的缓存有效时间,以秒计. 默认值是 300 秒(五分钟).
max_entries
用于 简单缓存 及 数据库缓存 后端, 缓存的最大条目数(超出该数旧的缓存会被清除,默认值是 300).
cull_percentage

当达到缓存的最大条目数时要保留的精选条目比率. 实际被保存的是 1/cull_percentage, 因此设置 cull_percentage=3 就会保存精选的 1/3 条目上,其余的条目则被删除.

如果将 cull_percentage 设置为 0 则意味着当达到缓存的最大条目数时整个缓存都被清除.当缓存命中率很低时这会 极大的 提高精选缓存条目的效率(根本不精选).

这个例子里, timeout 被设置为 60:

CACHE_BACKEND = "memcached://127.0.0.1:11211/?timeout=60"

这个例子, timeout 设置为 30 而 max_entries 设置为 400:

CACHE_BACKEND = "memcached://127.0.0.1:11211/?timeout=30&max_entries=400"

非法的参数会被忽略.

缓存整个站点

设置了缓存类型之后, 最简单使用缓存的方式就是缓存整个站点. 在``MIDDLEWARE_CLASSES`` 设置中添加 django.middleware.cache.CacheMiddleware , 就象下面的例子一样:

MIDDLEWARE_CLASSES = (
    "django.middleware.cache.CacheMiddleware",
    "django.middleware.common.CommonMiddleware",
)

( MIDDLEWARE_CLASSES 顺序相关. 参阅下文中的 "Order of MIDDLEWARE_CLASSES")

然后,在 Django 设置文件中添加以下设置:

  • CACHE_MIDDLEWARE_SECONDS -- 每个页面被缓存的时间.
  • CACHE_MIDDLEWARE_KEY_PREFIX -- 如果缓存被同一个 Django 安装的多个站点共享, 在这里设置站点名字, 或者某些其它唯一的字符串, 以避免 key 冲突.如果你不介意,也可以使用空串.

缓存中间件缓存没有 GET/POST 参数的每个页面.另外, CacheMiddleware 自动在每个 HttpResponse 中设置一些 headers:

  • 当请求一个未缓存页面时,设置 Last-Modified header 到当前的日期时间.
  • 设置 Expires header 到当前日期时间加上定义的 CACHE_MIDDLEWARE_SECONDS.
  • 设置 Cache-Control header 为该页面的生存期 -- 该生存期也来自 CACHE_MIDDLEWARE_SECONDS 设置.

参阅 middleware documentation 了解中间件的更多信息.

缓存单个 view

Django 能够只缓存特定的页面. django.views.decorators.cache 定义了一个 cache_page 修饰符, 它能自动缓存该 view 的响应. 该修饰符的使用极为简单:

from django.views.decorators.cache import cache_page

def slashdot_this(request):
    ...

slashdot_this = cache_page(slashdot_this, 60 * 15)

或者, 使用Python 2.4 的修饰符语法:

@cache_page(60 * 15)
def slashdot_this(request):
    ...

cache_page 仅接受一个参数: 缓存有效期,以秒计. 在上面的例子里, slashdot_this() view 将被缓存 15 分钟.

底层缓存 API

某些时候, 缓存一个完整的页面不符合你的要求. 比如你认为仅有某些高强度的查询才有必要缓存其结果.要达到这种目的,你能使用底层缓存 API 来在任意层次保存对象到缓存系统.

缓存 API 是简单的. 从缓存模块 django.core.cache 导出一个由 CACHE_BACKEND 设置自动生成的 cache 对象:

>>> from django.core.cache import cache

基本的接口是 set(key, value, timeout_seconds) 和 get(key):

>>> cache.set('my_key', 'hello, world!', 30)
>>> cache.get('my_key')
'hello, world!'

timeout_seconds 参数是可选的,其默认值等于 CACHE_BACKEND 的 timeout 参数.

如果缓存中没有该对象, cache.get() 返回 None:

>>> cache.get('some_other_key')
None

# Wait 30 seconds for 'my_key' to expire...

>>> cache.get('my_key')
None

get() 可以接受一个 default 参数:

>>> cache.get('my_key', 'has expired')
'has expired'

当然还有一个 get_many() 接口, 它仅仅命中缓存一次. get_many() 返回一个字典,包括未过期的实际存在的你请求的所有键.:

>>> cache.set('a', 1)
>>> cache.set('b', 2)
>>> cache.set('c', 3)
>>> cache.get_many(['a', 'b', 'c'])
{'a': 1, 'b': 2, 'c': 3}

最后, 你可以使用 delete() 显式的删除键. 这是一个在缓存中清除特定对象的简便的方式:

>>> cache.delete('a')

就是这样. 缓存机制限制非常少: 你可以安全的缓存能被 pickled 的任意对象(key必须是字符串).

Upstream caches

到现在为止, 我们的目光仅仅聚焦在 你自己的 数据上. 在 WEB 开发中还有另外一种类型的缓存: "upstream" 缓存. 这是用户请求还未抵达你的站点时由浏览器实施的缓存.

下面是 upstream 缓存的几个例子:

  • 你的 ISP 会缓存特定页面, 当你请求 somedomain.com 的一个页面时, 你的 ISP 会直接发送给你一个缓存页.(不访问 somedomain.com ).
  • 你的 Django Web 站点可能建立在一个 Squid (http://www.squid-cache.org/) Web 代理服务器之后, 它会缓存页面以提高性能. 这种情况下,每个请求会先经 Squid 处理, 仅在需要时它会将请求传递给你的应用程序.
  • 你的浏览器也会缓存一些页面. 如果一个 WEB 页发送了正确的 headers, 浏览器会用本地(缓存的)拷贝来回应后发的同一页面的请求.

Upstream 缓存是一个非常有效的推进, 不过它也有相当不足之处: 很多 WEB 页基于授权及一堆变量, 而这个缓存系统盲目的单纯依赖 URL 缓存页面, 这可能会对不适当的用户泄露敏感信息.

举例来说,假设你使用一个 Web e-mail 系统, "inbox" 页的内容显然依赖当前登录用户. 如果一个 ISP 盲目的缓存了你的站点, 后来的用户就会看到前一用户的收件箱, 这可不是一件有趣的事.

幸运的是, HTTP 提供了一个该问题的解决方案: 用一系列 HTTP headers 来构建缓存机制以区分缓存内容, 这样缓存系统就不会缓存某些特定页.

使用 Vary headers

其中一个 header 就是 Vary. 它定义了缓存机制在创建缓存 key 时的请求 headers. 举例来说, 如果一个网页的内容依赖一个户的语言设置, 则该网页被告知 "vary on language."

默认情况, Django 的缓存系统使用请求路径创建 缓存 key -- 比如, "/stories/2005/jun/23/bank_robbed/". 这意味着该 URL 的每个请求使用相同的缓存版本, 不考虑用户代理的不同.(cookies 及语言特性).

因此我们需要 Vary .

如果你的基于 Django 的页面根据不同的请求 headers 输出不同的内容 -- 比如一个 cookie, 或语言, 或用户代理 -- 你会需要使用 Vary header 来告诉缓存系统这个页面输出依赖这些东西.

要在 Django 中做到这一步, 使用 vary_on_headers view 修饰符,就象下面这样:

from django.views.decorators.vary import vary_on_headers

# Python 2.3 syntax.
def my_view(request):
    ...
my_view = vary_on_headers(my_view, 'User-Agent')

# Python 2.4 decorator syntax.
@vary_on_headers('User-Agent')
def my_view(request):
    ...

这样缓存系统 (比如 Django 自己的缓存中间件) 会为不同的用户代理缓存不同的版本的页面.

使用 vary_on_headers 修饰符的优势在于(与人工设置 Vary header 相比:使用类似 response['Vary'] = 'user-agent')修饰符会添加到 Vary header (可能已存在) 而不是覆盖掉它.

你也可以传递多个 header 给 vary_on_headers():

@vary_on_headers('User-Agent', 'Cookie')
def my_view(request):
    ...

由于多个 cookie 的情况相当常见, 这里有一个 vary_on_cookie 修饰符. 下面两个 views 是等价的:

@vary_on_cookie
def my_view(request):
    ...

@vary_on_headers('Cookie')
def my_view(request):
    ...

需要注意一点传递给 vary_on_headers 的参数是大小写不敏感的. "User-Agent" 与 "user-agent" 完全相同.

你也可以直接使用一个帮助函数, django.utils.cache.patch_vary_headers:

from django.utils.cache import patch_vary_headers
def my_view(request):
    ...
    response = render_to_response('template_name', context)
    patch_vary_headers(response, ['Cookie'])
    return response

patch_vary_headers 接受一个 HttpResponse 实例作为它的第一个参数及一个 header 名字的列表或tuple作为第二个参数.

要了解 Vary headers 的更多信息, 参阅 official Vary spec.

控制缓存: 使用其它 headers

缓存的另一个问题是数据的私密性及瀑布缓存模式下数据保存到哪里.

用户经常要面对的有两种缓存: 他自己的浏览器缓存(私人缓存) 及站点提供的缓存(公开缓存).一个公开缓存用于多用户情况, 其内容由另外的人控制. 这造成了数据的私密性问题: 你当然不想你的银行帐号保存在公共缓存里. 因此应用程序需要一种方式告诉缓存系统哪些东西是私密的,哪些则是公开的.

解决方案就是声明某个页面的缓存是 "私密的". 在 Django 中, 使用 cache_control view 修饰符. 例子:

from django.views.decorators.cache import cache_control
@cache_control(private=True)
def my_view(request):
    ...

这个修饰符会在幕后谨慎的发送适当的 HTTP header 发避免上面的问题.

还有一些其它的方式控制缓存参数. 举例来说,HTTP 允许应用程序做以下事:

  • 定义一个页面被缓存的最大时间.
  • 指定缓存是否需要总是检查新版本, 如果没有变化则仅传送缓存版本. (某些缓存即使服务器端页面变化也仅传递缓存版本--仅仅因为缓存拷贝尚未到期).

在 Django 中, 使用 cache_control view 修饰符指定缓存参数.在这个例子里 cache_control 通知缓存每次检验缓存版本, 直到 3600 秒到期:

from django.views.decorators.cache import cache_control
@cache_control(must_revalidate=True, max_age=3600)
def my_view(request):
    ...

所有合法的 Cache-Control HTTP 指令在 cache_control() 中都是合法的. 下面是完整的指令列表:

  • public=True
  • private=True
  • no_cache=True
  • no_transform=True
  • must_revalidate=True
  • proxy_revalidate=True
  • max_age=num_seconds
  • s_maxage=num_seconds

要了解 Cache-Control HTTP 指令的细节,参阅 Cache-Control spec.

(注意缓存中间件已经通过设置中的 CACHE_MIDDLEWARE_SETTINGS 的值设定了缓存 header 的 max-age. 如果你在 cache_control 修饰符中使用了自定义的 max_age , 修饰符中的设置将被优先使用, header 值会被正确的合并)

其它优化

Django 自带了一些中间件以帮助你提高站点性能:

  • django.middleware.http.ConditionalGetMiddleware 添加了有条件GET的支持. 它利用了 ETag 及 Last-Modified headers.
  • django.middleware.gzip.GZipMiddleware 为支持 Gzip 的浏览器对发送内容进行压缩(所有流行浏览器均支持).

MIDDLEWARE_CLASSES 顺序

如果你使用了 CacheMiddleware, 在 MIDDLEWARE_CLASSES 设置中使用正确顺序非常重要. 由于缓存中间件需要知道哪些 headers 由哪些缓存存储.中间件总是在可能的情况下添加某些东西到 Vary 响应 header.

将 CacheMiddleware 放到其它可能添加某些东西到 Vary Header的中间件之后,下面的中间件会添加东西到 Vary header:

  • SessionMiddleware 添加了 Cookie
  • GZipMiddleware 添加了 Accept-Encoding
Django 缓存框架浅析 + 内存分析 Django 缓存框架浅析 + 内存分析 动态网站存在一个基本权衡是——它们是动态的。每次用户请求一个页面,web 服务器需要提供各种各样的计算——从数据库查询到模板渲染再到业务逻辑——最后生成页面呈现给用户。从处理开销的角度来看,这比读取文件的开销要高得多。 缓存是将一些需要经过大量计算的结果存储在一个指定区域中,避免再次访问时的重复计算(处理好缓存的失效时机,否则会破坏数据的实时性)。通俗的讲,缓存就是用空间换取时间的一种策略方案。 使用缓存(这里主要指后端缓存)有以下主要优势: 提升接口响应速度 阅读详情

相关推荐

32、Django缓存框架全解析

本文全面解析了Django的缓存框架,涵盖了模板片段缓存、底层缓存API、缓存键前缀与版本控制、下游缓存管理以及相关的HTTP头部信息控制。文章还介绍了如何选择合适的缓存策略、进行缓存调试监控、清理更新缓存数据,并讨论了缓存的安全性考虑。通过这些内容,开发者可以更好地优化Django应用性能并确保缓存数据的正确性和安全性。

j0k1l2m3n的博客 83

django:缓存

一,缓存 动态网站最基本的权衡就是,它们是动态的。每次用户请求页面时,Web服务器都会进行各种计算——从数据库查询到模板呈现再到业务逻辑——以创建站点访问者所看到的页面。从处理开销的角度来看,这比标准的“读取文件离开文件系统”服务器安排要昂贵得多。 对于大多数Web应用程序来说,这种开销并不是什么大问题。大多数网络应用程序不是washingtonpost.com或slashdot.org;它们只是一些流量一般的中小型网站。但对于中高流量的网站来说,尽可能减少开销是必要的。 这就是缓存的用武之地。 缓存是为

dangfulin的博客 3354

Django缓存框架详解(官方文档翻译来)

#首先看Django官网的介绍:    动态网站的一个基本权衡就是他们是动态的,每次一个用户请求一个页面,web服务器进行各种各样的计算-从数据库查询到模板渲染到业务逻辑-从而生成站点访问者看到的页面。从处理开销的角度来看,相比标准的从文件系统读取文件的服务器调度,这是昂贵了不少。尽管对于大多数网站来说,这种开销不是什么大问题,因为大多数web应用不过是想学学院的首页那样,都是小到中型的站点,流量...

Lin的博客 3462

【Django缓存实现】前端缓存和后端缓存

缓存(cache),原始意义是指访问速度比一般随机存取存储器(RAM)快的一种高速存储器,通常它不像系统主存那样使用DRAM技术,而使用昂贵但较快速的SRAM技术。缓存的设置是所有现代计算机系统发挥高性能的重要因素之一。缓存的优点汇总,加快页面打开速度,减少网络带宽消耗,降低服务器压力。具体工作原理可参考:缓存_百度百科 (baidu.com)。通俗的说,这里涉及到计算机的各种存储,内存、磁盘、cpu等都算是计算机的存储器。

黎明总是如期而至 3989

31、Django缓存框架:优化性能的全面指南

本文深入介绍了Django缓存框架的使用与优化策略,涵盖了动态网站的缓存必要性、缓存设置、使用方式以及缓存策略的选择。通过详细解析不同缓存方式的适用场景和性能考量,帮助开发者优化网站性能,减少数据库压力。此外,还探讨了缓存失效策略、预热、分层等高级应用技巧,以及缓存的监控与维护方法,助力提升用户体验和网站性能。

j0k1l2m3n的博客 107

LLM - windows下的Dify离线部署:从镜像打包到无网环境部署(亲测,包含插件部署)

LLM - windows下的Dify离线部署:从镜像打包到无网环境部署(亲测,包含插件部署)

ocean00008899的博客 1290

【Django】Django中的缓存

定义:缓存是一类可以更快的读取数据的介质统称,也指其他可以加快数据读取的存储方式,一般用来存储临时数据,常用介质的是读取速度很快的内存。意义:视图渲染有一定成本,数据库的频繁查询过高,所以对于低频变动的页面可以考虑使用缓存技术,减少实际渲染次数,用户拿到响应的时间成本会更低。Django 缓存的实现方法缓存场景:博客列表页电商商品详情页场景特点:缓存的地方,数据变动频率较少。

Python、Golang、大数据 2328

5G边缘计算:核心网下沉革命

5G核心网与边缘计算的深度融合,通过UPF下沉、本地流量卸载等关键技术,实现了低时延、高效能的分布式计算架构。该技术将数据处理从核心网向边缘节点转移,支持工业控制、车联网、远程医疗等场景的1-10ms超低时延需求。5G核心网的SBA架构和CUPS设计为边缘计算提供了灵活部署基础,SMF、PCF等网元协同确保业务质量与可靠性。

Qinti_mm的博客 1403

14. django缓存简单介绍

定义:缓存是一类可以更快的读取数据的介质统称,也指其他可以加快数据读取的存储方式。一般用来存储临时数据,常用的介质是读取速度更快的内存。

Oracle/MySQL 到 国产信创数据库|迁移 · 调优 · 信创替换 2290

计算机考研408复试题汇总

TCP连接是全双工的,两端都可以先挥手 其中一端完成数据发送任务后,发送一个FIN包来终止,另一端针对这个FIN包回复确认包, 直到另一端也发送请求终止数据包FIN,另一端作出确认应答,并且还要发送一个ACK=1表示确认号有效,如果没有收到这个就可以进行重传.

ca1m4n的博客 1万+

基于Xilinx_IBERT的光纤接口眼图测试

基于Xilinx_IBERT的光纤接口眼图测试

Coca_Tian的博客 1万+

Django之缓存篇

1.什么是缓存 定义:缓存是一类可以更快的读取数据的介质统称,也指其他可以加快得数据读取的存储方式。一般来存储临时数据,常用的介质是快速很快据的内存。 意义:试图渲染有一定的成本,数据库查询的频率过高;所以对于低频变动的页面可以考虑缓存技术,减少实际渲染次数;用户得到响应的时间也会减少。 简单例子:网上购物如果的推荐图片一个月换一次,属于低频变动,因此可以通过缓存技术,这样子就不需要花费时间去数据库寻找了。 2.Django的缓存方式 1.数据库缓存 说明:将变动低频的数据放入数据库当中。

m0_61993498的博客 5111

硬件工程师笔记——三极管Multisim电路仿真实验汇总

NPN型三极管:由N型半导体、P型半导体和N型半导体组成,即NPN结构。 PNP型三极管:由P型半导体、N型半导体和P型半导体组成,即PNP结构。 三极管的工作原理基于电流的控制和放大,其核心是基区对电流的控制作用。 将三极管等效为两个串联的二极管进行等效分析

XU157303764的博客 2637

django 缓存框架

 摘自:http://www.9say.com/2009/01/django-cache-framework/翻译:django 缓存框架(1)(django cache framework) January 8, 2009 by admin · Leave a CommentFiled under: django  译者注:1、无用的,吹

冰峰 的专栏 5897

符合DO-178C和DO-331的机载软件研制体系

DO-178C的核心要求软件开发生命周期:DO-178C定义了软件开发的生命周期过程,包括需求获取、设计、实现、验证和确认等。它为机载软件开发提供了一套系统化的指导,确保在开发过程中考虑安全性和可靠性。安全等级(DAL):根据系统的重要性,DO-178C将软件划分为不同的开发保障等级(DAL A到E),DAL A的要求最为严格,适用于关键安全功能,而DAL E的要求较低,适用于非关键功能。DO-178C在非基于模型软件开发中的应用。

qq_41854911的博客 980

OpenOCD入门到精通:第28章 综合实战:RISC-V 调试

RISC-V调试实战摘要 本文介绍了RISC-V调试规范及其在OpenOCD中的实现。主要内容包括: RISC-V Debug规范的两个版本(0.11和0.13)及其差异,OpenOCD通过自动检测DTMCS寄存器版本号选择对应驱动实现。 RISC-V调试架构的分层设计,包含DTM、Debug Module、Program Buffer等核心组件,以及三种内存访问方式(progbuf、sysbus、abstract)。 以GD32VF103为例的实战调试配置,包括硬件连接、OpenOCD配置文件编写和GDB

从事嵌入式linux android驱动开发,拥有全栈能力 285

Django缓存框架API

有时,缓存整个渲染页面并不会带来太多好处,事实上,这样会很不方便。比如站点包含一个视图,它的结果依赖许多费时的查询,而且结果会随着时间变化而改变。在这个情况下,使用站点或视图缓存策略提供的全页面缓存并不理想,以为不能缓存所有结果(一些数据经常变动),不过仍然可以缓存几乎没有变化的结果。像这样的情况Django公开了一个底层的缓存API。可以使用这个API以任意级别颗粒度在缓存中存储对象。

鬼义虎神的学习笔记 1510

SAN存储与协议,了解SCSI、FC和ISCSI

在前面我们介绍SAN存储及iSCSI协议的时候了解到SAN存储其实是一个CS架构的系统。存储系统本身就是整个系统的服务端。以IP-SAN(也就是基于iSCSI的SAN存储)为例,其整体架构如图1所示。 图1 CS架构 对于存储系统来说,通常是由专业的存储厂商提供,比较知名的如EMC、NetAPP、IBM和日立等等。国内存储厂商也迅速崛起,比较知名的如华为、宏杉、浪潮和同友等等。另外,还有一些小的存储厂商,他们往往集中在某个领域,比如专注文件系统或者块存储等等。 除了专业的存储设备外,其实Linux

shuningzhang的专栏 2686

Django的缓存框架Cache

缓存的意义:         动态网站的基本权衡是动态的。每次用户请求页面时,Web服务器都会进行各种计算,从数据库查询到模板呈现再到业务逻辑,创建站点访问者可以看到的页面。从处理开销的角度来看,这比标准的从文件中读取文件的服务器系统要贵得多。       &...

weixin_43697214的博客 222

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Django 之 缓存框架

文章目录Django的缓存配置缓存开发调试基于本地内存的缓存文件缓存数据库缓存Memcached缓存参数Django中的缓存应用缓存全站缓存视图缓存模板片段 Django的缓存 ​ 动态网站的不足之处体现在“动态”上。每请求一个页面,Web 服务器都要做各种计算,为了让用户可以看到页面,要查询数据库、渲染模板,还要执行一些业务逻辑。从消耗方面来看,这个过程比从文件系统中读取一个文件要耗资源。 Dj...

Hello LinWoW~ ⊙o⊙ 421

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Django 缓存框架使用示例

Django 缓存框架使用示例

Leon_Jinhai_Sun的博客 384

Django5.1(53)—— Django 缓存框架(一)

虽然 Django 内置了对多种缓存后端的支持,但有时你可能希望使用自定义的缓存后端。CACHES = {如果您正在构建自己的缓存后端,可以使用标准的缓存后端作为参考实现。您可以在 Django 源代码的 django/core/cache/backends/ 目录中找到相应的代码。注意:除非是令人信服的理由,诸如服务器不支持缓存,否则你应该使用 Django 附带的缓存后端。他们经过了良好的测试并有完整文档。

专注于各种资源、教程,免费分享 1245

Django5.1(54)—— Django 缓存框架(二)

这种方法将你的视图和缓存系统耦合起来,这样并不理想。如果 ISP 盲目地缓存了您的站点,那么通过该 ISP 登录的第一个用户的特定于用户的收件箱页面将被缓存,以供站点的随后访问者使用。在这个情况下,使用站点或视图缓存策略提供的全页面缓存并不理想,因为不能缓存所有结果(一些数据经常变动),不过你仍然可以缓存几乎没有变化的结果。如果你正在使用的生产后端能接受更大范围的键(自定义后端或非 memcached 的内置后端),并且在没有警告的情况下使用更广的范围,你可以在 INSTALLED_APPS 中的。

专注于各种资源、教程,免费分享 1302

Django 缓存框架基本操作示例

Django 缓存框架基本操作示例

Leon_Jinhai_Sun的博客 271

django框架中的缓存系统

一、浏览器的缓存机制   Cache-Control策略:     Cache-Control和Expires的作用相似,即指出当前资源的有效期,控制浏览器是直接从浏览器缓存获取数据还是发送Request到服务端获取数据,只不过Cache-Control的选择方式更多,设置详细,如果要同时设置,优先级高于Expires。 Cache-Control: max-age=10,...

diyongyi3864的博客 156
上一篇: 安卓android readonly 无法增删文件
下一篇: 轻松玩转django缓存
hypercube2
博客等级 码龄18年 23粉丝 169原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值