我正在开发在线考试软件,成千上万的学生可以同时从他们的大学/学校进行在线考试。因此,考虑到并发命中和服务器性能,我发现了存储一些考试相关数据的不同和最佳方式:
在申请中,每个学生将随机获得问题。我想在session
中存储学生明智的问题,但我担心在session
中存储如此大的(问题选项)数据。
考虑一个场景,让每个学生都有30个问题,在一个插槽中,有10k学生在那里。那么session
对象会变得太大,不是吗?
还有一些与考试相关的设置/配置我想做好准备(我不想每次都从DB中获取配置)。
答案 0 :(得分:1)
考虑一个场景,让每个学生都有30个问题,并在单个插槽中10k学生......
我想有些学生会得到同样的问题。如果你真的有300k不同的问题,你现在可以停止阅读。
在申请中,每个学生都会随机。我想在会议中存储学生明智的问题
我猜你不需要存储任何东西。生成单个随机masterSeed
,获取studentId
,然后计算seed = secureHash(masterSeed, studentId)
。使用此seed
选择问题。如果需要,请重新计算。
关于存储问题,像往常一样使用数据库和缓存,忘记会话。
“你能否提供一些使用种子和缓存选择问题的更多曝光”的答案是“实际上没有”。为什么呢?
无论OP用于选择问题的随机算法是什么,都与我的上述提议相同。只需创建new Random(seed)
(种子来自上方)并运行相同的算法。 1
Web和数据库服务器所能提供的所有缓存魔法,也适用于此处。我的观点是通过将问题存储在会话中没有任何好处。恰恰相反:
所以你有更多的IO(可以简单地丢弃缓存的数据),更多的内存消耗,并且如果它在不同的机器上运行,你就无法使用数据库服务器的内存。
1 如果算法不是非常随机并且试图为彼此相邻的学生选择不同的问题,这会变得复杂,但这是一个不同的问题。