缓存放置项目并发和吞吐量

时间:2017-12-20 12:06:09

标签: caching web redis dns memcached

大多数CDN服务器都使用缓存来访问频繁访问的内容。

情境: 让我们假设有人上传了一张非常热门的图片和许多来自相同位置的用户(1000)试图访问该图片。

问题: 让我们说网络服务器接收请求首先检查它的缓存,它发现该图片的内容未命中并从CDN中提取内容。如果拉取,则说x秒,服务器同时获得999个相同内容请求。

服务器是否会从服务器获取内容999次(因为服务器仍在提取数据且缓存中没有数据)并更新缓存?

如果不是服务器实现的方案,以避免这种情况。

1 个答案:

答案 0 :(得分:0)

您可以在服务器端锁定,以避免对CDN提出过多请求。

当服务器收到请求时:

  1. 工作线程检查密钥是否存在。如果密钥存在,则返回值。
  2. 如果密钥不存在,即缓存未命中,则工作线程会尝试锁定互斥锁。
  3. 如果成功锁定,此工作线程将从CDN获取数据,更新缓存并解锁互斥锁。
  4. 如果此线程无法锁定互斥锁,即某个其他线程正在向CDN发送请求,则它会休眠一段时间,例如: 1秒,然后转到第1步重试整个过程。
  5. 如果您有许多服务器,并且这些服务器之间共享缓存,即多个进程。您可以使用分布式锁定,例如Redis'SETNX

    但是,在这种情况下,您需要注意第3步:如果服务器锁定成功,但在解锁之前崩溃。其他服务器将永远等待。因此,您还需要设置锁定的到期时间。

相关问题