Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Web services 在分布式web服务中保持缓存温度_Web Services_Language Agnostic_Concurrency - Fatal编程技术网

Web services 在分布式web服务中保持缓存温度

Web services 在分布式web服务中保持缓存温度,web-services,language-agnostic,concurrency,Web Services,Language Agnostic,Concurrency,我一直在思考一个在高负载web服务中可能遇到的问题,其中许多进程都可以处理请求,并且有一个中央缓存 问题是,当数据库中的值被修改时,即将过期的缓存项可能会对性能产生巨大影响。如果多个请求同时请求一个刚刚过期的条目,那么每个请求都会访问数据库一次 您可以在每次更新数据库时更新缓存以避免这种情况,但现在您有了竞争条件 你将如何解决这个问题?我自己也遇到过这种情况。这里的解决方案不是使缓存过期,而是更新它。使用新内容更新数据库时,请更新缓存。瞧,没有比赛条件。如果更新失败(或需要几秒钟),您的数据库将

我一直在思考一个在高负载web服务中可能遇到的问题,其中许多进程都可以处理请求,并且有一个中央缓存

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

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


你将如何解决这个问题?

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

编辑:

为了解决线程之间相互竞争的问题,您需要合并某种类型的。你自然会使用一些适合你的语言的东西

基本上,这是相互排斥

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

这里有一个例子:

某些线程想要更新数据库:

  • 添加互斥锁
  • 更新数据库
  • 更新缓存
  • 解锁互斥锁

  • 如果更新数据库然后缓存,则可能会发生以下情况:线程1更新数据库,线程2更新数据库,线程2更新缓存,线程1更新缓存,缓存已损坏。真正的问题是线程。抱歉没有马上抓住你的问题的全部范围。我会更新一下我的答案。斯宾塞,只有当线程可以共享内存(可能是不同的进程,甚至是不同的机器上)时,你的编辑才能解决这个问题,并引入了另一个问题:如果互斥体在很长时间内没有获得呢?你让你的用户等待吗?如果他们不共享内存,那么也许你可以考虑利用他们所共享的东西。在这种情况下,它们共享一个数据库。您可以使用类似的方法,但是存储一个额外的值来提醒其他线程该值的状态(锁定或解锁)。至于你关于让用户等待的第二点,他们需要等待吗?数据库更新是否会经常发生并且需要很长时间,以致于这会成为一个问题?