场景描述

在Django开发中,我们在 views.py 里用到了很多的sql查询,很多的跨表跨库显示,而且数据量已达到百万级,为了加快速度显示,这边启用了缓存。

一开始我们想使用 @cache_page() 来达到缓存的目的,但是这样的缓存没有找到清除缓存的方法。

所以我们只好使用cache的方式来缓存,这里用时间(年-月-日 时:分)md5后作为缓存的key。

而且百度一下以后发现,关于django的cache讲述得很少。我们这里做一下简单的笔记。需要说明一下的是 cache.get_or_set ,我一开始以为是如果有这个值就自动获取,但是发现页面任然很慢。所以查了一下官方手册。 cache.get_or_set 手册里面写的是默认是设置新值。大家使用时一定要防止踩这个坑。

cache.get_or_set(key, default, timeout=DEFAULT_TIMEOUT, version=None)

If you want to get a key’s value or set a value if the key isn’t in the cache, there is the get_or_set() method. It takes the same parameters as get() but the default is set as the new cache value for that key, rather than simply returned:

Python3 Django框架中的缓存机制

views.py 代码实例

from django.core.cache import cache
@login_required
def index( request ):
    if request.GET.get('date_joined_0') is None :
        lastDate = SnmpDiff.objects.values('update_time').filter( type = 'computer_room.snmp_95' ).order_by('-id')[1]
        date_joined_0 =  lastDate['update_time'].strftime("%Y-%m-%d")
        date_joined_1 =  lastDate['update_time'].strftime("%H:%M")
    else :
        date_joined_0 = request.GET.get('date_joined_0').replace('/','-')
        date_joined_1 = request.GET.get('date_joined_1')
    date = date_joined_0 + ' ' + date_joined_1
    cache_key = hashlib.md5(('index_'+date).encode(encoding='UTF-8')).hexdigest()
    # result = cache.get_or_set(cache_key, getIndexResult(date),60*60)
    if not cache.get(cache_key) :
        result = cache.get_or_set(cache_key, getIndexResult(date),60*60)
    else:
        result = cache.get(cache_key)

现在除了第一次打开慢一点之外,其他时间打开飞快。

评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注