房屋模块包含两部分,房屋的发布与房屋的显示,其中房屋的发布位于个人房源发布页面,房屋的显示在首页、列表页、详情页、个人房源页都有涉及,根据其需求信息的不同。
1、缓存与城区信息
城区是房屋的一个大分类,在多个页面都有需求(主页、列表页、详情页、房源发布页),且变化可能性很小,在前述的数据库设计中将其单独提出一个表结构,根据其需求高、变化小的特性,可以将对于城区的请求设计为缓存。
在flask中,有提供缓存扩展(一般使用redis或memcached,关于这两者的简介参前文),但如果想要更灵活的处理,可以自己来实现缓存。
本项目中使用redis实现缓存,自定义了key和保存形式(以json字符串的形式保存内容),没有使用flask和werkzeug的扩展。
代码如下:
@api.route('/areas')
def get_area_info():
'''获取城区信息'''
# 尝试从redis中获取缓存
try:
resp_json = redis_store.get('area_info').decode()
except Exception as e:
current_app.logger.error(e)
else:
if resp_json:
print('hit redis area info')
return resp_json, 200, {"Content-Type": "application/json"}
# 查询数据库,读取城区信息
try:
area_li = Area.query.all()
except Exception as e:
current_app.logger.error(e)
return jsonify(errno=RET.DBERR, errmsg="数据库异常")
# 组织数据
area_dict_li = list()
for area in area_li:
area_dict_li.append(area.to_dict())
# 将数据保存到redis中,作为缓存使用,将响应结果直接转换为json字符串
resp_dict = dict(errno=RET.OK, errmsg="获取成功", data=area_dict_li)
resp_json = json.dumps(resp_dict)
try:
redis_store.setex('area_info', constants.AREA_INFO_REDIS_EXPIRE, resp_json)
except Exception as e:
current_app.logger.error(e)
return resp_json, 200, {"Content-Type": "application/json"}
注:①缓存必须设置时效,flask项目无法得知MySQL是否有变化,因此无法设置MySQL变动时自动删除缓存,设置一个有效时间,可以避免更新后的信息无法显示的问题(短时间的延迟是允许的);
②对于缓存保存格式的设定需要注意,r