2

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

问题是,当它们的值在数据库中被修改时,过期的缓存条目会对性能产生巨大的影响。如果许多请求同时请求一个刚刚过期的条目,那么每个请求都会访问数据库一次。

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

你会如何解决这个问题?

4

1 回答 1

0

我自己也遇到过这种情况。这里的解决方案不是让缓存过期,而是更新它。当使用新内容更新数据库时,更新缓存。瞧,没有比赛条件。如果更新失败(或需要几秒钟),您的数据库将不会因尝试抓取未缓存的数据而受到重创,因为它将有旧的缓存可供使用。:)

编辑:

为了解决线程相互竞争的问题,您需要合并某种互斥锁。你自然会使用适用于你的语言的东西。

基本上,这是互斥的。

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

这是一个例子:

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

  1. 添加互斥锁。
  2. 更新数据库。
  3. 更新缓存。
  4. 解锁互斥锁。
于 2013-01-14T21:14:53.610 回答