
在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面.
当一个网站的用户访问量很大的时候,每一次的的后台操作,都会消耗很多的服务端资源,所以必须使用缓存来减轻后端服务器的压力.
缓存是将一些常用的数据保存内存或者memcache中,在一定的时间内有人来访问这些数据时,则不再去执行数据库及渲染等操作,而是直接从内存或memcache的缓存中去取得数据,然后返回给用户.
一、安装memcache
1、win环境安装
下载地址
#win32:
http://downloads.northscale.com/memcached-win32-1.4.4-14.zip
#win64:
http://downloads.northscale.com/memcached-win64-1.4.4-14.zip
#windows中memcached在1.4.5之前是可以被作为一个服务来运行的,但在1.4.5之后就不可以了,需要设置定时任务来启动。我们使用的是1.4.4版本。将下载的压缩包解压到指定的文件夹中以管理员的身份打开命令行,在命令行中执行
memcached.exe -d install然后计算机服务中,找到memcached,启动。
2、Linux安装
linux安装直接执行
yum install memcached
systemctl start memcached #启动
systemctl enable memcached# 开机启动二、Django中配置
在setting中配置memcache缓存
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': [
'127.0.0.1:11211' # memcached默认的主机端口
],
#'OPTIONS':{
# 'MAX_ENTRIES': 300, # 最大缓存记录的数量(默认300)
# 'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
#}
}
}使用缓存装饰器缓存整个页面
from django.views.decorators.cache import cache_page
@cache_page(60) # 60代表缓存的寿命,表示缓存时长60秒钟
def index(request):
return render(request,"index.html")对某些数据进行缓存
from django.core.cache import cache
#公共内容
def global_variable(request):
time = 3600
if not cache.get('categorys'):
filed_list = ('id', 'name', 'index', 'path', 'status', 'parent_id')
_categorys = Category.objects.all().values(*filed_list)
categorys = get_tree(_categorys)
cache.set('categorys', json.dumps(categorys), time)
else:
categorys = json.loads(cache.get('categorys'))在路由中缓存
from django.views.decorators.cache import cache_page
urlpatterns = [
path('list-<int:lid>.html', cache_page(60)(views.get_list), name='list'),#列表页
]在模板缓存
<!DOCTYPE html>
{% load cache %}
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{% cache 60 image %}
<img src="/static/images/1.png" alt="">
{% endcache %}
</body>
</html>首先要导入cache,使用{% load cache %},同样缓存时必须携带两个参数,第一个是缓存时间,第二个是缓存片段的名称。
memcached是一个很好用的缓存数据库,在一些小型分布式系统中具有非常好的性能,但是随着系统不断扩大,memcahed也需要扩容,这是耗时耗力的,而且memcached不支持数据持久化,服务器重启后数据就没了。当我们更在意数据持久化,需要储存更多类型的数据时使用redis替换掉memcached是一个更好的选择。
不管是memcached还是redis,我们在缓存数据的时候经常要缓存object对象,对于这种key/value的非关系型数据库而言本身是不支持这种数据类型的,但并不代表不可行。想要在缓存中保存object,需要先对object进行序列化,将其准化成可以进行储存的形式存入缓存中,从缓存中读取数据时需要进行反序列化。
评论(16)