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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了缓存放置项目并发和吞吐量相关的知识,希望对你有一定的参考价值。

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

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

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

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

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

答案

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

当服务器收到请求时:

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

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

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

以上是关于缓存放置项目并发和吞吐量的主要内容,如果未能解决你的问题,请参考以下文章

Swift新async/await并发中利用Task防止指定代码片段执行的数据竞争(Data Race)问题

高并发场景下缓存+数据库双写不一致问题分析与解决方案设计

高并发场景下缓存+数据库双写不一致问题分析与解决方案设计

并发编程中经常用到的ConcurrentHashMap

小型电商网站多少并发量合适

浅析数据库与缓存的双写一致性问题