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 사이, 기본값은 0
  • password — 사용자 비밀번호. 기본값은 빈 문자열
  • pool_size — Redis 최대 연결 풀 크기. 기본값은 16
  • primary_key_name — 컬럼 목록의 아무 컬럼 이름

PRIMARY KEY는 하나의 컬럼만 지원해요. 기본 키는 Redis 키로 이진 직렬화돼요. 기본 키 외 다른 컬럼들은 해당 순서대로 Redis 값으로 이진 직렬화돼요. SELECT * FROM redis_table 같은 전체 스캔은 선택한 Redis 데이터베이스에 ClickHouse가 쓰지 않은 키나 값이 포함되어 있으면 이진 역직렬화 오류로 실패할 수 있어요.

인자는 named collections로도 전달할 수 있어요. 이 경우 hostport를 별도로 지정해야 해요. 이 접근 방식은 프로덕션 환경에 권장돼요. 현재로서는 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 참고
  • 스캔 중에 키가 생성·삭제될 수 있으므로 결과 데이터셋이 유효한 특정 시점을 나타내지 못할 수 있어요

더 알아보기 (Learn more)