1

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

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

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

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

4

2 回答 2

4

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

于 2012-09-07T15:17:05.047 回答
0

+1 对迈克尔的回答。

我还要注意一些事情-

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

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

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

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

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

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

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

...其中(users.c.name=='jack')。

...值(名称='ed')

... )

为什么不这样做:

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

于 2012-09-07T15:38:20.423 回答