在我们网站的可定制首页上,我们为用户提供了显示最近更新内容的模块的选项,从 100 多个模块中进行选择。
所有数据都是由 MySQL 查询生成的,其结果通过 memcached 进行缓存。我们当前的系统是这样工作的:当用户加载包含模块的页面时,模块会立即从缓存中为他们提供数据,并且查询被添加到队列中以由单独的 gearman 进程更新(这样页面加载不会不要等待mysql查询)。然后,该查询每 15 分钟运行一次以刷新缓存中的数据。查询队列本身会定期清除,这样我们就不会不断刷新最近未请求的数据。
问题是由于某种原因,当缓存为空时该怎么办。这种情况不会经常发生,但是当它发生时,当前会向用户显示一个空模块,并且在 gearman 进程中刷新数据,以便稍后,当相同(或不同)用户重新加载页面时,是要显示的数据。
我们的流量是这样的,如果我们试图在缓存为空时为用户实时运行查询,我们将遇到一个严重的标记问题——我们将多次运行相同(可能很慢)的查询许多用户加载了该页面。有没有什么办法可以解决“空白模块”的问题,又不造成踩踏风险?