在分布式Web服务中保持缓存温暖

时间:2013-01-14 21:07:45

标签: web-services language-agnostic concurrency

我一直在考虑在高负载Web服务中可能遇到的问题,其中许多进程可以处理请求,并且具有中央缓存。

事情是,在数据库中修改其值时过期的缓存条目会对性能产生巨大影响。如果许多请求同时请求刚过期的条目,那么每个请求都会为数据库命中一次。

您可以在更新数据库时更新缓存以避免这种情况,但现在您遇到了竞争条件。

你会如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

我自己一直处于这种状况。这里的解决方案不是使缓存失效,而是更新缓存。使用新内容更新数据库时,请更新缓存。瞧,没有竞争条件。如果更新失败(或需要几秒钟),您的数据库将不会因尝试获取未缓存的数据而受到重创,因为它将使旧缓存重新开启。 :)

修改

要解决线程相互竞争的问题,您需要合并某种mutex lock。您自然会使用适合您语言的内容。

基本上,它是相互排斥的。

您锁定了逻辑的一部分,其他线程必须等待。这可以避免数据损坏。

以下是一个例子:

某些线程想要更​​新数据库:

  1. 添加互斥锁。
  2. 更新数据库。
  3. 更新缓存。
  4. 解锁互斥锁。