如何存储会话对象?

时间:2012-09-06 02:42:42

标签: python session sqlalchemy session-state pyramid

我有一些模型类,例如传递字典的用户类,并包装它提供各种方法,其中一些方法在需要更改值时与数据库通信。字典本身是由sqlalchemy RowProxy构成的,因此它的所有键实际上都是直接从sql用户表中获取的属性名。 (属性包括user_id,username,email,passwd等)

如果用户已登录,我是否应该将此字典保存到redis键值存储,并在需要时简单地调用新的用户对象并从redis传递此字典(这应该比仅保存用户ID更快)在会话中并基于该user_id从db再次加载值)?

或者我应该以某种方式序列化整个对象并将其保存在redis中?我很感激任何管理模型和会话对象的替代方法,你们认为这些方法也会更好。

如果有人想知道我只使用sqlalchemy表达式语言,而不是orm。我正在使用模型类作为接口,并对其进行编码。

2 个答案:

答案 0 :(得分:4)

除非你非常小心,否则将整个对象序列化为redis会导致问题。您有效地将其视为缓存,因此如果用户更改了自己的内容,您必须小心这些值已过期。您还必须确保所有值都可序列化(可能通过pickle)。您没有指定这是否是一个过早的优化,所以我想说它可能是并且建议您只需跟踪用户ID并在需要时从数据库重新加载他的信息。

答案 1 :(得分:0)

迈克尔回答+1。

我还会注意到一些事情 -

如果您决定缓存此数据,则应将其视为只读存储。你永远不应该基于此更新数据库。

我的项目分为两个逻辑部分:

/ account - 重写操作,数据必须是最新的    / everything-else - 主要是读取操作,数据应该是最新的

/ account中的所有内容始终会在数据库中找到最新版本。该网站的其余部分可以访问数据库或缓存 - 我不在乎。

根据您描述的需求,使用表达式语言,您不需要从缓存数据创建对象来执行任何操作。

http://docs.sqlalchemy.org/en/rel_0_7/core/tutorial.html#inserts-and-updates

  

>>> conn.execute(users.update()。

     

... where(users.c.name =='jack')。

     

... values(name ='ed')

     

...)

为什么不这样做:

  

其中(users.c.id == cached_value)