Caching 缓存资源重新生成时锁定的设计模式

Caching 缓存资源重新生成时锁定的设计模式,caching,locking,Caching,Locking,这是一个与编程语言无关的问题,因为它涉及到任何开发平台上都可能发生的情况 让我们假设您有一个资源,它以一种基于时间流逝而过期的方式被缓存 该资源将在多线程环境中访问 资源会定期过期,我们只需要一个线程来重新生成缓存,其他线程应该等待并返回第一个线程获取的资源 为了减少开销,我们只希望在资源过期时执行资源锁定,从而允许无锁缓存读取 我想知道是否有一个共同的设计模式来处理这种情况 以下是我试图解决此问题的伪代码: // check for resource. If it exists return

这是一个与编程语言无关的问题,因为它涉及到任何开发平台上都可能发生的情况

  • 让我们假设您有一个资源,它以一种基于时间流逝而过期的方式被缓存
  • 该资源将在多线程环境中访问
  • 资源会定期过期,我们只需要一个线程来重新生成缓存,其他线程应该等待并返回第一个线程获取的资源
  • 为了减少开销,我们只希望在资源过期时执行资源锁定,从而允许无锁缓存读取
  • 我想知道是否有一个共同的设计模式来处理这种情况

    以下是我试图解决此问题的伪代码:

    // check for resource. If it exists return it.
    if(inCache()) {
        return getCachedResource();
    }
    
    // resource has expired, sychronize users so only 
    // one executes the following block at a time
    lock {
        // check if a previous request re-cached the resource
        if (inCache()) {
            return getCachedResource();
        }
    
        // get the resource
        getResource();
        return getCachedResource();
    }
    

    有没有更好的办法来解决这个问题?是否还有我可能没有考虑的其他问题?

    我认为您不需要在锁块内部进行inCache()检查。另一个请求不能添加到缓存中,对吗?(该块是同步的)该块是同步的,但一旦第一个请求完成,等待锁的第二个请求将在该块内执行代码,从而使其再次被缓存。当第一个请求仍在进行重新缓存时,如果有多个请求传入,则始终会发生这种情况。当然,您是对的。嗯。很抱歉