在为后端输出加入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. HTML 学习笔记 JQueryUI(Interactions,Widgets)

    Draggable 允许使用鼠标移动元素(拖动) demo <html>    <head>        <meta charset="UTF-8" ...

  2. 如何获取 Greenplum 中用户最后登录时间和登录频率

    这几天搞系统迁移,老板突然想知道给客户开的那么多用户当中,哪些还在用,哪些已经不用了.我们的数据库是 Greenplum,而且还是一直没有升级的老版本,Google 了一下没有发现特别好的查看用户登录 ...

  3. 【题解】NOI2015软件包管理器

    [题解][P2146 NOI2015]软件包管理器 实际上就是树链剖分板子题. 对于\(install\)操作,直接查询它到\(0\)节点有多少已经安装了的,再用总数减去它. 对于\(uninstal ...

  4. 我的Android进阶之旅------>Ubuntu下不能识别Android设备的解决方法

    Bus 001 Device 006: ID 1b20:0c81 MStar Semiconductor, Inc.      今天不知道Ubuntu发了什么疯,昨天还用的好好的,今天就突然不能识别我 ...

  5. systemclock sleep 睡眠

  6. 2016WWDC详解

    今年苹果WWDC 2016上把所有系统都更新了个遍,watchOS.tvOS.macOS 和 iOS 都或多或少带来了新功能. 本文的主角是更新最多的 iOS 10,第一时间在一部 iPhone 6s ...

  7. 常见的CSS命名

    1:header(头部)logo  topbar lang search topmenu banner nav headbox active(活动的) selectselectTop selectLi ...

  8. nginx应用 突破高并发的性能优化

    摘自:http://www.cnblogs.com/kevingrace/p/6094007.html 在日常的运维工作中,经常会用到nginx服务,也时常会碰到nginx因高并发导致的性能瓶颈问题. ...

  9. bzoj 4066: 简单题 K-D树

    题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=4066 题解 我们把每次的修改操作都当作二维平面上多了一个权值点 对于每组询问可以看做求一 ...

  10. python爬虫知识点总结(四)Requests库的基本使用

    官方文档:http://docs.python-requests.org/en/master 安装方法 命令行下输入:pip3 install requests.详见:https://www.cnbl ...