Django 缓存机制

缓存作用

   当一个网站的并发量特别高的时候,频繁的对数据库进行增删查改操作势必会让访问速度变慢,此时你可以选择使用缓存来减小服务器的压力,但是缓存不要滥用,因为它可能会导致脏数据的出现。

   缓存说白了就是将你的数据存放到另一个地方,下次再去拿这些数据时将不再进行数据库查询,而是直接从缓存中取出数据并返回给用户。

Django缓存

   在Django中,你可以将数据缓存到下面六种地方:

   开发调试缓存

   内存缓存

   文件缓存

   数据库缓存

   Memcache缓存(使用python-memcached模块)

   Memcache缓存(使用pylibmc模块)

   经常使用的有文件缓存、以及Memcache缓存。

开发调试

   此模式为开发调试使用,实际上不执行任何操作。

   settings.py中进行配置:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.dummy.DummyCache',# 缓存后台使用的引擎
        'TIMEOUT': 300,# 缓存超时时间(默认300秒,None表示永不过期,0表示立即过期)
        'OPTIONS': {
            'MAX_ENTRIES': 300,# 最大缓存记录的数量(默认300)
            'CULL_FREQUENCY': 3,# 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)(随机删除)
        },}
}

内存缓存

   此模式将会把数据存放至内存中。

   settings.py中进行配置:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',# 指定缓存使用的引擎
        'LOCATION': 'unique-snowflake',# 写在内存中的变量的唯一值 
        'TIMEOUT': 300,# 缓存超时时间(默认为300秒,None表示永不过期)
        'OPTIONS': {
            'MAX_ENTRIES': 300,# 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
        }
    }
}

文件缓存

   此模式将会把数据存放至文件中,以文件路径作为key

   settings.py中进行配置:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',# 指定缓存使用的引擎
        'LOCATION': '/var/tmp/django_cache',# 指定缓存的路径
        'TIMEOUT': 300,# 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
        }
    }
}

数据库缓存

   此模式将会把数据存放至数据库中。

   settings.py中进行配置:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',# 指定缓存使用的引擎
        'LOCATION': 'cache_table',# 数据库表    
        'OPTIONS': {
            'MAX_ENTRIES': 300,# 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
        }
    }
}

   需要注意的是,在创建完数据库缓存后还需要手动执行一条命令:

python manage.py createcachetable

Memcache缓存(python-memcached)

   MemcachedDjango原生支持的缓存系统.要使用Memcached,需要下载Memcached的支持库python-memcachedpylibmc.

   下面是使用python-memcached时的配置。

   settings.py中进行配置:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',# 指定缓存使用的引擎
        'LOCATION': '192.168.10.100:11211',# 指定Memcache缓存服务器的IP地址和端口
        'OPTIONS': {
            'MAX_ENTRIES': 300,# 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
        }
    }
}

   LOCATION也可以配置成如下:

'LOCATION': 'unix:/tmp/memcached.sock',# 指定局域网内的主机名加socket套接字为Memcache缓存服务器
'LOCATION': [  # 指定一台或多台其他主机ip地址加端口为Memcache缓存服务器
    '192.168.10.100:11211','192.168.10.101:11211','192.168.10.102:11211',]

Memcache缓存(pylibmc)

   使用pylibmc模块连接memcache

   settings.py中进行配置:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',# 指定本机的11211端口为Memcache缓存服务器
        'OPTIONS': {
            'MAX_ENTRIES': 300,# 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
        },}
}

   LOCATION也可以配置成如下:

'LOCATION': '/tmp/memcached.sock',# 指定某个路径为缓存目录
'LOCATION': [  # 分布式缓存,在多台服务器上运行Memcached进程,程序会把多台服务器当作一个单独的缓存,而不会在每台服务器上复制缓存值
    '192.168.10.100:11211',]

   Memcached是基于内存的缓存,数据存储在内存中,所以如果服务器死机的话数据就会丢失,所以Memcached一般与其他缓存配合使用。

缓存粒度

   Django提供了不同粒度的缓存,可以缓存某个页面,可以只缓存一个页面的某个部分,甚至可以缓存整个网站。

   下面将使用文件缓存的形式做演示(这是针对不分离开发时所使用的):

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',# 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
        }
    }
}

单页面缓存

   在视图函数上加装饰器

from django.views.decorators.cache import cache_page

@cache_page(5)  # 缓存5s钟
def test_cache(request):
    import time
    ctime=time.time()
    return render(request,'index.html',context={'ctime':ctime})

   现在,当你五秒钟之内进行访问,时间将会一成不变。

局部缓存

   在一个模板中,使用tag进行局部缓存:

<p>未进行缓存:{{ ctime }}</p>
<hr>

<!--导入tage-->
{% load cache %}
<!--5表示5s钟,name是唯一key值-->

{% cache 5 'name' %}
	{{ ctime }}
{% endcache %}

   现在,你将看到未缓存的部分一直在刷新时间,而缓存部分将不刷新。

全站缓存

MIDDLEWARE = [
            'django.middleware.cache.UpdateCacheMiddleware',# 这个放在最上面
            ... 												# 其他中间件
            'django.middleware.cache.FetchFromCacheMiddleware',# 这个放在最下面
        ]
        
CACHE_MIDDLEWARE_SECONDS=10  # 全站缓存时间

   现在,你将看到所有的视图返回的页面都将10秒内刷新一次。

调用缓存

   导入缓存,你可以像操纵字典一样操纵它,你可以将它当作一个全局字典一样使用,可以缓存任何数据类型,需要注意的是key必须是唯一的。:

from django.core.cache import cache

   下面是缓存的一些常用操作方法:

方法 描述
cache.set(key,value,timeout=DEFAULT_TIMEOUT,version=None) 设置缓存,当不存在时则创建。
cache.get(key,default=None,version=None) 根据key获取缓存,若不存在则返回默认值None
cache.add(key,version=None) 使用与set相同,当缓存已存在时,将不会更新,而set则会更新
cache.get_or_set(key,default,timeout=DEFALUT_TIMEOUT,version=None) 获取缓存,当获取不到时设置缓存,并拿到设置的值
cache.get_many(key,version=None) 传入一个可迭代对象,它将会返回一个字典,将可迭代对象中所有key对应的value取出
cache.set_many(dict,timeout) 传入一个dict,它将会迭代该dict并且为每一组k,v存放到缓存中
cache.delete(key,version=None) 清除特定对象
cache.clear() 清楚缓存
cache.touch(key,version=None) 当缓存马上到期时,重新设置它的过期时间
cache.incr(key,delete=1,version=None) 对缓存中的数据做递增操作,如k对应的v原本是1,使用该方法后变为2
cache.decr(key,version=None) 对缓存中的数据做递减操作,如k对应的v原本是2,使用该方法后变为1
cache.close() 关闭缓存链接

   简单的示例:

from django.core.cache import cache
cache.set('key',value可以是任意数据类型)

# 你可以在该Django程序的任意位置拿到存入的值
cache.get('key')

  

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


注:所有源代码均实测运行过。所有源代码均已上传CSDN,请有需要的朋友自行下载。
继承APIView和ViewSetMixin;作用也与APIView基本类似,提供了身份认证、权限校验、流量管理等。ViewSet在开发接口中不经常用。
一、Django介绍Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。Django 是一个开放源代码的 Web 应用框架,由 Python 写成。Django 遵守 BSD 版权,初次发布于 2005 年 7 月, 并于 2008 年 9 月发布了第一个正式版本 1.0 。Django学习线路Django 采用了 MVT 的软件设计模式,即模型(Model),视图(View)和模板(Template)。这个MVT模式并
本文从nginx快速掌握到使用,gunicorn快速掌握到使用,实现小白快速搭建django项目,并对可能出现的报错进行了分析
uniapp微信小程序订阅消息发送服务通知
Django终端打印SQL语句 1 Setting配置: 2 默认python 使用的MysqlDB连接,Python3 支持支持pymysql 所有需要在app里面的__init__加上下面配置:
url: re_path(&#39;authors/$&#39;, views.AuthorView.as_view()), re_path(&#39;book/(?P\d+)/$&#39;, vie
前提 关于html寻找路线: template 如果在各个APP中存在, Django 会优先找全局template 文件下的html文件,如果全局下的template文件没有相关的html Djan
// GET请求request.GET // POST请求request.POST // 处理文件上传请求request.FILES // 处理如checkbox等多选 接受列表request.get
from bs4 import BeautifulSoup#kindeditordef kindeditor(request): s = &#39;&#39;&#39; &lt;li&gt;&lt;s
view.py 配置 html 配置
from django.http import JsonResponse JsonResponse 里面代码会加这一个响应头 kwargs.setdefault(&#39;content_type&#
#下面两种是基于QuerySet查询 也就是说SQL中用的jion连表的方式查询books = models.UserInfo.objects.all() print(type(books)) &gt
return HttpResponse(&quot;OK&quot;) 返回一个字符串 return redirect(&quot;/index/&quot;) 返回URL return render
from django.http import JsonResponse JsonResponse 里面代码会加这一个响应头 kwargs.setdefault(&#39;content_type&#
浏览器有一个很重要的概念——同源策略(Same-Origin Policy)。所谓同源是指,域名,协议,端口相同。不同源的客户端脚本(javascript、ActionScript)在没明确授权的情况
自动发送 &gt; 依赖jQuery文件 实例--&gt;GET请求: 手动发送 &gt; 依赖浏览器XML对象(也叫原生ajax) Ajax主要就是使用 【XmlHttpRequest】对象来完成请
#下面两种是基于QuerySet查询 也就是说SQL中用的jion连表的方式查询books = models.UserInfo.objects.all() print(type(books)) &gt
// GET请求request.GET // POST请求request.POST // 处理文件上传请求request.FILES // 处理如checkbox等多选 接受列表request.get
return HttpResponse(&quot;OK&quot;) 返回一个字符串 return redirect(&quot;/index/&quot;) 返回URL return render