在为后端输出加入Redis缓存的过程中出现的问题。

在我利用Flask-restful架构的后端中,理所当然的利用装饰器marshal_with对我的返回数据进行格式化输出。

举个最简单的例子:

from flask_restful import Resource,  fields,  marshal_with

fields = {
'id': fields.Integer,
'name': fields.String,
'bio': fields.String,
} class Users(Resource):
@marshal_with(fields)
def get(self, user_id):
return session.query(User).filter(User.id=user_id).first()

这样子通过GET请求则会从数据库拿到的query对象会被marshal_with装饰城json数组返回(此处省略了主app添加资源然后运行,以及models的创建过程)。

在我想对这样一个资源请求添加缓存的时候,自然准备利用flask_cache.

而flask_cache的对象cache,主要两个装饰器(详细可参考:https://pythonhosted.org/Flask-Cache/):

1.cache.cached

2.cache.memoize

区别主要在于第二个在制作key的时候会考虑参数,那么因为我们这个有user_id,不同的用户请求在缓存当中不同,自然选择memoize,所以我一开始就这样写。

from flask_restful import Resource,  fields,  marshal_with
from flask_cache import Cache cache=Cache(......) #initial with app fields = {
'id': fields.Integer,
'name': fields.String,
'bio': fields.String,
} class Users(Resource):
@cache.memoize()
@marshal_with(fields)
def get(self, beacon_id):
return session.query(User).filter(User.id=user_id).first()

可是在测试过程中发现,对于不同的user_id,返回的都是同一个缓存结果。

几经波折,打印出来才发现是装饰器顺序导致memoize了marshal_with的装饰导致key一样。

那么如果我把这两个顺序交换,也就是说memoize放在marshal_with下面,可是这样子会造成一个新的问题,

缓存的数据是SQLAlchemy的查询结果,当你试图从缓存中恢复的时候则会造成:

“Parent instance <SomeClass> is not bound to a Session; lazy load operation…”

这个错误,最终,我选择了取消marshal_with装饰器:

from flask_restful import Resource,  fields,  marshal_with,marshal
from flask_cache import Cache cache=Cache(......) #initial with app fields = {
'id': fields.Integer,
'name': fields.String,
'bio': fields.String,
} class Users(Resource):
@cache.memoize()
def get(self, beacon_id):
return marshal(session.query(User).filter(User.id=user_id).first(),fields)

也就是说直接缓存marshal装饰后的结果。

在put post等修改数据库的操作后,利用cache.delete_memoized删掉缓存保证数据同步。

利用memoize缓存到Redis出现多个参数同一个结果的更多相关文章

  1. [python]mysql数据缓存到redis中 取出时候编码问题

    描述: 一个web服务,原先的业务逻辑是把mysql查询的结果缓存在redis中一个小时,加快请求的响应. 现在有个问题就是根据请求的指定的编码返回对应编码的response. 首先是要修改响应的bo ...

  2. 【OF框架】缓存Session/Cookies/Cache代码调用api,切换缓存到Redis

    准备 缓存服务在应用开发中最常用的功能,特别是Session和Cookies,Cache部分业务开发过程会使用到. 在负载均衡环境下,缓存服务需要存储到服务器. 缓存默认实现在内存在,可以通过配置切换 ...

  3. scrapy实现自动抓取51job并分别保存到redis,mongo和mysql数据库中

    项目简介 利用scrapy抓取51job上的python招聘信息,关键词为“python”,范围:全国 利用redis的set数据类型保存抓取过的url,现实避免重复抓取: 利用脚本实现每隔一段时间, ...

  4. CentOS6.4 安装OpenResty和Redis 并在Nginx中利用lua简单读取Redis数据

    1.下载OpenResty和Redis OpenResty下载地址:wget http://openresty.org/download/ngx_openresty-1.4.3.6.tar.gz Re ...

  5. [redis] session 保存到 redis 简单实现

    参考资料: [session保存到redis简单实现]http://blog.csdn.net/ppt0501/article/details/46700221 [Redis学习]http://blo ...

  6. 针对缓存在Redis中的聊天消息的持久化方案分析

    选型依据 数据库的选型主要考虑一下几个方面: 数据库本身是否收费 数据库后期维护成本 是否支持水平及垂直扩展,及扩展的容易程度 业务数据本身特性 使用此数据库的开发成本 由于此数据库主要用来存储缓存在 ...

  7. 如何将购物车信息存到Redis中?

    存到Redis中,好处是速度快.毕竟写到硬盘需要更多的时间.加入购物车的功能,操作很频繁,可以通过Redis快速写入,移除,修改. 用什么方式呢? 传统的KEY,VALUE不太合适,每次增加修改,都要 ...

  8. 在Spring Controller中将数据缓存到session

    Servlet方案 在Controller的方法的参数列表中,添加一个javax.servlet.http.HttpSession类型的形参.spring mvc会 自动把当前session对象注入这 ...

  9. nodejs express session用法(含保存到redis)

    普通用法: var express = require('express'); var session = require('express-session'); var app = express( ...

随机推荐

  1. Error524 源站处理超时 Error 524: A timeout occurred

    https://su.baidu.com/helps/index.html#/4/5a61e4b5b34f697f13234a5b Error524 源站处理超时 更新时间:2018-01-19 20 ...

  2. mysql随机查询

    select * from table as t1 join (select round(rand() * ((select max(id) from table)-(select min(id) f ...

  3. mysq'l系列之10.mysql优化&权限控制

    网站打开慢如何排查 1.打开网页, 用谷歌浏览器F12, 查看network: 哪个加载时间长就优化哪个 2.如果是数据库问题 2.1 查看大体情况 # top # uptime  //load av ...

  4. error LNK2022: metadata operation failed (801311D6) : Differing number of methods in duplicated types

    本文主要是记录一个C++编译错误的解决方案,具体错误请看本文标题. 这个错误主要是由Managed C++的增量编译导致的,这是VS 2008的一个bug,在VS 2010已经修复,我使用的正式201 ...

  5. LeetCode:安排工作以达到最大收益【455】

    LeetCode:安排工作以达到最大收益[455] 题目描述 有一些工作:difficulty[i] 表示第i个工作的难度,profit[i]表示第i个工作的收益. 现在我们有一些工人.worker[ ...

  6. 编辑框的WM_MOUSELEAVE和WM_MOUSEHOVER使用

    // 参考资料 // http://www.cnblogs.com/weiqubo/archive/2011/04/14/2016323.html 最近工作需要,需要自定义编辑框,改写编辑框CEdit ...

  7. 程序连接Oracle数据库出现未找到提供程序.该程序可能未正确安装错误提示

    好不容易使用plsql可以成功连上数据库了,应用程序连接数据库却出现了问题 其实解决这个问题也简单: 1.  查看oracle安装目录下的BIN目录,E:\app\Administrator\prod ...

  8. 一篇文章了解相见恨晚的 Android Binder 进程间通讯机制【转】

    本文转载自:https://blog.csdn.net/freekiteyu/article/details/70082302 Android-Binder进程间通讯机制 概述 最近在学习Binder ...

  9. 吴恩达机器学习笔记(二) —— Logistic回归

    主要内容: 一.回归与分类 二.Logistic模型即sigmoid function 三.decision boundary 决策边界 四.cost function 代价函数 五.梯度下降 六.自 ...

  10. jQuery(expression, [context])

    jQuery(expression, [context])         返回值:jQuery 概述 这个函数接收一个包含 CSS 选择器的字符串,然后用这个字符串去匹配一组元素. jQuery 的 ...