Redis 테이블 엔진
Redis 테이블 엔진
이 엔진은 ClickHouse를 Redis와 통합할 수 있게 해줘요. Redis는 kv 모델을 사용하므로 포인트 방식으로만 조회할 것을 강력히 권장해요. 예: where k=xx 또는 where k in (xx, xx).
출처: 문서
본문
테이블 생성하기
CREATE TABLE [IF NOT EXISTS] [db.]table_name
(
name1 [type1],
name2 [type2],
...
) ENGINE = Redis({host:port[, db_index[, password[, pool_size]]] | named_collection[, option=value [,..]] })
PRIMARY KEY(primary_key_name);
엔진 매개변수
host:port— Redis 서버 주소. 포트를 생략하면 기본 Redis 포트 6379가 사용돼요db_index— Redis db 인덱스. 0에서 15 사이, 기본값은 0password— 사용자 비밀번호. 기본값은 빈 문자열pool_size— Redis 최대 연결 풀 크기. 기본값은 16primary_key_name— 컬럼 목록의 아무 컬럼 이름
PRIMARY KEY는 하나의 컬럼만 지원해요. 기본 키는 Redis 키로 이진 직렬화돼요. 기본 키 외 다른 컬럼들은 해당 순서대로 Redis 값으로 이진 직렬화돼요. SELECT * FROM redis_table 같은 전체 스캔은 선택한 Redis 데이터베이스에 ClickHouse가 쓰지 않은 키나 값이 포함되어 있으면 이진 역직렬화 오류로 실패할 수 있어요.
인자는 named collections로도 전달할 수 있어요. 이 경우 host와 port를 별도로 지정해야 해요. 이 접근 방식은 프로덕션 환경에 권장돼요. 현재로서는 named collections로 redis에 전달되는 모든 매개변수가 필수예요.
key equals 또는 in filtering이 있는 쿼리는 Redis에서 다중 키 조회로 최적화돼요. 필터링 키가 없는 쿼리는 전체 테이블 스캔이 발생하는데 이는 무거운 연산이에요.
사용 예시
Redis 엔진으로 일반 인자를 사용해 ClickHouse에서 테이블 만들기:
Query
CREATE TABLE redis_table
(
`key` String,
`v1` UInt32,
`v2` String,
`v3` Float32
)
ENGINE = Redis('redis1:6379') PRIMARY KEY(key);
또는 named collections 사용:
<named_collections>
<redis_creds>
<host>localhost</host>
<port>6379</port>
<password>****</password>
<pool_size>16</pool_size>
<db_index>0</db_index>
</redis_creds>
</named_collections>
Query
CREATE TABLE redis_table
(
`key` String,
`v1` UInt32,
`v2` String,
`v3` Float32
)
ENGINE = Redis(redis_creds) PRIMARY KEY(key);
삽입:
Query
INSERT INTO redis_table VALUES('1', 1, '1', 1.0), ('2', 2, '2', 2.0);
Query
SELECT COUNT(*) FROM redis_table;
Response
┌─count()─┐
│ 2 │
└─────────┘
Query
SELECT * FROM redis_table WHERE key='1';
Response
┌─key─┬─v1─┬─v2─┬─v3─┐
│ 1 │ 1 │ 1 │ 1 │
└─────┴────┴────┴────┘
Query
SELECT * FROM redis_table WHERE v1=2;
Response
┌─key─┬─v1─┬─v2─┬─v3─┐
│ 2 │ 2 │ 2 │ 2 │
└─────┴────┴────┴────┘
업데이트:
기본 키는 업데이트할 수 없다는 점을 유의해요.
Query
ALTER TABLE redis_table UPDATE v1=2 WHERE key='1';
삭제:
Query
ALTER TABLE redis_table DELETE WHERE key='1';
잘라내기(Truncate):
Redis db를 비동기적으로 flush해요. Truncate는 SYNC 모드도 지원해요.
Query
TRUNCATE TABLE redis_table SYNC;
조인(Join):
다른 테이블과 조인해요.
Query
SELECT * FROM redis_table JOIN merge_tree_table ON merge_tree_table.key=redis_table.key;
제한 사항
Redis 엔진은 where k > xx 같은 스캔 쿼리도 지원하지만 몇 가지 제한이 있어요.
- 스캔 쿼리는 리해싱(rehashing) 중 드물게 일부 중복 키를 만들어낼 수 있어요. 자세한 내용은 Redis Scan 참고
- 스캔 중에 키가 생성·삭제될 수 있으므로 결과 데이터셋이 유효한 특정 시점을 나타내지 못할 수 있어요