代码之家  ›  专栏  ›  技术社区  ›  Jaigus

如何存储会话对象?

  •  1
  • Jaigus  · 技术社区  · 13 年前

    我有几个模型类,比如一个用户类,它传递了一个字典,并包装它提供了各种方法,其中一些方法在需要更改值时与数据库通信。字典本身是由sqlalchemy RowProxy创建的,因此它的所有键实际上都是直接从sql用户表中获取的属性名称。(属性包括user_id、用户名、电子邮件、密码等)

    如果一个用户登录了,我应该简单地将这个字典保存到redis键值存储中,并在需要时简单地调用一个新的用户对象并从redis传递这个字典吗?

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

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

    2 回复  |  直到 13 年前
        1
  •  4
  •   Michael Merickel    13 年前

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

        2
  •  0
  •   Community Mohan Dere    5 年前

    +1关于迈克尔的回答。

    我还要注意几件事-

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

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

    /大量写入操作,数据必须是最新的 /其他一切-主要是读取操作,数据应该是最新的

    /account中的所有内容都会进入数据库以获取最新版本。网站的其余部分可能会进入数据库或缓存-我不在乎。

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

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

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

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

    …值(名称=“d”)

    …)

    为什么不这样做:

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