后端之Django-的缓存机制

目录

缓存简介

Django支持的6种缓存及配置

开发调试缓存

内存缓存

文件缓存

数据库缓存

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

Memcache缓存(使用pylibmc模块)

Django中缓存的应用

前后端混合开发(不分离)缓存的使用

前后端分离缓存的使用


缓存简介

对于一些动态网页,每次当用户访问时,都会去数据库增删查改,并发量大时效率低,且会消耗很多的服务器资源

若我们可以把一些常用的数据信息保存在内存中或一些方式中(如memcache),一定时间内用户来访问时,就不用走数据库了,而是直接从缓存中读取数据,然后返回给用户

若想要的数据在缓存中没有,再走数据库,以提高效率

Django支持的6种缓存及配置

经常使用的有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,    # 最大缓存记录的数量(默认300)
	   'CULL_FREQUENCY': 3,   # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
  }  
 }
}

文件缓存

把缓存数据存储在文件中

在settings.py中配置:

CACHES = {
 'default': {
  'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', #指定缓存使用的引擎
  'LOCATION': 'D:\django_cache', #指定缓存的路径,自己指定,可在项目外
  'TIMEOUT':300,              #缓存超时时间(默认为300秒,None表示永不过期)
  'OPTIONS':{
	   'MAX_ENTRIES': 300,     # 最大缓存记录的数量(默认300)
	   'CULL_FREQUENCY': 3,}
 }   
}

数据库缓存

把缓存数据存在数据库中

在settings.py中配置:

CACHES = {
 'default': {
  'BACKEND': 'django.core.cache.backends.db.DatabaseCache',  # 指定缓存使用的引擎
  'LOCATION': 'cache_table',          # 缓存到的数据库表    
  'OPTIONS':{
	   'MAX_ENTRIES': 300,           # 最大缓存记录的数量(默认300)
	   'CULL_FREQUENCY': 3,}  
 }   
}

注意:创建缓存数据库表使用的语句

        python manage.py createcachetable

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

使用python-memcached模块连接memcache

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

在settings.py中配置:

CACHES = {
 'default': {
  'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', # 指定缓存使用的引擎
  'LOCATION': '192.168.10.100:11211',    # 指定Memcache缓存服务器的IP地址和端口
  'OPTIONS':{
	   'MAX_ENTRIES': 300,            # 最大缓存记录的数量(默认300)
	   'CULL_FREQUENCY': 3,}
 }
}

其中,LOCATION也可配置如下:

'LOCATION': 'unix:/tmp/memcached.sock',   # 指定局域网内的主机名加socket套接字为Memcache缓存服务器

# or

'LOCATION': [         # 指定一台或多台其他主机ip地址加端口为Memcache缓存服务器
    '192.168.10.100:11211',
    '192.168.10.101:11211',
    '192.168.10.102:11211',
]

Memcache缓存(使用pylibmc模块)

使用pylibmc模块连接memcache

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

在settings.py中文件配置:

CACHES = {
  'default': {
   'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',     
      'LOCATION':'192.168.10.100:11211', # 指定本机的11211端口为Memcache缓存服务器
   'OPTIONS':{
	    'MAX_ENTRIES': 300,
	    'CULL_FREQUENCY': 3,},  
  }
 }

其中,LOCATION也可配置如下:

'LOCATION': '/tmp/memcached.sock',  # 指定某个路径为缓存目录

# or

'LOCATION': [  # 分布式缓存,在多台服务器上运行Memcached进程,程序会把多台服务器当作一个单独的缓存,而不会在每台服务器上复制缓存值
    '192.168.10.100:11211',
    '192.168.10.101:11211',
    '192.168.10.102:11211',
]

Django中缓存的应用

Django中使用缓存的位置通过配置文件来操作,即在配置文件中配置来采用不同的缓存方式

下以文件缓存为例,settings.py中配置如下:

CACHES = {
    'default': {
	  'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',  
	  'LOCATION':  'D:\django_cache',
	  'TIMEOUT':300,
	  'OPTIONS':{
		  'MAX_ENTRIES': 300,
		  'CULL_FREQUENCY': 3,}
    }   
}

Django提供了不同粒度的缓存:

        全站缓存,单页面缓存(/视图函数使用缓存),页面局部缓存

前后端混合开发(不分离)缓存的使用

-全站缓存:在中间件中加入两个中间件

MIDDLEWARE_CLASSES = [
    'django.middleware.cache.UpdateCacheMiddleware',      #第一
    ...
    'django.middleware.cache.FetchFromCacheMiddleware',   #最后
]

注:'update'的必须配置在第一个;'fetch'的必须配置在最后一个

CACHE_MIDDLEWARE_SECONDS = 10  # 10s后缓存更新

这样配置后访问所有视图函数都先从缓存找了。。。

-单页面缓存:在视图函数上加装饰器

views.py
	from django.views.decorators.cache import cache_page
	@cache_page(10) # 缓存10s后才过期/更新
	def cache_test(request):
		import datetime
		ctime = datetime.datetime.now()
		return Render(request, 'cache_test.html', locals())

cache_test.html
		<h3>当前时间:-----{{ t }}</h3>

settings.py已配置

-局部页面缓存:刷新页面时,网页一部分实现缓存

views.py
	def cache_test(request):
		import datetime
		ctime = datetime.datetime.now()
		return Render(request, 'cache_test.html', locals())

cache_test.html
	<h3 style="color: green">不缓存:-----{{ t }}</h3>
	{% load cache %}
	{% cache 10 'name' %} <!--10是10s钟,name是存在缓存中的唯一key值(数据在缓存中以一个大字典存放嘛,key名任取)-->
    <h3>使用缓存:-----:{{ t }}</h3>
    {% endcache %}

settins.py已配置

这样页面每次刷新第一个t一直在变,而第二个t每隔10s变一次

前后端分离缓存的使用

from django.core.cache import cache

设置:cache.set(key, value)  # value可以是任意类型:字符串(..., json格式的),对象等

获取:cache.get(key)

eg:

class Person():
    def __init__(self, name, age):
		self.name = name
        self.age = 18

from django.core.cache import cache        
def cache_test1(request):
    p = Person('weer', 18)
    cache.set('person', p)
    cache.set('msg', '信息')
    return Render(request, 'cache_test.html', locals())

def cache_test2(request):
    p = cache.get('person')
    msg = cache.get('msg')
    print(type(p))
    print(p.name)
    print(msg)
    return Render(request, 'cacha_test.html', locals())

这样先访问cache_test1的视图函数存入缓存数据后,再访问cache_test2就能从缓存中读取数据打印了

应用场景:

        第一次查询所有,通过多表联查序列化之后的数据,然后用缓存存起来

        后续先从缓存查,查不到(判断查结果是否为空),再去数据库查

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weer-wmq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值