ETS(Erlang Term Storage)는 Erlang/OTP(BEAM) 런타임에 직접 내장된 강력한 인메모리 키-값 데이터베이스로, Elixir에서도 네이티브로 직접 제어할 수 있습니다.
🔗 관련 문서: Elixir 프로그래밍 언어 치트시트
테이블 생성 및 기본 조작
# 새로운 이름 기반 테이블 생성
table = :ets.new(:user_cache, [:set, :public, :named_table])
# 튜플 데이터 삽입
:ets.insert(:user_cache, {:user_1, "Alice", 30})
:ets.insert(:user_cache, {:user_2, "Bob", 25})
# 키를 통한 레코드 조회
result = :ets.lookup(:user_cache, {:user_1})
# => [{:user_1, "Alice", 30}]
# 특정 레코드 삭제 또는 전체 데이터 삭제
:ets.delete(:user_cache, :user_1)
:ets.delete_all_objects(:user_cache)
# 메모리에서 테이블 완전 제거
:ets.delete(:user_cache)
테이블 유형 (Table Types)
생성 옵션을 통한 테이블 동작 방식 설정:
| Type | Duplicate Keys | Ordering | Notes |
|---|---|---|---|
:set |
No | Unordered | 기본 테이블 유형; 첫 번째 요소가 키; 순서 없음 |
:ordered_set |
No | Ordered | Erlang 항 순서로 키 정렬; O(log N) 검색 속도 |
:bag |
Yes | Unordered | 동일 키 중복 허용, 완전 동일 튜플은 불허 |
:duplicate_bag |
Yes | Unordered | 완전 동일 튜플 중복 삽입 허용 |
접근 권한 제어 (Access Controls)
:protected: 모든 프로세스가 읽기 가능, 소유자 프로세스만 쓰기 가능 (기본값).:public: 모든 프로세스가 동시 읽기 및 쓰기 가능.:private: 소유자 프로세스만 읽기 및 쓰기 가능.
:ordered_set 키 순회 (Traversal)
# 키 탐색 함수
first_key = :ets.first(:user_cache)
next_key = :ets.next(:user_cache, first_key)
prev_key = :ets.prev(:user_cache, next_key)
last_key = :ets.last(:user_cache)