gpt4 book ai didi

java - 使用 MapMaker#makeComputingMap 防止同一数据同时发生 RPC

转载 作者:行者123 更新时间:2023-11-30 05:58:45 30 4
gpt4 key购买 nike

我们有一台缓慢的后端服务器,正在被负载压垮,并且我们希望中间层 Scala 服务器对于每个唯一的查找只有一个对后端的未完成请求。

后端服务器只存储不可变的数据,但当有新数据添加时,中间层服务器会代表客户端请求最新数据,后端服务器会遇到负载困难。不可变数据使用写入时生成的唯一键缓存在 memcached 中,但写入速率很高,因此我们得到的 memcached 命中率较低。

我的一个想法是使用 Google Guava 的 MapMaker#makeComputingMap() 来包装实际的查找,在 ConcurrentMap#get() 返回后,中间层将保存结果并从 Map 中删除键。

这似乎有点浪费,尽管代码很容易编写,请参阅下面的示例来说明我的想法。

是否有更自然的数据结构、库或 Guava 的一部分可以解决这个问题?

import com.google.common.collect.MapMaker

object Test
{
val computer: com.google.common.base.Function[Int,Long] =
{
new com.google.common.base.Function[Int,Long] {
override
def apply(i: Int): Long =
{
val l = System.currentTimeMillis + i
System.err.println("For " + i + " returning " + l)
Thread.sleep(2000)
l
}
}
}

val map =
{
new MapMaker().makeComputingMap[Int,Long](computer)
}

def get(k: Int): Long =
{
val l = map.get(k)
map.remove(k)
l
}

def main(args: Array[String]): Unit =
{
val t1 = new Thread() {
override def run(): Unit =
{
System.err.println(get(123))
}
}

val t2 = new Thread() {
override def run(): Unit =
{
System.err.println(get(123))
}
}

t1.start()
t2.start()
t1.join()
t2.join()

System.err.println(get(123))
}
}

最佳答案

我不知道你为什么要自己实现删除,为什么不简单地使用弱值或软值并让 GC 为你清理?

new MapMaker().weakValues().makeComputingMap[Int, Long](computer)

关于java - 使用 MapMaker#makeComputingMap 防止同一数据同时发生 RPC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4038949/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com