后端之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
memcached是Django原生支持的缓存系统.要使用Memcached,需要下载Memcached的支持库python-memcached或pylibmc
在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就能从缓存中读取数据打印了
应用场景:
第一次查询所有,通过多表联查序列化之后的数据,然后用缓存存起来
后续先从缓存查,查不到(判断查结果是否为空),再去数据库查