我一直在考虑一个可能在高负载 Web 服务中遇到的问题,在该服务中,许多进程可以处理请求,并且具有中央缓存。
问题是,当它们的值在数据库中被修改时,过期的缓存条目会对性能产生巨大的影响。如果许多请求同时请求一个刚刚过期的条目,那么每个请求都会访问数据库一次。
您可以在更新数据库时更新缓存以避免这种情况,但现在您有一个竞争条件。
你会如何解决这个问题?
我一直在考虑一个可能在高负载 Web 服务中遇到的问题,在该服务中,许多进程可以处理请求,并且具有中央缓存。
问题是,当它们的值在数据库中被修改时,过期的缓存条目会对性能产生巨大的影响。如果许多请求同时请求一个刚刚过期的条目,那么每个请求都会访问数据库一次。
您可以在更新数据库时更新缓存以避免这种情况,但现在您有一个竞争条件。
你会如何解决这个问题?
我自己也遇到过这种情况。这里的解决方案不是让缓存过期,而是更新它。当使用新内容更新数据库时,更新缓存。瞧,没有比赛条件。如果更新失败(或需要几秒钟),您的数据库将不会因尝试抓取未缓存的数据而受到重创,因为它将有旧的缓存可供使用。:)
编辑:
为了解决线程相互竞争的问题,您需要合并某种互斥锁。你自然会使用适用于你的语言的东西。
基本上,这是互斥的。
您锁定了部分逻辑,其他线程必须等待。这样可以避免数据损坏。
这是一个例子:
一些线程想要更新数据库: