Как я могу отправить данные в пользовательский сеанс? - PullRequest
0 голосов
/ 27 мая 2011

Мне нужно вносить изменения в области сеансов моего приложения в режиме реального времени.Каждый пользователь в сеансе в моем приложении имеет подобную структуру:

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

Пользователи могут изменять "mojo" друг друга.Например, если пользователь Foo получил 10 очков mojo, а у него теперь 110, мне нужно обновить его session.user.mojo, чтобы отразить дополнительные полученные "mojo".Другими словами, мне нужно изменить его сессионную структуру.

Пример 2: Пользователь в session 1 делает что-то, где пользователь в session 2 получает "mojo".session.user.mojo в сеансе 2 необходимо обновить, чтобы отразить это изменение.

Некоторая информация:

  1. Начальное значение mojo извлекается избаза данных и сохраняется в сеансе при входе пользователя в систему.

  2. Обновления «Mojo» всегда происходят в базе данных.«Mojo», хранящийся в сеансе, используется для управления привилегиями пользователя.

Какие у меня варианты?Это вообще возможно?Я абсолютно не знаю, как сделать что-то подобное.

ОБНОВЛЕНИЕ Я не хочу передавать обновленные значения обратно пользователю (данные будут обновляться, когда пользователь перемещается между страницами).Я только хочу изменить их в соответствующей области сеанса пользователя.

Ответы [ 2 ]

2 голосов
/ 27 мая 2011

Этот ответ специфичен для ColdFusion 9.

Кэшировать данные пользователя (например, cachePut()) по идентификатору пользователя и отслеживать их идентификатор в сеансе. Каждое обновление до mojo должно извлекать пользовательские данные в кеш - если они есть - и обновлять их там же. Наконец, если это многосерверная среда, настройте обмен сообщениями между машинами, которые передают идентификатор пользователя любого изменения на mojo, серверы, получающие сообщение, затем обновляют свои собственные кэшированные пользовательские данные.

То, что это покупает, ограничивает количество продолжающейся активности базы данных, довольно хорошую жизнеспособность и делает значение mojo доступным глобально, что дает дополнительное преимущество, поскольку оно доступно для целей, отличных от сеанса пользователя (например, другого пользователь может просмотреть свой профиль, чтобы увидеть оценку mojo).

1 голос
/ 27 мая 2011

Если вам действительно нужно изменить переменные в определенном сеансе, для этого нет встроенного способа.Может быть, вы можете абстрагироваться от логики, вместо доступа к mojo из сеанса, всегда обращаться к mojo из БД?

update : зачем сеанс?Как насчет большой структуры в области Application, и использовать userID или sessionID в качестве ключа и mojo в качестве значения?Вы также можете сохранить временную метку, например lastUpdated, и удалить те, которые не были обновлены, чтобы восстановить вашу память.Затем время от времени обновлять вашу БД?Или ... обновите асинхронную базу данных, если вы беспокоитесь о производительности.

...