2016-08-18 2 views
0

config.yml 파일에서 DoctrineCacheBundle에 대한 여러 네임 스페이스를 설정할 수 있음을 알고 있습니다. 하지만 하나의 드라이버를 사용할 수 있지만 여러 개의 네임 스페이스를 사용할 수 있습니까?DoctrineCacheBundle에서 여러 네임 스페이스를 사용하는 방법 cacheDriver?

내 경우에는 모든 항목에 대한 모든 쿼리를 캐시하고 싶습니다. 문제는 생성/업데이트 작업을하면서 캐시를 비우는 것입니다. 내 캐시 된 쿼리의 일부만 플러시하고 싶습니다. 내 앱은 여러 클라이언트에서 사용됩니다. 예를 들어 기사 엔터티에서 클라이언트가 자신의 데이터에서 sth을 업데이트하면이 클라이언트에 대해서만 캐시를 지우고 싶습니다. 각 쿼리에 대해 적절한 ID를 추가하고 수동으로 제거 할 수 있지만 쿼리는 동적으로 사용됩니다. 내 API 모바일 애플 리케이션에서 DB가 데이터를 반환해야하는 버전 번호를 보내면 결국 어떤 종류의 ID가 사용되는지 알 수 없습니다.

답변

1

불행히도 당신이하고 싶은 것이 어떤 구성 마법으로 해결 될 수 있다고 생각하지 않습니다. 일종의 인덱싱 된 캐시를 원한다면 더 강력한 도구를 찾아야합니다.

doctrines second level cache을 살펴볼 수 있습니다. 지금은 얼마나 좋은지 모르겠다. (베타 버전이었을 때 한 번 시도해 봤지만 나에게 상처를주지 않았다.)

또는 자신 만의 캐시 관리자를 만들 수 있습니다. 당신이 redis를 사용하는 것이 좋습니다. 데이터 구조는 인덱스를 유지하는 데 도움이됩니다 (memcached로 시뮬레이션 할 수 있지만 더 많은 작업이 필요합니다). 나는 인덱스에 의해 무엇을 했는가.

키는 client_1_articles와 같을 것입니다. 여기서 1은 클라이언트 ID입니다. 이 키에는 클라이언트 1의 기사의 모든 ID를 저장합니다. 모든 기사 ID에는 article_x와 같은 키가 있습니다. 여기서 x는 문서의 ID입니다. 이 예제에서 client_1_articles는 클라이언트 1에서 오는 기사의 모든 캐시를 무효화하는 데 도움이되는 기본적인 색인입니다.

위 예제의 추상 구현은 아마도

-composed 인덱스 캐시를 통해 구조 'client_1 : category_1'=> {article_1, article_2} 한 항목의 예에 대한

- 여러 인덱스 'category_1'=> {article_1, article_2, article_3} , 'client_1'=> {article_1, article_3}

-etc.

희망이 어떤 식 으로든 당신을 도울 수 있습니다. 적어도 비슷한 문제에 대한 해결책이었습니다. 프로젝트와

행운을 빌어 요,

Alexandru Cosoi

+0

그래서 당신이 metadata_cache, result_cache, QUERY_CACHE에 대해 다음 쿼리를하는 동안 컨트롤러에 DoctrineCacheBundle 사용할 수 있도록 구성, 예를 SncRedisBundle에 사용할 의미, 캐시 $ 캐시 = $ this-> 컨테이너 -> get ('redis_cache'); $ cache-> save ('article_1', $ article); KEY에서 Redis로이 키를 저장 하시겠습니까? $ redis-> append ('client_1', 'article_1')와 비슷합니다. 그리고 업데이트 할 때 $ redis-> delete (array ('key3', 'key4'))를 사용하여 적절한 키를 제거하십시오. ? – Tom

+0

그런 것, 그렇습니다. 결과 캐시를 원한다면 나는 모른다. 나는 그것에 몇 가지 문제가 있었다. 메타 캐시, 쿼리 캐시 만 사용하며 혼자서 결과 캐시를 처리합니다. –

관련 문제