我正在尝试实现 Mondrian SegmentCache
。缓存将由运行 Mondrian 库的多个 JVM 共享。我们使用 Redis 作为后备存储,但是就这个问题而言,任何持久键值存储都应该没问题。
stackoverflow 社区会帮助完成这个实现吗?文档和 Google 搜索没有提供足够详细的信息。开始了:
new SegmentCache {
private val logger = Logger("my-segment-cache")
import logger._
import com.redis.serialization.Parse
import Parse.Implicits.parseByteArray
private def redis = new RedisClient("localhost", 6379)
def get(header: SegmentHeader): SegmentBody = {
val result = redis.get[Array[Byte]](header.getUniqueID) map { bytes ⇒
val st = new ByteArrayInputStream(bytes)
val o = new ObjectInputStream(st)
o.readObject.asInstanceOf[SegmentBody]
}
info(s"cache get\nHEADER $header\nRESULT $result")
result.orNull
}
def getSegmentHeaders: util.List[SegmentHeader] = ???
def put(header: SegmentHeader, body: SegmentBody): Boolean = {
info(s"cache put\nHEADER $header\nBODY $body")
val s = new ByteArrayOutputStream
val o = new ObjectOutputStream(s)
o.writeObject(body)
redis.set(header.getUniqueID, s.toByteArray)
true
}
def remove(header: SegmentHeader): Boolean = ???
def tearDown() {}
def addListener(listener: SegmentCacheListener) {}
def removeListener(listener: SegmentCacheListener) {}
def supportsRichIndex(): Boolean = true
}
一些直接的问题:
- 是
SegmentHeader.getUniqueID
在缓存中使用的适当密钥吗? - 应该如何
getSegmentHeaders
实施?上面的当前实现只是抛出一个异常,蒙德里安似乎从未调用过。我们如何让 SegmentCache 在启动时重用已有的缓存记录? - 如何使用
addListener
以及如何removeListener
使用?我认为它们与协调共享缓存的节点之间的缓存更改有关。但是怎么做? - 应该
supportsRichIndex
返回什么?一般来说,实现 a 的人如何SegmentCache
知道要返回什么值?
我觉得这些是文档中应该涵盖的基本问题,但它们不是(据我所知)。也许我们可以纠正这里缺少可用信息的问题。谢谢!