认识缓存
django的缓存框架
-
这个文档很详细的介绍了关于缓存的东西。
-
(1)我们之前讲过的设置缓存
我们使用的是设置 redis缓存后端。使用django-redis扩展包工具。这些缓存各有优点 -
(2)缓存有很多种
这些可以帮助我们完成 基于站点,视图, 模板片段等的缓存。调用方法讲的都很清晰。 -
在阅读过这些之后,我们选择使用 底层的缓存API,因为我们所要缓存的只是一些简单的数据。
下面来看下底层接口的用法:
-
增删改查的功能十分详细,并且支持缓存所有的Python数据类型(如果你不能说出增删改查的功能函数,请再仔细阅读一遍!)
下面我们就可以进行缓存设计(这个缓存的设计思路还是我们开头的第一张图中的伪代码的思路!)
# Create your views here.
class AreaView(View):
def get(self, request):
area_id = request.GET.get('area_id')
if area_id is None:
# 先获取缓存,如果缓存中不存在,再查询 mysql并缓存
# 拿缓存
result = cache.get('province_list')
if result is None:
# 没有传递地区编号, 表示查询所有的省列表
province_list = Area.objects.filter(parent__isnull=True) # 表示父级为空: (sql)where parent is null, 作为外键,是parent ,但是 mysql中默认存储的字段名字是 parent_id 这里我们还是使用 parent
# 进行处理,只返回地区对象的编号和名称
province_list2 = []
for province in province_list:
province_list2.append({
'id': province.id,
'name': province.name
})
result = {
'code': RETCODE.OK,
'errmsg': "ok",
'province_list':province_list2
}
cache.set('province_list',result, constants.AREA_CACHE_EXPIRES)
return http.JsonResponse(result)
else:
result = cache.get('area_'+area_id)
if result is None:
# 有地区编号,表示查询指定地区的子级地区列表
try :
area = Area.objects.get(pk=area_id)
except:
return http.JsonResponse({'code':RETCODE.PARAMERR, 'errmsg':"地区编号无效"})
# 获取指定地区的子级地区
sub_list=area.subs.all()
# 整理前端需要的数据格式
sub_list2 = []
for sub in sub_list:
sub_list2.append({
'id':sub.id,
'name':sub.name
})
result={
'code':RETCODE.OK,
'errmsg':"ok",
'sub_data':{
'id':area.id,
'name':area.name,
'subs':sub_list2
}
}
cache.set('area_' + str(area.id), result, constants.AREA_CACHE_EXPIRES)
return http.JsonResponse(result)
代码很长,实际上非常简单~ 就是if else 语句, 然后通过 area_id 参数判断是 查询省,还是 市,区的信息。 接着判断缓存。添加缓存,再判断缓存,很易懂的逻辑。
over!