ehcache, memcached 및 기타 키-값 저장소에 대한 액세스를 동기화하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1436483

문제

내 이해에 따르면 다음 각 방법은 다음과 같습니다. get() 그리고 put() 원자적이다.

그러나 ehcache 및 memcached와 같은 캐시에 액세스할 때 CheckThenAct 패션, 경쟁 조건이 발생합니다.

thread1이 다음을 수행하는지 확인하기 위해 무엇을 동기화해야 합니까? Get() 그리고 thread2는 Get() 그 다음에 Put(), 그 첫 번째 Get() 에 의해 추가된 새로운 가치를 받게 됩니다. thread2 ?

도움이 되었습니까?

해결책

이러한 상황을 처리하는 방법은 여러 위치에서 쓰기를 캐시하지 않거나 다른 방식으로 액세스를 제어하는 ​​것입니다.

이에 대한 간단한 해결책은 클라이언트에서 캐시에 쓰기를 수행하지 않는 것입니다.대신 값을 업데이트하려면 값을 업데이트하라는 요청을 실행합니다.해당 값이 다른 곳에서 검색되면 잘 작동할 수 있습니다.계산되었거나 클라이언트에서 나온 경우에는 더 문제가 될 수 있습니다.

적어도 PHP 세계에서는 Memcache와 함께 사용하는 일반적인 구성 요소는 분산 작업 대기열 프로세서인 beanstalkd입니다.이 시나리오에서는 작업 단위로 "업데이트 캐시" 요청을 실행할 수 있습니다.

기존 값을 입력으로 사용하는 캐시 항목에 대한 작업을 수행하거나 get-then-update가 원자적 작업이 아닌 경우 경쟁 조건을 도입하는 다른 방법은 작업 단위를 만드는 것입니다. 여기에는 이전 값과 새 값이 포함됩니다.이렇게 하면 업데이트를 처리하는 프로세스가 무엇이든 현재 값이 예상 값이 아닌 상황을 무효화하거나 처리할 수 있습니다.

증가 및 감소는 memcached 인터페이스에 의해 처리되므로 액세스가 해당 유형인 경우(또는 해당 종류의 작업으로 축소될 수 있는 경우) 문제도 해결됩니다.

다른 팁

MemCached의 경우 다른 작업이 데이터를 업데이트하지 않았는지 put ()를 수행하기 전에 CAS () 작업을 사용하여 확인할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top