jasper的技术小窝

关注DevOps、运维监控、Python、Golang、开源、大数据、web开发、互联网

用redis或memcache实现django中的缓存机制

作者:jasper | 分类:django | 标签:       | 阅读 2404 次 | 发布:2014-11-01 11:49 p.m.

虽然python提供了全局变量(global)的特性,不知道大家发现没,在我们django的开发中几乎不会用到这个东东,这是为什么呢?其实更多的时候我们会把全局变量放在settings.py中,在应用起来的时候,就会把他们加载进内存,那么问题来了:这类数据如果被更改了,如何做持久化?的确,这里的“全局变量”其实应该叫“全局定量”吧,因为我们一般只会把定量放在settings.py里面。

django其实提供了一种解决方案,就是利用缓存来实现,但是django默认的缓存机制也是基于内存的,那么在应用重启的时候,同样会将数据丢失,因此我们迫切地希望缓存能够持久化。幸好,django的开发者们也想到了这一点,让开发者可以自定义缓存方式。

一般我们用到的有数据库缓存,文件系统缓存,memcache缓存和redis缓存。文件系统这种方式还是算了吧,因为我一直非常反对将变量写入文件中。数据库缓存的话,我们总不能为了几个变量还的新建一个表吧,而且对于我们这种对性能要求比较高的人(虽然这点性能对于一个应用来说可以忽略),还是更加倾向于更加灵活的nosql数据库做缓存。

那下面简单介绍一下,如何用redis和memcache来做django的缓存吧,其实大同小异,只是配置不一样,用法都一样。 在settings.py中添加如下配置:

CACHES = {
    "redis": {
        "BACKEND": "redis_cache.cache.RedisCache",
        "LOCATION": "127.0.0.1:6379",
        "OPTIONS": {
            "CLIENT_CLASS": "redis_cache.client.DefaultClient",
        }
    },
    'memcache': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '127.0.0.1:11211',
        'options': {
            'MAX_ENTRIES': 1024,
        }
    },
     'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
        'LOCATION': 'unique-snowflake',
        'options': {
            'MAX_ENTRIES': 1024,
        }
    }
}

注意在django<1.3版本中是设置CACHE_BACKEND参数的,现在应该没几个人用这个低版本的了吧,所以我就赘述它了。

OK, 我一口气将三种配置都写进去了,这样在应用跑起来的时候,就会将这些配置加载进来。default其实可以忽略的,但是加上的话可以在用的时候做判断用,比如读取redis缓存异常就用默认的缓存什么的。好不多说,我们如何运用他们呢? 其实超级简单的:

from django.core.cache import get_cache
cache = get_cache('redis')
#cache = get_cache('memcache')
#cache = get_cache('default')

#赋值
cache.set(key, value, timeout)
#..................
#取值
cache.get(key)

这样就大功告成了,麻麻再也不用担心我变量不能持久化了。

特别地,其中的timeout(即过期时间),是一个很有用的功能,前一段时间我有这么一个case,用户要求在两个小时内,不重复发送id相同的报警邮件。当时是想写数据库的,将id和时间都写进去,每次都取出来和现在时间做判断的。最后一拍脑门,用redis做缓存啊(恰好项目有用到redis),id作为key,value就置为True吧,然后设置两个小时的timeout,就搞定了。

不多说,睡觉了。。。。


转载请注明出处:http://www.opscoder.info/django_cache.html

其他分类: