场景描述
在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:
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)
现在除了第一次打开慢一点之外,其他时间打开飞快。
评论已关闭