ConcurrentHashMap
을 캐시로 사용하는 주식 시장 시뮬레이터를 작성했습니다.고성능 캐시 작성
캐시에는 약 75 개의 요소가 있지만 매우 신속하게 업데이트되고 검색됩니다 (초당 500 회). 여기
내가 무슨 짓을 :
스레드 1 :
주어진 주식 기호에 대한 스트리밍 따옴표로 날을 제공하는 외부 시스템에 연결되었습니다.
2 스레드 (스레드 콜백)까지 데이터
대기는 외부 시스템에 의해 그것으로 전달된다. 데이터를 가져 오면 파싱하고, 불변의 DataEntry 객체를 생성하고, 캐시하고, thread3에 신호를 보냅니다.
스레드 3 (소비자 스레드) : 신호를 수신하면 캐시에서 DataEntry를 검색하여 사용합니다. (이것은 thread2가 thread3에 직접 데이터를 푸시하지 못하게하는 작업의 일부입니다).
public final class DataEntry{
private final String field1;
private final String field2;
//...
private final String field25;
// Corresponding setters and getters
}
public final class Cache{
private final Map<String, DataEntry> cache;
public Cache(){
this.cache = new ConcurrentHashMap<String, DataEntry> (65, 0.75, 32);
}
// Methods to update and retrieve DataEntry from the cache.
}
프로파일 러를 통해 실행 한 후, 나는 내가 많은 DataEntry
개체의를 만드는 오전 것으로 나타났습니다. 그러므로 에덴은 매우 빨리 채워지고 있습니다.
그래서 나는하여 디자인을 약간 조정의 생각입니다 :
A)는 DataEntry
클래스를 변경할 만들기.
b) 캐시를 빈 DataEntry
개체로 미리 채 웁니다.
c) 업데이트가 도착하면 DataEntry
개체를지도에서 검색하고 채 웁니다.
이 방법으로, DataEntry
개체의 수는 일정하고 요소 수와 같습니다.
내 질문은 :이 디자인은 내가 DataEntry
가변함으로써 도입 수있는 동시성 문제가
A)는 않습니다.
b) 캐시를 최적화하기위한 다른 방법이 있습니까?
감사합니다.
초당 백만 번 이상 ConcurrentHasMap에 액세스 할 수 있으며 액세스 할 수있는 경우에는 영향이 없습니다 초당 시간. –
16 개 이상의 코어가 맵에 한 번에 액세스 할 것으로 예상되는 경우 파티션 크기를 늘립니다. 한 번에지도에 액세스하는 4 코어보다 적은 코어를 사용하는 경우 (다른 작업은하지 않음), 그다지 큰 차이는 없을 것입니다. –
에덴이 빨리 채워지는 것이 왜 문제가됩니까? Eden GC로 인해 실제로 문제가 있습니까? – kdgregory