django中使用memcached缓存

作为一个提高网站性能,缓解数据库压力的有效途径,缓存被各大网站大量使用,也是后端程序员必备的技能点,今天就来研究一下django中memcached的使用。

首先介绍一下memcached,memcached是一种非关系数据库,以key/value的形式将数据储存带内存中,相较于mysql等关系型数据库来说具有极快的读取速度,可以极大提高web的响应速度。我们一般将它和mysql等数据库配合使用,网站请求数据的时候可以先去memcached中读取数据,如果没有再去mysql中读取,然后将读取到的数据写入到memcached中(需要自己手动编写代码)。

django中使用memcached(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,启动。
django中使用memcached缓存_第1张图片
然后在settings中配置memcached缓存:


# 缓存配置
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', #使用memcached进行缓存
        'LOCATION':[
            '127.0.0.1:11211' # memcached默认的主机端口
        ]
    }
}

memcached缓存有多种方式,可以在在视图上使用缓存装饰器将整个页面进行缓存,可以在视图中对某些数据进行缓存,可以在路由中进行缓存,此方法主要用在当多个路由指向同一个页面而又不想让这个页面对所有的路由都缓存时使用,还可以在模板中使用。
缓存装饰器:

from django.views.decorators.cache import cache_page
@cache_page(60) # 60代表缓存的寿命,表示缓存时长60秒钟
def memcached(req):
    return render(req,"memcached.html")

django中使用memcached缓存_第2张图片
想要将缓存取消,可以在memcached数据中输入flush_all,windows下在命令行中输入telnet 127.0.0.1:11211 进入数据库,但这种方式只能将items设置成为过期,并不会删除items。
视图中缓存:

from django.core.cache import cache
def memcached(req):
    result = cache.get("the_key")
    if not result:
        key = "the_key"
        value = "这是一个60秒的缓存"
        time = 60
        cache.set(key,value,time)
        result = "这是没有缓存值的"
    return render(req,"memcached.html",{"result":result})

第一次访问时,没有在缓存中获取到the_key,打开浏览器会显示:
django中使用memcached缓存_第3张图片
刷新一下之后:
django中使用memcached缓存_第4张图片
在路由中缓存:
django中使用memcached缓存_第5张图片
效果同在视图中缓存一样,都是缓存整个页面。
在模板中缓存:
django中使用memcached缓存_第6张图片
首先要导入cache,使用{% load cache %},同样缓存时必须携带两个参数,第一个是缓存时间,第二个是缓存片段的名称。

memcached是一个很好用的缓存数据库,在一些小型分布式系统中具有非常好的性能,但是随着系统不断扩大,memcahed也需要扩容,这是耗时耗力的,而且memcached不支持数据持久化,服务器重启后数据就没了。当我们更在意数据持久化,需要储存更多类型的数据时使用redis替换掉memcached是一个更好的选择。

不管是memcached还是redis,我们在缓存数据的时候经常要缓存object对象,对于这种key/value的非关系型数据库而言本身是不支持这种数据类型的,但并不代表不可行。想要在缓存中保存object,需要先对object进行序列化,将其准化成可以进行储存的形式存入缓存中,从缓存中读取数据时需要进行反序列化。

你可能感兴趣的:(django,缓存)