我正在开发在线考试软件,成千上万的学生可以同时从他们的大学/学校进行在线考试。因此,考虑到并发命中率和服务器性能,我正在寻找一种不同的最佳方式来存储与考试相关的数据:
在申请中,每个学生将随机获得问题。我正在考虑将学生明智的问题存储在session
中,但我担心在session
中存储如此大的(问题的选项)数据。
考虑一个场景,让每个学生有30个问题,在一个插槽中有10k个学生。然后session
对象将变得太大,不是吗?
另外,还有一些与考试相关的设置/配置,我想随时准备好(我不想每次都从数据库中获取配置)。
最佳答案
考虑一个场景,让每个学生有30个问题,在一个插槽中有10k个学生...
我想有些学生也会遇到同样的问题。如果您确实有30万个不同的问题,可以立即停止阅读。
在申请中,每个学生将随机获得问题。我正在考虑在会议中存储学生明智的问题
我想您那时不需要存储任何东西。生成一个随机的masterSeed
,取一个studentId
,然后计算seed = secureHash(masterSeed, studentId)
。使用此seed
选择问题。如果需要,请重新计算。
关于存储问题,请照常使用数据库和缓存,而不必担心会话。
请求有关问题选择的详细信息
“您能否提供更多机会了解使用种子和缓存选择问题”的答案是“实际上不是”。为什么?
OP用来选择问题的任何随机算法都将与我的上述建议相同。只需创建new Random(seed)
(种子来自上方)并运行相同的算法即可。1
Web和数据库服务器具备的所有缓存功能也适用于此。我的观点是,将问题存储在会话中没有任何好处。恰恰相反:
会话中存储的数据是“脏”的,如果内存不足,服务器必须对其进行序列化。
每当对两个学生的相同问题进行反序列化时,您就会拥有两个截然不同的数据,它们占用的内存是以前的两倍。
因此,您有更多的IO(可以简单地丢弃缓存的数据),更多的内存消耗,并且如果数据库服务器在另一台计算机上运行,则无法使用该数据库服务器的内存。
1如果算法不是真正随机的,并且试图为坐在彼此旁边的学生选择不同的问题,这可能会变得复杂,但这是一个不同的问题。