Я пытаюсь реализовать Mondrian SegmentCache
. Кэш должен делиться несколькими JVM, работающими с библиотекой Mondrian. Мы используем Redis в качестве хранилища резервных копий, однако для целей этого вопроса любое постоянное хранилище ключей должно быть прекрасным.Реализация Mondrian shared SegmentCache
Будет ли сообщество 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
? Текущая реализация выше просто выдает исключение и, кажется, никогда не называется Mondrian. Как заставить SegmentCache повторно использовать существующие записи кеша при запуске? - как
addListener
иremoveListener
предназначенный для использования? Я предполагаю, что они имеют какое-то отношение к координации изменений кэша между узлами, использующими кеш. Но как? - что должно
supportsRichIndex
возвращение? В общем, как кто-то, внедряющийSegmentCache
, знает, какую ценность вернуть?
Я чувствую, что это основные проблемы, которые должны быть освещены в документации, но они не являются (насколько я могу найти). Возможно, мы можем исправить отсутствие доступной информации здесь. Благодаря!
Awesome. Благодарим вас за подробный ответ. Я обновлю этот вопрос, как только у меня появятся дополнительные сведения. –
Я пытаюсь сделать что-то подобное, но я в замешательстве. Что вы понимаете под «обновлением локального индекса через слушателя при запуске вашей реализации кэша»? Благодарю. – agilefall
Я имел в виду примерно следующее: https://github.com/webdetails/cdc/blob/master/src/pt/webdetails/cdc/mondrian/SegmentCacheHazelcast.java#L148 – Luc