好吧我有点不确定如何最好地命名这个问题:)但假设这个情况,你 出去,并提取一些网页(与各种网址),并在本地缓存。即使使用多线程,缓存部分也很容易解决。并发缓存共享的模式
但是,想象一个线程开始提取一个url,几毫秒后又想获得相同的url。有没有什么好的模式让第二个线程的方法等待第一个方法获取页面,将它插入到缓存中并返回,以便不必执行多个请求。即使对于需要大约300-700毫秒的请求,开销也不够大,值得做。而如果没有经过对方锁定为其他URL
基本上请求时,对于相同的URL的请求进来紧密我想第二个请求,以“搭便车”的第一个请求
我有一本字典,你的一些松散的想法当您开始获取页面并锁定页面时,插入一个带有密钥的对象作为url。如果已经有任何匹配的键,它将获得该对象,锁定该对象,然后尝试获取实际缓存的url。
我有点不确定的详情然而,使其真正线程安全的,使用ConcurrentDictionary可能是它的一个组成部分......
是否有这样的情况下任何共同的模式和解决方案?
击穿错误的行为:
线程1:检查高速缓存,它不存在,所以开始取的URL
线程2:开始取相同的URL,因为它仍然在缓存
不存在线程1:完成的,并插入到缓存中,返回页
线程2:表面处理,并且还插入到高速缓冲存储器(或丢弃),返回页
击穿正确的行为:
线程1:检查高速缓存,它不存在这样开始取的URL
线程2:想相同的URL,但看到它目前正在取出等线程1
等待线程1:成品,并插入到缓存中,返回页面
线程2:注意到线程1结束,返回页主题1它取
编辑
大多数解决方案中辛勤似乎误解了问题,只有解决了高速缓存,因为我说的是心不是问题,问题做一个外部网络时,取使第二取是前首先完成一个缓存了它使用第一个的结果而不是第二个
我的回答*确实*解决您在编辑中提出的问题。 – LukeH 2010-12-09 09:59:32
@Luke,你目前的解决方案似乎确实是我正在寻找的,谢谢!我将等待几个小时的任何替代解决方案,然后我将结束这个问题 – Homde 2010-12-09 11:10:47
您是否考虑过一种解决方案,您将使用某种同步字典(例如ConcurrentDictionary),并将url作为关键字,以及类似IAsyncResult的内容值?如果线程2尝试获取线程1当前正在下载的页面,则只需等待IAsyncResult,直到它完成并获取页面内容(IAsyncResult可能不是正确的选择,但是您可以获得理念...)。 – Mike 2010-12-11 01:36:30