2010-07-23 8 views
1

내가 작업하고있는 프로젝트에서 데이터베이스 백엔드가있는 일종의 콜렉션 인 오브젝트가 있습니다. 이 콜렉션이 리턴하는 정확한 결과는 구성에 따라 다르며, 이는 사용자 입력의 수에 따라 달라집니다. 컬렉션의 레코드를 포함하는 페이지의 요소를 AJAX 요청을 통해 동적으로 업데이트 할 수 있습니다. 아이디어는 나를 serialize()이 개체에 발생했습니다 memcache에 저장하고 내 AJAX 호출에 매개 변수로 memcache 키를 포함합니다. 그런 다음 memcahce에서 문자열 unserialize()을 검색하고 컬렉션에서 다음 레코드 집합을 검색합니다.serialize()를 사용하여 여러 요청에서 객체를 유지하는 것이 좋습니다?

이 작업을 수행하려는 오브젝트 지속성의 종류를 얻는 좋은 방법입니까? 그냥 구성을 저장하는 것을 고려했지만, 사용자 컨트롤에 대한 미래의 변화에 ​​직면하여 더 나은 "설정하고 잊어 버리는"솔루션이라고 생각합니다. 필자가 가장 염려하는 점은 serialize로 인해이 솔루션이 견고하고 신뢰할 수 없으며 매우 빠르지 않다는 것을 알지 못하는 일부 함정이있을 수 있다는 것입니다. 그 점에 대해 우려해야합니까?

답변

1

serialize/unserialize는 스칼라로 잘 작동하지만 객체로 작업 할 때 더 문제가 될 수 있습니다. 잠재적 인 함정을 강조하는 두 가지 문제가있었습니다.

개체 속성 중 하나라도 리소스 인 경우이 개체를 serialize 할 수 없습니다. 매직 __sleep 및 __wakeup 메소드를 사용하여 리소스 속성을 완전히 닫고 unserialize 할 때 다시 복원해야합니다.

순환 참조가있는 객체가 컬렉션에 포함되어있는 경우 (예 : cellCollection 객체는 셀 객체의 배열이며 각 객체는 부모 cellCollection 객체를 가리키는 속성을 가짐) 이러한 객체는 직렬화 해제시 완전히 복원되지 않습니다. 각 셀의 부모 개체는 실제로 원래 부모의 복제본이됩니다. __sleep 및 __wakeup은 참된 관계를 복원하는 데 사용되어야합니다 (간단한 작업이 아님).

+0

훌륭한 조언을 주셔서 감사합니다. 객체에는 순환 참조가 없으며 현재 구현에서는 닫아야 할 리소스를 사용하지 않습니다. –

+1

@Mark 순환 참조를 사용하여 비정상적인 동작을 재현 할 수 없습니다. http://codepad.viper-7.com/LtLpkt를 참조하십시오. – Artefacto

+0

그래프를 직렬화 해제 할 때 정의를 사용할 수 있어야합니다. – Artefacto

1

데이터베이스에서 추출한 쿼리보다 직렬화 된 개체가 크고 많은 처리가 적용된 경우 제안하는 것은 실제로 매우 좋은 최적화입니다.

특히 두 참조 : http://code.google.com/p/memcached/wiki/FAQ#Cache_things_other_than_SQL_data! http://www.mysqlperformanceblog.com/2010/05/19/beyond-great-cache-hit-ratio/

둘 다 memcached를 "행 캐시"이상으로 사용하도록 장려합니다.

+0

우리는 잠재적으로 수천 개의 결과에 대해 이야기하고 있으며, 한 번에 10 개씩 표시됩니다. 일부 처리는 검색 후 수행됩니다. –

+0

좋은 소식! memcached에 쓰기 전에 처리 할 수있는 일이 많을수록 페이지를 생성하기 위해 검색하는 객체 수가 적을수록 더 나은 성능을 얻을 수 있습니다. –

관련 문제