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

问题描述 投票:1回答:1

大多数CDN服务器对经常访问的内容使用缓存。

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

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

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

如果没有什么方案服务器实现,以避免这种情况。

caching web redis dns memcached
1个回答
0
投票

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

当服务器收到请求时:

  1. 工作线程检查密钥是否存在。如果密钥存在,则返回该值。
  2. 如果密钥不存在,即缓存未命中,则工作线程尝试锁定互斥锁。
  3. 如果成功锁定,此工作线程将从CDN获取数据,更新缓存并解锁互斥锁。
  4. 如果该线程无法锁定互斥锁,即某个其他线程正在向CDN发送请求,则它会休眠一段时间,例如, 1秒,然后转到步骤1重试整个过程。

如果您有许多服务器,并且缓存在这些服务器之间共享,即多个进程。您可以使用分布式锁定,例如Redis'SETNX

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

© www.soinside.com 2019 - 2024. All rights reserved.