我需要实时更改我应用的会话范围。我的应用中的每个会话用户都有类似的结构:
session.user =
{
name = "Foo",
mojo = "100"
};
用户可以修改彼此的“魔力”。例如,如果用户Foo
收到10
mojo积分,而他现在有110,我需要更新他的session.user.mojo
以反映收到的额外“mojo”。换句话说,我需要修改他的会话结构。
示例2: session 1
中的用户执行session 2
中的用户收到“mojo”的内容。需要更新会话2中的session.user.mojo
以反映此更改。
一些信息:
当用户登录时,从数据库中提取初始mojo值并存储在会话中。
“Mojo”更新始终在数据库中进行。存储在会话中的“Mojo”用于管理用户权限。
我有什么选择?这甚至可能吗?我完全不知道如何做那样的事情。
更新我不希望将更新后的值传回给用户(当用户在页面之间导航时,数据会刷新)。我只想在适当的用户会话范围内更改它们。
答案 0 :(得分:2)
这个答案特定于ColdFusion 9。
按用户ID缓存用户数据(例如cachePut()
),并在会话中跟踪其用户ID。对mojo
的每次更新都应检索缓存中的用户数据(如果存在),并在那里进行更新。最后,如果这是一个多服务器环境,则在广播任何更改的用户ID的计算机之间设置消息传递mojo
,接收该消息的服务器然后更新它们自己的高速缓存用户数据。
这给你带来的是限制正在进行的数据库活动的数量,非常好的活跃性,并使mojo
值在全球范围内可用,这具有可用于除用户会话以外的目的的额外好处(例如,另一个用户可以查看他们的个人资料以查看mojo
分数。
答案 1 :(得分:1)
如果您确实需要在特定会话中更改变量,则没有内置方法可以做到这一点。也许你可以抽象出逻辑,而不是从Session访问mojo
,总是从DB访问mojo
?
更新:为什么会话?如何在Application范围中使用大结构,并使用userID或sessionID作为键,并使用mojo
作为值?您还可以存储lastUpdated
之类的时间戳,并删除尚未更新的时间段以回收您的记忆。那么,不时更新你的数据库?或者......如果您担心性能,请更新您的数据库异步。