2016-08-21 3 views
5

새로운 Elixir 프로젝트에서 사용자 검색을 위해 Erlang의 ETS를 캐시로 사용할 것을 고려하고 있습니다. 사용자 입력을 기반으로 시스템은 비싼 타사 API를 사용하여 조회를 수행합니다.ETS 스토리지의 성장을 제한하십시오.

동일한 사용자 입력에 대해 중복 호출을 피하기 위해 외부 API 앞에 캐시 계층을 추가하려고합니다. ETS는이를위한 좋은 옵션처럼 보입니다. 그러나 사용자 입력의 변형에는 제한이 없기 때문에 ETS 테이블에 필요한 저장 공간이 제한없이 증가 할 것이라는 우려가 있습니다.

ETS에 대한 저의 독서에서 다른 누구도 ETS의 테이블 크기에 대한 우려를 보지 못했습니다. 이것이 ETS의 비정상적인 사용 사례가 될 수 있기 때문입니까? 언뜻

는 내 취향은 (즉, 삭제) 한계에 도달하면 가장 오래된 항목 ...

가 처리하기위한 공통의 전략이되는 ETS 테이블에있는 항목의 수를 제한하고 거부하는 것 무한대의 ETS 엔트리 수

+0

에게 케이스 결과 첫 페이지, 않거나 일치하는리스트의 크기를 확인 (버퍼를 설정할 수있다 https://www.google.ch/#q=erlang+ets+cache) "erlang ets cache"는 많은 유용한 히트 곡을 제공합니다. –

답변

1

프로덕션에서 EIS 테이블을 redis API가있는 '스마트 무효화 된 캐시'처럼 사용합니다 (SQL WAL 로그와 같은 마스터 - 마스터 복제도 있음).

가장 큰 크기는 ~ 200-300Mb이며 1 백만 개가 넘는 항목이 있습니다. 지난 2 년간 아무런 문제가 없습니다. 내가 한계에 대해 알고 ERL_MAX_ETS_TABLES하지만 크기에 대한 정보를 havn't.

이 테이블에는 특별한 '스마트 색인'이 있습니다. ETS select/match/etc는 테이블의 모든 요소를 ​​전달하기 때문에 느립니다.

0

ets:tab2list(TableId) 함수를 사용하여 ETS 테이블을 공통 목록으로 변환합니다. 그렇게하면 잘 알려진 BIF length(List)으로 목록의 크기를 확인할 수 있습니다. 는 마지막으로, 이제 막 [구글 (패턴에서

관련 문제