如何将数据推送到用户会话?

时间:2011-05-27 00:56:14

标签: coldfusion

我需要实时更改我应用的会话范围。我的应用中的每个会话用户都有类似的结构:

session.user = 
{
   name = "Foo",
   mojo = "100"
};

用户可以修改彼此的“魔力”。例如,如果用户Foo收到10 mojo积分,而他现在有110,我需要更新他的session.user.mojo以反映收到的额外“mojo”。换句话说,我需要修改他的会话结构。

示例2: session 1中的用户执行session 2中的用户收到“mojo”的内容。需要更新会话2中的session.user.mojo以反映此更改。

一些信息:

  1. 当用户登录时,从数据库中提取初始mojo值并存储在会话中。

  2. “Mojo”更新始终在数据库中进行。存储在会话中的“Mojo”用于管理用户权限。

  3. 我有什么选择?这甚至可能吗?我完全不知道如何做那样的事情。

    更新我不希望将更新后的值传回给用户(当用户在页面之间导航时,数据会刷新)。我只想在适当的用户会话范围内更改它们。

2 个答案:

答案 0 :(得分:2)

这个答案特定于ColdFusion 9。

按用户ID缓存用户数据(例如cachePut()),并在会话中跟踪其用户ID。对mojo的每次更新都应检索缓存中的用户数据(如果存在),并在那里进行更新。最后,如果这是一个多服务器环境,则在广播任何更改的用户ID的计算机之间设置消息传递mojo,接收该消息的服务器然后更新它们自己的高速缓存用户数据。

这给你带来的是限制正在进行的数据库活动的数量,非常好的活跃性,并使mojo值在全球范围内可用,这具有可用于除用户会话以外的目的的额外好处(例如,另一个用户可以查看他们的个人资料以查看mojo分数。

答案 1 :(得分:1)

如果您确实需要在特定会话中更改变量,则没有内置方法可以做到这一点。也许你可以抽象出逻辑,而不是从Session访问mojo,总是从DB访问mojo

更新:为什么会话?如何在Application范围中使用大结构,并使用userID或sessionID作为键,并使用mojo作为值?您还可以存储lastUpdated之类的时间戳,并删除尚未更新的时间段以回收您的记忆。那么,不时更新你的数据库?或者......如果您担心性能,请更新您的数据库异步。