몬드리안 SegmentCache
을 구현하려고합니다. 캐시는 몬드리안 라이브러리를 실행하는 여러 JVM에서 공유해야합니다. 우리는 Redis를 백업 저장소로 사용하고 있지만,이 질문의 목적을 위해 영구적 인 키 - 값 저장소는 괜찮습니다.몬드리안 공유 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
을 어떻게 구현해야합니까? 위의 현재 구현은 예외를 throw하고 Mondrian에 의해 호출 된 것처럼 보이지 않습니다. SegmentCache를 시작할 때 기존 캐시 레코드를 다시 사용하려면 어떻게해야합니까?addListener
과removeListener
은 어떻게 사용 되나요? 캐시를 공유하는 노드에서 캐시 변경을 조정하는 것과 관련이 있다고 가정합니다. 그러나 어떻게?supportsRichIndex
은 무엇을 반환해야합니까? 일반적으로SegmentCache
을 구현하는 사람은 어떤 값을 반환하는지 알고 있습니까?
나는 이것들이 문서에서 다루어 져야하는 기본 이슈라고 생각하지만, 나는 (내가 알 수있는 한). 아마도 우리는 여기에서 이용 가능한 정보의 부족을 바로 잡을 수 있습니다. 감사!
굉장합니다. 자세한 답변 해 주셔서 감사합니다. 더 많은 정보를 얻으면이 질문을 업데이트 할 것입니다. –
나는 비슷한 것을하려고 노력하고 있지만 혼란 스럽다. 캐시 구현이 시작될 때 리스너를 통해 로컬 인덱스를 업데이트한다는 것은 무엇을 의미합니까? 감사. – agilefall
나는 다음과 같은 것을 의미했다 : https://github.com/webdetails/cdc/blob/master/src/pt/webdetails/cdc/mondrian/SegmentCacheHazelcast.java#L148 – Luc