除了会话以外的任何其他选项来保存spring MVC应用程序中的数据

时间:2014-01-16 19:22:24

标签: java performance session spring-mvc

我正在开发在线考试软件,成千上万的学生可以同时从他们的大学/学校进行在线考试。因此,考虑到并发命中和服务器性能,我发现了存储一些考试相关数据的不同和最佳方式:

在申请中,每个学生将随机获得问题。我想在session中存储学生明智的问题,但我担心在session中存储如此大的(问题选项)数据。

考虑一个场景,让每个学生都有30个问题,在一个插槽中,有10k学生在那里。那么session对象会变得太大,不是吗?

还有一些与考试相关的设置/配置我想做好准备(我不想每次都从DB中获取配置)。

1 个答案:

答案 0 :(得分:1)

  

考虑一个场景,让每个学生都有30个问题,并在单个插槽中10k学生......

我想有些学生会得到同样的问题。如果你真的有300k不同的问题,你现在可以停止阅读。

  

在申请中,每个学生都会随机。我想在会议中存储学生明智的问题

我猜你不需要存储任何东西。生成单个随机masterSeed,获取studentId,然后计算seed = secureHash(masterSeed, studentId)。使用此seed选择问题。如果需要,请重新计算。

关于存储问题,像往常一样使用数据库和缓存,忘记会话。

请求有关问题选择的详细信息

“你能否提供一些使用种子和缓存选择问题的更多曝光”的答案是“实际上没有”。为什么呢?

  • 无论OP用于选择问题的随机算法是什么,都与我的上述提议相同。只需创建new Random(seed)(种子来自上方)并运行相同的算法。 1

  • Web和数据库服务器所能提供的所有缓存魔法,也适用于此处。我的观点是通过将问题存储在会话中没有任何好处。恰恰相反:

    • 存储在会话中的数据是“脏的”,服务器必须在内存不足的情况下序列化它们。
    • 每当两个学生的同一个问题被反序列化时,你有两个不同的数据,占用的内存是以前的两倍。

所以你有更多的IO(可以简单地丢弃缓存的数据),更多的内存消耗,并且如果它在不同的机器上运行,你就无法使用数据库服务器的内存。


1 如果算法不是非常随机并且试图为彼此相邻的学生选择不同的问题,这会变得复杂,但这是一个不同的问题。