Django启用memcache缓存

在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面.当一个网站的用户访问量很大的时候,每一次的的后台操作,都会消耗很多的服务端资源,所以必须使用缓存来减轻后端服务器的压力.

Django启用memcache缓存

在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面.

当一个网站的用户访问量很大的时候,每一次的的后台操作,都会消耗很多的服务端资源,所以必须使用缓存来减轻后端服务器的压力.

缓存是将一些常用的数据保存内存或者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进行序列化,将其准化成可以进行储存的形式存入缓存中,从缓存中读取数据时需要进行反序列化。

上一篇:客户端连接MySQL8提示 caching-sha2-password 问题 下一篇:PHP中字符串跟0做比较永远是true

评论

评论(16)

暂无评论