我一直在思考在高负载web服务中可能遇到的一个问题,其中许多进程可以处理请求,并且具有中央缓存。
问题是,在数据库中修改即将过期的缓存项的值时,可能会对性能产生巨大的影响。如果多个请求同时请求一个刚刚过期的条目,则每个请求都将命中数据库一次。
您可以在每次更新数据库时更新缓存以避免这种情况,但现在您有一个竞争条件。
你将如何解决这个问题?
发布于 2013-01-15 05:14:54
我自己也遇到过这种情况。这里的解决方案不是使缓存过期,而是更新它。当使用新内容更新数据库时,请更新缓存。瞧,没有竞态条件。如果更新失败(或需要几秒钟),您的数据库将不会因为尝试获取未缓存的数据而遭受重创,因为它将有旧的缓存可供回退。:)
编辑:
要解决线程之间相互竞争的问题,您需要合并某种mutex lock。你会很自然地使用一些适用于你的语言的东西。
基本上,这是一种互斥。
您锁定了逻辑的一部分,而其他线程必须等待。这避免了数据损坏。
这里有一个例子:
某个线程想要更新数据库:
添加互斥锁。更新database.
https://stackoverflow.com/questions/14326666
复制相似问题