5

我需要跨不同的浏览器/用户会话在服务器上维护全局状态。

我在这里的假设是,当请求进入时创建的所有原子等都是特定于该请求的。一旦返回响应,所有状态都将被销毁并释放内存。如果我错了,请纠正我。

可以使用会话中间件在内存中维护跨特定会话请求的状态。

但是,如何跨多个用户会话和请求维护状态。如果可能的话,我想避免使用 memcached / redis 等在外部存储它。是否有可能在内存本身中实现它?

4

1 回答 1

9

你的意思是你想要在所有会话之间共享的全局状态?

如果这很容易,只需在您喜欢的任何命名空间中声明一个 atom 或 ref ,它将在所有会话中共享,例如:

(def my-state (atom {:foo 1 :bar 2}))

这是因为 Clojure 环境会持续存在,只要应用程序服务器继续运行,并且任何未来的请求都将能够观察/修改全局状态。

说了这么多——值得记住的是, 全局状态通常是一种设计气味。你应该考虑你是否真的需要这个,或者你是否应该考虑一些其他的选择(例如将共享状态推到数据库中)。

于 2012-09-13T10:35:38.393 回答